Compare commits

..
354 Commits
Author SHA1 Message Date
Thijs Wiefferink 769f8ee4ca Set version to 2.5.0, ready for release! 2018-10-20 21:58:14 +02:00
Thijs Wiefferink 2c04b87a9f Add the latest Transifex translations for DE, ES and FR 2018-10-20 21:57:05 +02:00
Thijs Wiefferink 8ce1ed0264 Fix showing /as del and /as add in /help for landlords 2018-10-20 18:36:51 +02:00
Thijs Wiefferink 035f8e1932 Possibly fix default value for areashop.limits.default (documentation is inconsistent for not op) 2018-10-20 18:36:51 +02:00
Thijs Wiefferink 4d3482994f Smaller discord image 2018-10-20 15:53:14 +02:00
Thijs Wiefferink 45f1c510e5 Add link to the AreaShop Discord 2018-10-20 15:49:36 +02:00
Thijs Wiefferink 5c13223b9e Fix for 1.13.1, depend on WorldGuard and WorldEdit 7 beta-01 2018-10-20 14:54:52 +02:00
Thijs Wiefferink 8c47ae9b3c Add README.md files in a couple of packages, closes #128 2018-08-12 16:41:03 +02:00
Thijs Wiefferink 28d03a6a3a Small fixes suggested by Intellij IDEA 2018-08-12 16:23:43 +02:00
Thijs Wiefferink aa585e9b11 Deal with empty date/time settings (handle as 'unlimited'/'disabled')
- Fixes #412
2018-08-12 16:17:02 +02:00
Thijs Wiefferink 36d2ce60b9 Disable copying entities (WorldEdit 7), and enable removing entities (WorldEdit 6)
- Fixes security problem of #273:
    - Throw item into a region
    - Rent/buy the region -> it gets saved as schematic
    - Pick up items
    - Unrent/sell the region -> items appear again
    - Pick up second set of items, they got duplicated
2018-08-11 22:31:15 +02:00
Thijs Wiefferink bdea9448a4 Update WorldEdit 7 to build 3817, update WorldGuard 7 to build 1735 2018-08-11 22:19:25 +02:00
Thijs Wiefferink bd2f40f5c8 Use new schematic format when using WorldEdit 7 2018-08-11 22:18:48 +02:00
Thijs Wiefferink 9e908cee73 Fix getting region by location for WorldGuard 7 2018-08-11 22:17:13 +02:00
Thijs Wiefferink 0d326d973d Fix saving/restoring schematics with WorldEdit 7 2018-08-05 12:23:32 +02:00
Thijs Wiefferink 27eaa27765 Add WorldGuard 7 and WorldEdit 7 support, now 1.13 works
- Closes #411
2018-08-05 00:34:50 +02:00
Thijs Wiefferink fb35153eb2 Pull translations from Transifex 2018-07-22 17:52:25 +02:00
Thijs Wiefferink aec6295516 Remove dependency on javafx 2018-06-17 17:14:23 +02:00
Thijs Wiefferink 38cd77e487 Fix compilation error in the import command 2018-06-01 19:54:02 +02:00
Thijs Wiefferink 6b9866a4c4 Ignore hidden files in the /regions directory (like .DS_Store) 2018-05-29 22:58:15 +02:00
Thijs Wiefferink 5aceb81cfd Import: setup permanent region settings when not rentable and buyable 2018-05-29 22:21:43 +02:00
Thijs Wiefferink 50f6bce64e Fix region limits, thanks @ZachryWilsn for reporting! 2018-05-29 21:59:55 +02:00
Thijs Wiefferink f713edc5b5 Disable moneyback message in /as info if sellDisabled is true 2018-05-26 01:33:23 +02:00
Thijs Wiefferink 012920a51c Cleanups because of Intellij IDEA inspections 2018-05-23 23:46:57 +02:00
Thijs Wiefferink 6154454f96 Indicate if a region has already been added with another world
- Closes #287
2018-05-23 22:53:07 +02:00
Thijs Wiefferink e34daeb5ff Update readme to use issue template selection link 2018-05-23 22:38:12 +02:00
Thijs Wiefferink 0a2dc22c59 Setup issue templates 2018-05-23 22:29:29 +02:00
Thijs Wiefferink 2482bd88c2 Add option to ignore regions for limit calculation
Set `countForLimit` to `false` in default.yml, a group or the region file to ignore it for limits
2018-05-23 22:13:42 +02:00
Thijs Wiefferink e86281ab28 Safer sign update, don't assume location/world still exists 2018-05-12 14:41:45 +02:00
Thijs Wiefferink 5a9ca74b75 Add option to disable selling and reselling your own regions 2018-05-10 20:07:10 +02:00
Thijs Wiefferink d301be2304 Add licence, issues and CI to the root pom file 2018-04-03 22:44:16 +02:00
Thijs Wiefferink a23c6fa66f Hide progress messages of region update, speed up region updates 2018-04-02 20:05:38 +02:00
Thijs Wiefferink cd63517041 Fix list of region names for error indicating missing worlds 2018-04-02 20:00:22 +02:00
Thijs Wiefferink e3043c476b Fix available languages link 2018-04-02 12:10:34 +02:00
Thijs Wiefferink 3be7573863 Parse currency prefix and suffix with InteractiveMessenger
- Allows proper colors and escaping
2018-03-09 11:50:08 +01:00
Thijs Wiefferink 51161fffee Remove unused chunkunload event 2018-03-09 11:08:15 +01:00
Thijs Wiefferink c82067ad0b Add back Paypal donate button 2018-02-17 19:04:18 +01:00
Thijs Wiefferink 46dbb8d22c More customizable metric suffixes, better currency formatting
- 'metricSymbols' section in 'config.yml' to customize the used suffixes for large numbers
- Remove trailing zeros from numbers with metric suffix
- Properly handle rounding of 1.235 to 1.24 (different double to BigDecimal conversion)
- Closes #373
2018-02-12 14:44:48 +01:00
Thijs Wiefferink cace086466 Add UTF8 awareness flag in plugin.yml
- I think it only does something if you use JavaPlugin#getConfig(), but it does not harm either
2018-02-12 12:49:04 +01:00
Thijs Wiefferink 06a716b1fd Make %uuid% available to schematics when selling a region
- Schematic save/restore would happen after removing the owner, which means %uuid% would be null
- Unrenting already does the save/restore before removing the renter, so now it is more consistent
- Thanks to Behoston on Github for reporting the issue
- Closes #383
2018-02-01 13:59:48 +01:00
Thijs Wiefferink 4530717045 Command confirmation for /as import
- Can also be used for all WordEdit based add/delete actions in the future
2018-01-26 16:16:11 +01:00
Thijs Wiefferink 741bbd879f Fix hashCode() of RegionSign 2018-01-26 14:33:27 +01:00
Thijs Wiefferink 8474edd29d Save region name as given to /as add and /as stack
- Previously the WorldGuard region id was used, converting the name to lowercase
2018-01-26 13:55:41 +01:00
Thijs Wiefferink d4df691166 FIx usage of > in javadocs 2018-01-26 12:15:10 +01:00
Thijs Wiefferink 3e247e6cb1 Move sign listeners into SignsFeature
- Fix removing signs not removing it from the signsByChunk map
2018-01-26 12:08:22 +01:00
Thijs Wiefferink f3527134e8 Prevent chunk loading by sign updates
- When sign needs update, only do it if the chunk is already loaded
- If a chunk gets loaded (by a player or something else), update any signs in that chunk
- Improve some javadocs, let checkstyle require @param, @throws and @returns
2018-01-22 18:12:15 +01:00
Thijs Wiefferink 0e14b121b8 InfoCommand: fix showing list of signs (was only showing the first one) 2018-01-22 18:08:16 +01:00
Thijs Wiefferink 8cc632fc05 Pull latest translations from Transifex (automated script) 2018-01-22 16:31:03 +01:00
Thijs Wiefferink 77c1b3f288 Fix error in help message of the import command 2018-01-22 16:10:02 +01:00
Thijs Wiefferink 21339cbf7c Fix incorrect message reference for /as message 2018-01-22 16:07:52 +01:00
Thijs Wiefferink 0351188671 Update live support link 2018-01-21 22:10:02 +01:00
Thijs Wiefferink 47e1d80821 Add live support chat link to 99messages 2018-01-18 16:16:40 +01:00
Thijs Wiefferink 1d0472b052 Improve feedback when placing [as] sign for region that is not added 2017-12-22 12:25:30 +01:00
Thijs Wiefferink 22dcfc76af Fix confirmation messages of /as del (failed refactor)
Thanks Noudux for reporting it!
2017-12-21 18:09:55 +01:00
Thijs Wiefferink 6b59176048 Fix startup error: call init method of the scheduling library 2017-11-27 10:02:51 +01:00
Thijs Wiefferink 5dc4d11408 Fix missing spaces in /as message messages 2017-11-26 23:49:42 +01:00
Thijs Wiefferink 00bd305381 Use Map#putIfAbsent where applicable 2017-11-26 16:01:05 +01:00
Thijs Wiefferink 9daa50b23b Use BukkitDo scheduling library
- Much cleaner code for scheduling tasks,
- Makes proper use of Java 8 functionality
2017-11-26 15:47:51 +01:00
Thijs Wiefferink 33b73a0369 Remove Paypal donate button 2017-11-25 17:07:54 +01:00
Thijs Wiefferink 591540af30 Partially fix problem with importing regions from RegionForSale
- When checking the type of a region AreaShop would only look at the settings of the region, not the settings of the world, parent regions and config.yml
- Checking parent regions for these settings should still be added (requires bigger changes)
2017-11-23 22:54:55 +01:00
Thijs Wiefferink 4e1e50e993 Fix /as linksigns <profile> for configs without signProfiles
The `signProfiles` section is not in the default config.yml file anymore, so getting that section can return null
2017-11-20 09:19:35 +01:00
Thijs Wiefferink 9a52ca3d9b Add missing @return Javadoc for RegionGroup#getAutoRegions() 2017-11-10 00:04:39 +01:00
Thijs Wiefferink 858b019806 Add option to teleport X blocks away from the sign
- Implements #364
- Option `general.teleportSignDistance` to `default.yml` to set the number of blocks to teleport away from the sign
- Changes the pitch/yaw of the player so that he faces the sign
- Handles wall and floor signs in any direction
- Improve SignsFeature code structure
2017-11-09 23:56:18 +01:00
Thijs Wiefferink b1dfe93088 Add RegionForSale import, rental auto-extend and other things
- `/as import RegionForSale`, as requested in #98:
    - Imports all regions from RegionForSale
    - Converts almost all settings to their AreaShop equivalent
    - Handles parent regions
- Add `rent.autoExtend` for use with rental regions to automatically extend the rent when the time is out, start of #29, still need the command
    - Vault compatible permissions plugin is required to let this work while the player is offline
    - All permissions, limits and the player balance are checked as during a normal rent
- Add option to region groups to automatically add all regions of a certain world
- BREAKING: Region events now use OfflinePlayer instead of Player
- Automatically import existing region owners/members when adding a region to AreaShop

There are still a couple of things missing in the import and it needs to be tested a lot.
2017-10-20 13:41:30 +02:00
Thijs Wiefferink 0bf2314f2a Add licence (as already listed on BukkitDev) 2017-10-16 11:56:04 +02:00
Thijs Wiefferink 33ddb8ae88 Fix %volume% for polygon regions
- WorldGuard does not implement volume() for Polygon regions, always returns 0
- Volume result is cached, calculating it for polygon regions could be slow
2017-10-05 16:53:42 +02:00
Thijs Wiefferink 234e4b6261 Prevent indirectly breaking signs with non-solid blocks
- Fixes #358
2017-10-05 13:43:27 +02:00
Thijs Wiefferink ed2ffaeaa3 Move base command to EN.yml for /as info paging 2017-10-05 13:15:51 +02:00
Thijs Wiefferink e073438862 Add %volume% variable to get the number of blocks in a region
- Works properly for polygon regions
2017-10-05 12:20:03 +02:00
Thijs Wiefferink 07194f07da Add region masking to schematic restore
- When restoring a schematic the paste is masked to the region blocks, so that only blocks that are actually inside the region are pasted (necessary for polygon regions)
- Closes #20
2017-10-01 19:49:05 +02:00
Thijs Wiefferink dfa3e0be66 Checkstyle fix 2017-09-04 17:09:31 +02:00
Thijs Wiefferink 8eef029400 Fix %month% variable using 0-11 instead of 1-12
- Fixes #354, thanks skippyaut
2017-09-04 16:58:39 +02:00
Thijs Wiefferink c8d869ce15 Fix usage of teleport location set by '/as settp'
- It was accidentally trying to get the teleport location from the plugin config file instead of the region config file.
- Also added the possibility to set the teleport location in groups and default.yml
2017-08-05 20:25:06 +02:00
Thijs Wiefferink 053d75181d Update to InteractiveMessenger 1.1-SNAPSHOT
- Ensures AreaShop is rebuild when InteractiveMessenger updates
- Fixes crash bug that was in InteractiveMessenger
- Fixes #334
2017-07-30 17:25:49 +02:00
Thijs Wiefferink f0128c221b Update README.md 2017-06-23 14:59:16 +02:00
Thijs Wiefferink ce6c01c5d0 Add Transifex translation stats image 2017-06-23 14:54:19 +02:00
Thijs Wiefferink b835c4dded Only reset WorldGuard flag/groupFlag if not already empty 2017-06-12 22:05:09 +02:00
Thijs Wiefferink 07e6782714 Fix /as setowner for regions that are not rented yet
Add a rental period to the time when setting owner of a rental region that is not rented yet, otherwise it would get expired immediately
2017-06-12 21:58:42 +02:00
Thijs Wiefferink 4002956aeb Fix javadoc comments 2017-06-12 20:42:36 +02:00
Thijs Wiefferink 0b96b9cb42 Github update checker, Java 8
- Add Github update checker, closes #201, it is implemented to allow reuse by other plugins, it will probably move to a separate repository later
- Switch to Java 8, if people did not update already they probably never will
- Add used Bukkit version as property, use that in all pom files
- Add Task class with methods to easily use BukkitRunnable (not all code is migrated to this pattern yet)
2017-06-12 20:39:28 +02:00
Thijs Wiefferink 0c192c2444 Cleanup setOwners/setMembers, only edit WorldGuard region if different
- Improve code layout for changing owners and members of WorldGuard regions
- Only edit flags and other WorldGuard region settings if they are different than the current option, this prevents useless saves in WorldGuard (which shows a message in console)
2017-06-12 20:39:28 +02:00
Thijs Wiefferink 2381aaeacc Remove link to Shop plugin because it is not fixed yet 2017-04-30 14:15:35 +02:00
Thijs Wiefferink 906b331758 Fix line endings in config.yml 2017-04-20 23:35:49 +02:00
Thijs Wiefferink f0f2e09be0 Always add English time indicators
- Internal timers specified using settings in hiddenConfig.yml use the English words, so if you remove the English words from config.yml timers do not run (regions not expiring, no notifications, no file saving)
- Warn in console when an unknown time specifier is found, might get spammy but at least gets the point across
2017-04-20 23:23:57 +02:00
Thijs Wiefferink 395cc6de07 Fix usage of 'resale' in 'default.yml' for 'flagProfile' section
- 'resale' was used instead of 'resell' (as defined in GeneralRegion#RegionState) in the 'flagProfile' section, causing the flags not getting applied when the region is in reselling state.
- Added fallback to 'resale' section if 'resell' section is not present (to properly read old config.yml/default.yml files)
- Fixed usage of '%resaleprice%' in the resale greeting, should be '%resellprice%'
- Fixes #303, thanks electro2560 for the great bug report!
2017-04-20 15:26:26 +02:00
Thijs Wiefferink 3b9d6187ca Fix checkstyle fail 2017-04-17 21:34:32 +02:00
Thijs Wiefferink 9d1585f513 Fix groups file getting cleared on server start
- Fixes #299
- Because of an earlier change the groups file is loaded before regions are loaded on server start, and region groups remove themselves if there are no valid regions in them anymore.
- Keep groups even though they are empty (so that configuration done in the group is not lost)
2017-04-17 21:32:15 +02:00
Thijs Wiefferink 9d6955039a Fix '/as groupdel' with non-existing group creating an empty one 2017-04-17 21:26:24 +02:00
Thijs Wiefferink 747b47057b Allow # in region name for /as stack to determine counter position 2017-04-11 21:22:35 +02:00
Thijs Wiefferink a973e254e6 Fix '/as addfriend' not allowing you to add players that are playing for the first time
- Fixes #297
2017-04-02 22:34:02 +02:00
Thijs Wiefferink a5105af3ad Add 'use' flag to default.yml again since people mess it up 2017-03-29 20:18:14 +02:00
Thijs Wiefferink 0bb0a05b76 Cleanup checkstyle from pom.xml in AreaShop module 2017-03-29 20:17:42 +02:00
Thijs Wiefferink dad502ec0c Add checkstyle to enforce formatting, change all formatting to comply 2017-03-29 20:15:44 +02:00
Thijs Wiefferink f471b9bbf0 Don't show 'in advance renting:' in '/as info' if maxExtends is zero
- Thanks to R0bstar for noticing this weird weird message combination
2017-03-09 16:14:30 +01:00
Thijs Wiefferink f69d1c41e6 Code cleanup and stricter visibility of methods/variables 2017-03-09 16:01:36 +01:00
Thijs Wiefferink 4ea6f59c49 Remove GeneralRegion#is{Rent|Buy}Region()
- It served no purpose and prevents IDEs from detecting type safety
2017-03-09 15:29:01 +01:00
Thijs Wiefferink 0b7158290f Add some more bStats statistics 2017-03-09 15:09:05 +01:00
Thijs Wiefferink e6757d23de Add bStats analytics
- Add bStats analytics because MCStats is down constantly
- Add custom graphs:
  - Language pie chart
  - Number of registered regions
  - Number of rental regions
  - Number of buy regions
- Closes #287
- In the future MCStats can be removed, for now I would like to keep complete data there for the times it does work
- Could add more graphs in the future for number of friends and things like that
2017-03-02 18:14:07 +01:00
Thijs Wiefferink 7cda35f4da Remove duplicate link in the readme 2017-02-12 20:04:35 +01:00
Thijs Wiefferink ee293d14b9 Fix link to CI in the readme 2017-02-12 20:03:46 +01:00
Thijs Wiefferink 2e0fce4955 Update repository url 2017-02-09 14:59:53 +01:00
Thijs Wiefferink 7afdefc9ed Add missing javadoc to loadFiles methods 2017-02-02 23:03:55 +01:00
Thijs Wiefferink 11f80e7ed1 Start using InteractiveMessenger
- Messaging functionality has been split into the InteractiveMessenger project: https://github.com/NLthijs48/InteractiveMessenger
- Jenkins build server has been changed to publish a Maven repository: http://jenkins.wiefferink.me/plugin/repository/everything
2017-02-02 22:59:00 +01:00
Thijs Wiefferink 40d45c7786 Fix using landlordName setting without using landlord (uuid) setting 2017-02-02 17:20:26 +01:00
Thijs Wiefferink 6b8e161e43 Ensure buy/rent/resell price is never below zero
This prevents problems with negative payment or withdrawal in Vault if input validation of a command is not good enough or if a price has manually been set below zero.
2017-02-02 17:18:26 +01:00
Thijs Wiefferink e1b2f7391c Improve message when you cannot rent/buy a region
The message did not specify which region cannot be rented/bought, which has now been added.
2017-02-02 16:45:15 +01:00
leNic 89ae8b9b4a Fixed reselling with negative prices (#280)
Prevents setting a negative resell price,. Some economy plugins accept a withdraw with a negative number, which has bad consequences (for example EssentialsEco does not accept it).
2017-01-28 20:25:24 +01:00
Thijs Wiefferink fab415bf19 Speed up expiration and expireWarning tasks
The expire task was triggering more often than the expireWarning task, causing lost warnings when warnings with a low time are specified
2017-01-23 14:26:25 +01:00
Thijs Wiefferink c7aa92be81 Indicate in default.yml that expressions can be used for region prices 2017-01-13 19:25:31 +01:00
Thijs Wiefferink 705c8d6891 Update README.md 2017-01-13 18:42:04 +01:00
Thijs Wiefferink 429d87c9ff Improve feature list 2017-01-13 18:41:16 +01:00
Thijs Wiefferink 1fdd8b32cc Add prices depending on a formula
- Price can be specified with an expression (JavaScript syntax)
- You can also use a block of JavaScript code, the value of the last line is used as result (for more complex logic)
- Supported settings: rent.price, buy.price, rent.moneyBack, buy.moneyBack (need more? ask me)
- Before evaluating the expression all region variables as defined in the config.yml file will be replaced (allows you to use %width% etc)
- Added %timesExtended% variable for use in expressions (to know how long the user is renting for)
- '/as setprice' and signs still only allow number input to prevent security problems (this means actual config access is required to do anything of harm with JavaScript)
- Closes #23
2017-01-13 16:56:02 +01:00
Thijs Wiefferink 7900f78a8c Change default WorldGuard flags to include block-place and block-break
Way too many people set the block-break and block-place flags on bigger or even the global region to deny (which is unnecessary and wrong relatively, for global use 'passthrough: deny' instead) so this patches up those mistakes by setting them at the AreaShop region
2017-01-13 16:06:18 +01:00
Thijs Wiefferink 3a65a88849 Fix replacing variables into language variables
- Previously it would insert it as a message, causing the language variable to be split up into multiple parts (which prevents recognizing it later)
- If a Message is marked as inline with Message#inline() it will be inserted without breaking up the message
2016-12-27 16:17:04 +01:00
Thijs Wiefferink 7b491d0389 Lazily instantiate feature classes to improve performance 2016-12-27 16:15:17 +01:00
Thijs Wiefferink fd02c51492 Add setting to prevent cross-world teleportation with '/as find'
- If a region is in another world and 'findCrossWorld' is off, it will be filtered from the results
- 'teleportCrossWorld' will not be checked anymore if the teleport is called from '/as find'
- Resolves  #234
2016-12-26 23:29:40 +01:00
Thijs Wiefferink bb1f592807 Add setting to prevent cross-world teleportation with '/as tp'
Related to #234
2016-12-26 23:20:12 +01:00
Thijs Wiefferink 16c7a044ea Add and make use of escaping in messages
- Add escaping support to FancyMessageFormat: put a backslash before a tag and it will not be interpreted, also works for color codes (&2 and §2) and variables
- Make use of escaping in the Message class to properly handle user input as plaintext (previously user input that got printed back also got interpreted, like colors apply to it)
- All replacements given to Message are escaped, unless you wrap them in a Message before it.
- Replacement limits and infinite replacing detection have changed slightly
2016-12-26 22:56:35 +01:00
Thijs Wiefferink 152f183670 Fix region update after /as reload, cleanup unused code 2016-12-25 23:02:23 +01:00
Thijs Wiefferink 09b6e4c584 Fix string setting as profile in default.yml
- This has been broken in b525c5902c
- Fixes #267
2016-12-25 22:40:11 +01:00
Thijs Wiefferink aeb70196a3 Fix shutdown exception in SignsFeature 2016-12-24 19:59:04 +01:00
Thijs Wiefferink 62148ea577 Move teleportation code to a feature class 2016-12-23 23:25:41 +01:00
Thijs Wiefferink fcc9fb0945 Refactor to introduce Manager and RegionFeature
- Manager to serve as abstract class for managers (like FileManager), implements a lifecycle to allow for shutdown operations (like save all files)
- RegionFeature to server as abstract class for region features
- Improve instantiation and lifecycle of features (global features and region specific ones)
- This is preparation for moving more region functionality into feature specific classes (which makes GeneralRegion smaller and easier to maintain)
2016-12-23 16:03:22 +01:00
Thijs Wiefferink b525c5902c Fix default settings leaking when getting configuration sections
- Default settings and custom settings are in separate YamlConfiguration instances now to prevent leaking
- When getting a configuration section you now know that either it is from the current default.yml file or the default.yml file in the jar (querying settings from the section will always have the same source)
- Fixed a startup null pointer
- Fixed #266
2016-12-23 14:07:26 +01:00
Thijs Wiefferink b18a7cc6d5 Fix [break] in hover lines
Hover lines are still a bit broken when trying to insert complex messages into them, this is hard to do in a proper way though.
2016-12-10 15:19:34 +01:00
Thijs Wiefferink 54b6e84558 File loading improvements to be more robust 2016-12-04 21:14:31 +01:00
Thijs Wiefferink bae3c0a199 Ask for config files in the issue template 2016-12-04 17:56:37 +01:00
Very Evil Olaf 508270a280 Update ISSUE_TEMPLATE.md (#258)
Note that 'latest' is not a correct version
2016-12-04 17:48:36 +01:00
Thijs Wiefferink 87b2cb9ecd Prevent exceptions if a schematicProfile does not exist 2016-12-04 17:31:22 +01:00
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
Thijs Wiefferink 59b960b87c Update languages, set version number to 2.3.1
- Added German translation
- Added French translation
- Added Norwegian translation
2016-08-01 19:36:50 +02:00
Thijs Wiefferink 2de653d73f Add automatic conversion of language files downloaded from Transifex 2016-08-01 18:03:09 +02:00
Thijs Wiefferink 4feee59834 Cleanup info and warning messages. 2016-08-01 16:18:05 +02:00
Thijs Wiefferink 816d136a62 Change version number to 2.3.0, update languages
- Only English and Dutch are available yet
2016-07-24 21:48:39 +02:00
Thijs Wiefferink 121de7dc7e Add build number option to Maven
- Build number option can be used by Jenkins to add the build number
- Build number of soruce on Github will be #CUSTOM to mark custom builds
- Release versions will not contain a build number
- Closes #185
2016-07-24 20:59:25 +02:00
Thijs Wiefferink f7c86881cc Fix the default flagProfiles settings, fix migration issues. 2016-07-24 20:25:58 +02:00
Thijs Wiefferink 351d51b664 Correct message for reselling region entries. 2016-07-23 19:31:45 +02:00
Thijs Wiefferink 5a28476cf0 Add better limits for messages
- Recursive replacements are handled by catching stackoverflow exceptions
- Messages are limited 30000 in length for the produced JSON string since the client cannot handle more
- Error message print out the message key and start of the message
2016-07-23 17:21:08 +02:00
Thijs Wiefferink 8143bdae27 Add pages to the /as info command to prevent crashes
- Output displayed in pages of 18 (+ header and footer it fills the max of 20 you can see without scrolling)
- Footer shows current and max page, and has buttons to go to next/previous
- Commands accept [group] [page] both as optional arguments, works because page is a number (number as group would be weird)
- Entries show basic info about regions (owner/price/duration), and of course can be clicked to show all info
- Made debug command more generic
- Closes #172
2016-07-23 02:57:31 +02:00
Thijs Wiefferink b62744fe10 Add warnings for missing settings in limit groups.
Closes #164
2016-07-21 23:00:19 +02:00
Thijs Wiefferink fe0b63c760 Remove incorrect check 2016-07-17 23:51:24 +02:00
Thijs Wiefferink def774c7a1 Link javadoc of external classes properly
Classes of Bukkit, WorldGuard and WorldEdit that appear in the javadoc now link to the javadoc of them.
2016-06-27 23:38:44 +02:00
Thijs Wiefferink 7c5cb5f5aa Add javadoc to getApplicableRegions methods 2016-06-27 23:16:21 +02:00
Thijs Wiefferink 8af6e1d6f1 Fix small Maven warning 2016-06-25 22:20:21 +02:00
Thijs Wiefferink e0e6c39dae Fix WorldGuard version detection for later stable releases 2016-06-21 22:42:56 +02:00
Thijs Wiefferink dabe46bd47 Move all sign related methods into SignsFeature
- Each GeneralRegion now has a SignsFeature
- Each SignsFeature contains RegionSign instances representing the actual signs
 - The RegionSign class contains methods to update them etc
 - There is one SignsFeature that is not linked to a region, but registered as listener to update the signs at events
2016-06-20 20:16:13 +02:00
Thijs Wiefferink ec478a05d1 Move region friends code to separate Feature class 2016-06-20 18:22:35 +02:00
Thijs Wiefferink e21c0aafde Add events for adding/removing friends
- Cancellable event for adding friends: AddFriendEvent (region, friend and who is trying to add it available)
- Cancellable event for removing friends: DeleteFriendEvent (region, friend and who is trying to delete it available)
- Closes #54
2016-06-20 17:03:12 +02:00
Thijs Wiefferink 52bf88f4a5 Prevent RemovedRegionEvent triggering twice
Add debug logging for RemovedRegionEvent and AddedRegionEvent
2016-06-20 16:32:10 +02:00
Thijs Wiefferink e4de560a65 Prevent Maven warning
It was trying to include the WorldGuard6 handler class twice in the jar file
2016-06-20 16:28:23 +02:00
Thijs Wiefferink 6481da29e4 Add compatibility for WorldGuard build 1674 and up.
- Added a module for WorldGuard 6.1.3 to adapt to changes in flag related methods.
- No compatibility with build 1672, since there is no dependency in the Maven repo of WorldGuard to target this (this is a dev build though so I don't expect people using it long-term)
- Move properties for setting Java version to the parent pom file (other modules inherit them)
- Move repositories to the parent pom file (other modules inherit them)
- Fix AreaShop module not declaring its parent
- Fixes #170
2016-06-18 23:23:22 +02:00
Thijs Wiefferink f287cc91a6 Remove leftover logging 2016-06-13 21:11:00 +02:00
Thijs Wiefferink 95b7b50346 Add development builds and javadocs links 2016-06-13 20:59:08 +02:00
Thijs Wiefferink 21db2ff440 Improve Maven setup for javadoc and source
- Generate a .jar file with the sources if -Dsources is provided
- Generate javadocs if -Djavadoc=/path/to/destination is provided
- Copy final .jar file to directory if -DcopyResult=/path/to/server is provided
- Adding missing javadoc comments
2016-06-13 20:36:17 +02:00
Thijs Wiefferink 36dd978a92 Cleanup the config file and settings
- Moved scheduled task settings to hiddenConfig.yml (settings that are not visible, but still usable)
- Remove 'postCommandErrors' setting
- Also execute commands defined in 'expirationWarningProfiles' when player is not online
- Move around settings in config.yml and improve explanations
- Closes #168
2016-06-13 17:03:20 +02:00
Thijs Wiefferink 6cc3f2a52f Combine all messages about region not registered
And replace mentions of 'this region' with the actual region name.
2016-06-13 14:47:10 +02:00
Thijs Wiefferink 852731b1ad Add action confirmations when using signs
- Confirmations by default for selling/unrenting by signs, not for renting/buying
- Fixed a bug with message composing which would duplicate hover/click parts.
- Added `/as message <player> <message...>` for internal/console use (not shown in help).
- Closes #50
2016-06-12 21:39:12 +02:00
Thijs Wiefferink 30faa77da9 Fix small error in multiple regions found message 2016-06-12 19:38:05 +02:00
Thijs Wiefferink ec57b922b8 Messages: Version fixes, fallback to plain.
- Properly parse NMS version number to support 1.10
- Fallback to plain messages if sending a fancy message breaks (we try again after restart/reload)
2016-06-12 16:48:47 +02:00
Thijs Wiefferink c2bcc6008b Add hover/click to some forgotten mentions of regions 2016-06-12 13:25:55 +02:00
Thijs Wiefferink 72a05bedce Merge personal/all help messages. 2016-06-11 22:40:09 +02:00
Thijs Wiefferink bc73a8b20d Cleanup links to issues 2016-06-11 17:35:00 +02:00
Thijs Wiefferink 832e8218b6 Add issue template for bugs/feature requests 2016-06-11 17:29:47 +02:00
Thijs Wiefferink 6fcb629133 Move to the me.wiefferink package
The nl.evolutioncoding domain is soon not mine anymore, and this new one I do intend on keeping.
2016-06-07 22:39:45 +02:00
Thijs Wiefferink 7d6a1f35c1 Messages: Add hover/click items to region info
- The hover/click parts only appear if you have permission to use the command linked to it
- Red crosses added next to the friends in the friend list to remove them
2016-06-05 17:04:38 +02:00
Thijs Wiefferink 60257d45c2 Messages: Add a bunch of click/hover actions to '/as info region <region>'
- rent/unrent/buy/sell/extend
- teleport, set teleport location
2016-06-04 22:46:10 +02:00
Thijs Wiefferink 2300227d87 Messages: Fix problem with message insertion sometimes missing leftover part 2016-06-04 20:57:14 +02:00
Thijs Wiefferink b1852b10bb Improve /as me, remove /as info player
And change underline to bold for clickable things (underline leaks through in the next line, giving annoying layout issues)
2016-06-02 22:39:30 +02:00
Thijs Wiefferink 88fdb0c3fc Add 'ALL' flagProfiles state that is always applied
And add block-break and block-place by default.
2016-05-31 22:36:18 +02:00
Christoph Krüger 491e55fc77 Change Vault dependency to Maven repo instead of .jar
Use the Maven repository of Vault instead of including a jar file in the repository.
2016-05-28 23:19:23 +02:00
Thijs Wiefferink c7b0a2c663 Let /as help respect the areashop.help permission
Closes #155
2016-05-28 17:04:06 +02:00
Thijs Wiefferink 868f4d6b58 Events: Add refunded money to UnrentedRegionEvent and SoldRegionEvent
Closes #147
2016-05-28 17:00:52 +02:00
Thijs Wiefferink 0d4b034181 Messages: Detect and stop replacement loops. 2016-05-28 16:51:32 +02:00
Thijs Wiefferink 5f20689ba3 Improve language variable argument detection 2016-05-27 21:01:14 +02:00
Thijs Wiefferink 38b658fccf Message changes: click on regions/players
- Click on region name for region details
- Click on player name for regions of the player
- Click on landlord name for regions of the landlord
- Change color codes to things like [blue] instead of &9 (both are supported though)
2016-05-24 23:18:25 +02:00
Thijs Wiefferink 28ed20c0b5 Message system fixes and improved robustness
Hover/click message for '/as info'
2016-05-23 12:16:19 +02:00
Thijs Wiefferink aaff36b2eb Add hover/click support for messages #18
- Language files support a way to add hover tooltips, click commands and click insert commands (using FancyMessageFormat created together with PhoenixIV)
- Language variables support arguments
- Help listing (/as help) uses the new hover/click things, more to come
- See #18 for the TODO list
2016-05-22 21:36:58 +02:00
Spidev46 49b536cab0 There is a mistake with the messages (#153)
Confirmation message of reselling a region does not go to the old owner.
2016-05-22 21:19:10 +02:00
Thijs Wiefferink 9a9969dea3 Fix problems with detecting most important region when placing a sign.
WorldGuard filters child regions from the ApplicableRegionSet for some reason, so setting parent/child relations on regions messes up the detection because the children can never be found.
2016-03-07 12:21:33 +01:00
Thijs Wiefferink 84e4b49bfd Update language files
English, Dutch and German are complete, others are only partially complete.
2016-03-06 00:07:31 +01:00
Thijs Wiefferink 6daaf6997d 1.9 compatibility fixes (getOnlinePlayers() method) 2016-03-05 22:15:21 +01:00
Thijs Wiefferink c445a62334 Add variable support to all messages where a region is known (mostly messages of commands were not using it yet). 2016-02-08 19:39:33 +01:00
Thijs Wiefferink 0d205b0d9e Change general.teleportLocationY to also accept a number. 2016-02-08 14:43:24 +01:00
Thijs Wiefferink 8c33826c2c Add build flag to default flagprofiles, users are often having trouble with this 2016-01-26 22:35:01 +01:00
Thijs Wiefferink 51e1dbafb7 Fix running sign commands going wrong.
Player commands are run first, which normally rents/buys a region, so when the console commands are ran after that, then it will run the commands of the wrong state (since the state just changed). Also fixed a minor WorldGuard version dependency issue.
2016-01-26 22:20:45 +01:00
Thijs Wiefferink 6edad3faff Add priority and interact flag to config.yml by default
50% of the issues are having more regions at the same place, and therefore requiring a higher priority for the AreaShop region and having chests accessible by anyone instead of only the region owner/member. This should fix these problems.
2016-01-12 21:43:04 +01:00
Thijs Wiefferink f89e0f861b Add a link to a preview server 2016-01-08 20:18:47 +01:00
Thijs Wiefferink 770b1d98df Refactoring:
- Move a bunch of utility methods from the AreaShop class to Utils
- Comments styling cleanup
- Display warning in console when region file does not load correctly (is empty)
2016-01-05 22:31:55 +01:00
Thijs Wiefferink 8e5baa47af Fix variables of sell messages 2015-12-26 20:08:01 +01:00
Thijs Wiefferink 367466735e Fix the 'n:<name>' option for member/owner region flags
Before it would keep the 'n:' part when adding the name to the region, therefore adding an incorrect name.
2015-12-26 00:45:05 +01:00
Thijs Wiefferink ade6bc3971 Add AddedRegionEvent+RemovedRegionEvent, moved sign/flags updating
- Sign updating now uses the event system
- WorldGuard region flag updating now uses the event system
- After changes made by commands/other user input it will now use update() on the region instead of the sign and region flag commands.
2015-12-13 19:55:47 +01:00
Thijs Wiefferink 05fd8c0156 Implement event system
- 'ask' type events that can be cancelled, broadcasted before the action happens
- 'notify' type events that cannot be cancelled, but only let you know that it has happened
- Events for renting (with extending flag), unrenting, buying, selling, reselling
- General 'RegionUpdateEvent' to listen to as display service (update signs, update regions flags, etc)

All messages in the GeneralRegion, RentRegion and BuyRegion classes can now use all region variables (in the future all other messages will also be worked through)

Closes #84
Closes #86
2015-12-11 20:54:12 +01:00
Thijs Wiefferink 5403472476 Cleanup/update config.yml and default.yml comments
- Add links to the wiki.
- Make things more consistent.
2015-12-10 23:16:19 +01:00
Thijs Wiefferink c4ee7bc7aa Add 'areashop.linksigns' to the 'areashop.*' permission group 2015-11-24 20:59:58 +01:00
Thijs Wiefferink 940f1969b6 Add link to dev builds on Jenkins 2015-11-24 20:43:44 +01:00
Thijs Wiefferink 07eb5477b8 Update Metrics 2015-11-17 21:21:27 +01:00
Thijs Wiefferink a4112092b5 Fix inclusion of the version specific classes of WorldGuard/WorldEdit in the final jar 2015-11-15 23:47:23 +01:00
Thijs Wiefferink 872d81b0a9 Cleanup code, fix some small bugs
Most of these things have been found with help of Intellij IDEA, preferring it over Eclipse already
2015-11-15 23:35:48 +01:00
Thijs Wiefferink b04871c553 Add rental to max when rental would go above maxRentTime otherwise
- Setting `extendToFullWhenAboveMaxRentTime` to set if AreaShop should
automatically extend to max when the player cannot rent a full duration
because of `maxRentTime`.

Fixes #94
2015-11-11 11:56:16 +01:00
Thijs Wiefferink fd1b8fba4c Fix inactiveSetting debug messages
The messages still assumed the inactiveSettings was in minutes instead
of in milliseconds.
2015-11-02 22:39:40 +01:00
Thijs Wiefferink 991e7b1961 Fix lastActive sometimes not updating correctly
- Update the lastActive time at rent/buy to ensure it is non-zero
- Ignore lastActive time of zero, give back current time
- Update lastActive time at server shutdown for players that are still
online, quit events are not fired at shutdown
2015-11-02 22:32:51 +01:00
Thijs Wiefferink aac963325a CI run :) 2015-11-01 23:03:41 +01:00
Thijs Wiefferink 3e7c7ce76b Fix message variables for '/as info player <player>' feedback 2015-10-31 23:15:11 +01:00
Thijs Wiefferink c858d30481 Add .gitignore to the repository 2015-10-19 19:07:31 +02:00
Thijs Wiefferink b090fd5577 Remove MCStats image, site is more offline than online 2015-10-17 22:10:38 +02:00
Thijs Wiefferink 8d132c66c4 Prepare for the v2.2.1 release
- Update version number
- Update language files from Transifex
2015-10-17 21:03:30 +02:00
Thijs Wiefferink 50e3e59543 Fix indentation and error message of WorldEdit 6 integration handler 2015-10-15 12:13:15 +02:00
Thijs Wiefferink eb21b9567e Change signtags from [arent] and [abuy] to [asrent] and [asbuy]
Changes #45
2015-10-08 22:49:41 +02:00
Thijs Wiefferink 4dba305f6d Change the default sign tags to something more specific
Note: Change documentation pages to include this.

Fixes #45
2015-10-06 22:41:59 +02:00
Thijs Wiefferink 7481d8287f Retrieve money from landlords when unrenting/selling a region.
Prevents exploits by giving money to landlords, and then
unrenting/selling to get money back from 'the server' (nobody). Now it
will get the money back from the landlord, or if that is not possible
then not give anything back.

Fixes #75
2015-10-06 22:15:09 +02:00
Thijs Wiefferink 4d41decbe5 Config part of week indicators 2015-10-03 21:14:24 +02:00
Thijs Wiefferink 7fc5a5af81 Add weeks time indicators, clean other indicators
The old Dutch time indicators have been removed from the lists, this
might cause problems for people if they regenerate their config but
don't add these tags again.

Added console warnings at startup to indicate incorrect duration
strings.

Fixes #32
2015-10-03 21:12:38 +02:00
Thijs Wiefferink d26fa99b95 Fix using the seconds modifier with /as setduration
AreaShop could correctly read and use all seconds modifiers that are
defined in the config, but the `/as setduration` command would not
accept it as input.

Fixes #82
2015-10-03 20:38:38 +02:00
Thijs Wiefferink 39d755d2db Make removing regions from AreaShop less destructible for region flags
First AreaShop would reset all flags, now it will only reset the
greeting and farewell flags. This is to make sure players do not get
confused about the region, if the greeting is still there then players
might think it is still connected to AreaShop.

Fixes #72
2015-10-03 20:27:19 +02:00
Thijs Wiefferink 48ab46ecf7 Fix indirect breaking of signs causing it to disconnect
If you would break a block behind/below a sign AreaShop would disconnect
it from the region, which is most of the times not the wanted behaviour.
This commit changes it to simply leave a floating sign there, so that it
is still visible and not disconnected from the region.

Fixes #15
2015-10-03 20:10:44 +02:00
Thijs Wiefferink b3fa31e1cc Remove debug message 2015-10-02 20:44:25 +02:00
Thijs Wiefferink 783085fbf7 Cache region variable replacements 2015-10-02 20:41:00 +02:00
Thijs Wiefferink aa093b0c8a Fix sign clicking still executing while event is cancelled. 2015-09-26 01:06:22 +02:00
Thijs Wiefferink 9c357fe929 Remove lastActive from region file when unrented/sold
No problems if it is there, but just keeping the region file clean.
2015-09-11 22:44:12 +02:00
Thijs Wiefferink 4d70571a23 Improve failed file loading
- Detects incorrectly loaded config.yml and default.yml
(YamlConfiguration prints errors to console and continues silently,
returning an empty configuration if something is wrong normally)
- Will go into error state when loading fails
- Improved some error handling to make sure that no extra errors are
thrown because of trying to close non-existing streams.
2015-09-10 21:58:57 +02:00
Thijs Wiefferink 29a4105ece Add Vault to the repo to make it easier to compile 2015-09-06 17:05:38 +02:00
Thijs Wiefferink edc7136063 Fix '/as info' always showing landlord line
It would always show the landlord line, if there was no actual landlord
it would show '<UNKNOWN>' as name, which is very confusing.

Fixes #46
2015-09-06 16:42:16 +02:00
Thijs Wiefferink 6fabc75be4 Fix '/as info' trying to filter by group too much
'/as info region' would also try to filter by group using the region
name, which would almost always cause an error message (group not found)
2015-09-06 16:38:23 +02:00
Thijs Wiefferink 085507bf8b Add required dependencies section 2015-08-30 00:10:12 +02:00
Thijs Wiefferink 73ed3366ae Update README.md 2015-08-29 22:27:14 +02:00
Thijs Wiefferink 9ca029176d Fix '/as find' not getting your balance correctly
- If you search with your balance (and do not give a maxprice) it would
always use 0.0 as your balance, therefore not finding any regions.
- Also fixes the incorrect feedback, it would say it searched with a
maxprice instead of your balance and the other way around if no regions
are found.
- Fixed maxprice and balance display to use correct currency symbols and
layouts (decimals, metric prefixes, separator).

Fixes #59
2015-08-29 20:06:16 +02:00
Thijs Wiefferink bf181d69d7 Update README.md 2015-08-29 19:46:05 +02:00
Thijs Wiefferink 68c57515da Update README.md 2015-08-29 19:44:54 +02:00
Thijs Wiefferink 903d6c309f Update README.md 2015-08-29 19:44:39 +02:00
Thijs Wiefferink 0a02eb3254 Update README.md 2015-08-29 19:42:57 +02:00
Thijs Wiefferink bf04589fab Merge links to issues with the top menu 2015-08-29 19:42:11 +02:00
Thijs Wiefferink 14dd094803 Update README.md 2015-08-27 22:51:49 +02:00
Thijs Wiefferink 02df35304c Update README.md 2015-08-27 22:48:11 +02:00
Thijs Wiefferink 4321667ec5 Merge branch 'master' of https://github.com/NLthijs48/AreaShop 2015-08-26 20:05:03 +02:00
Thijs Wiefferink 5cf5df78c8 Add permissions to prevent buying resell regions
- Permission 'areashop.buynormal' can be negated to only allow buying
regions that are in resell mode
- Permission 'areashop.buyresell' can be negated to only allow buying
regions that are not in resell mode

This change does not affect existing permissions setups (above
permissions are true by default)
2015-08-26 20:04:50 +02:00
Thijs Wiefferink 8608d6ce1d Update README.md 2015-08-25 17:40:08 +02:00
Thijs Wiefferink 614336862e Update README.md 2015-08-25 17:38:02 +02:00
Thijs Wiefferink a4ea175f1b Update README.md 2015-08-25 17:33:52 +02:00
Thijs Wiefferink c96043aa38 Update README.md 2015-08-25 17:30:11 +02:00
Thijs Wiefferink d5a29f6c32 Update README.MD: WIP frontpage
Frontpage like the BukkitDev and Spigot Resources section.
2015-08-25 17:29:21 +02:00
Thijs Wiefferink 5176a1c2c5 Update README.md 2015-08-21 21:45:42 +02:00
Thijs Wiefferink 89569ea182 Update README.md 2015-08-17 23:11:46 +02:00
Thijs Wiefferink f349657a59 Fix bug with teleporting to signs
Fixes #47
2015-08-13 22:04:22 +02:00
Thijs Wiefferink 40d3d4d8af Add group filtering to /as info <rented|forrent|sold|forsale>
- Filter regions by group for the mentioned subcommands of /as info
- Clean/refactor code
- Sort the output
- Add Comparable, equals() and toString() to GeneralRegion

Closes #44
2015-08-11 22:41:30 +02:00
Thijs Wiefferink 0d5db8fa4e Add option to deny extending when over rent/total limits
Turned on by default, added config setting
'allowRegionExtendsWhenAboveLimits' to disable this change. Normally
this is expected behaviour, which pushes users to let the region run out
if they should not be able to rent it anymore (was impossible to do
before).

Closes #41
2015-08-10 21:43:29 +02:00
Thijs Wiefferink 25c56e8ecb Add permissions for landlords to remove regions
Closes #33
2015-07-31 22:56:12 +02:00
Thijs Wiefferink 9f436a7eb4 Fix landlord UUID/name handling
Also changes handling of buyer/renter UUIDs and names, if the playerdata
of a player is not available anymore AreaShop will still be able to
display his name. Also unrenting/selling will still properly pay back
the player through Vault (by name instead of UUID).

Fixes #35
2015-07-30 22:55:49 +02:00
Thijs Wiefferink f76c1b8a9f Save last online time self instead of using the Bukkit API
The Bukkit API returns an incorrect last online time when the player.dat
file is not present (for example when a server saves inventories etc.
somewhere else, or when it is cleaned).

Improves landlord handling when there is no UUID present in the config
files.

Closes #34
2015-07-28 23:02:52 +02:00
Thijs Wiefferink d466658f36 Allow only providing landlord name, instead of UUID 2015-07-28 21:50:28 +02:00
Thijs Wiefferink 04e02c4ce4 Adds a way to change number length for stack region names
Adds dots after all config explaination lines, fixes a couple things
with groups.yml file saving (would save unnecessary sometimes).

Fixes #26
2015-07-26 20:56:44 +02:00
Thijs Wiefferink 3bf493109c Add date/time variables for commands/schematics
Fixes #21
2015-07-26 20:15:45 +02:00
Thijs Wiefferink 2f9b6d3987 Update language files to the latest available versions on Transifex 2015-07-25 16:57:24 +02:00
Thijs Wiefferink 93d5612513 Fix a bug with depositing to players that never joined
Paying to players that never visited before will now fallback to using a
name instead of UUID towards Vault, which prevents problems (for players
that never visited, such as server accounts, you cannot get the name
from the UUID via Bukkit).
2015-07-25 16:56:41 +02:00
Thijs Wiefferink 937db4620d Fix problem with default value 'unlimited' for maxRentTime 2015-06-21 19:29:54 +02:00
Thijs Wiefferink a0239b8837 Fix loading when there is no regions folder 2015-06-21 17:08:11 +02:00
Thijs Wiefferink 401f52e687 Change additional places where the contains is used 2015-06-13 22:56:27 +02:00
Thijs Wiefferink 2f6874a16e Fix contains check for WorldGuard regions not version dependend 2015-06-13 22:50:06 +02:00
Thijs Wiefferink c95f4e1c6c Fix problem with '/as addfriend' denying first-joined players
Before it checked if the player had played before on the server in order
to check if the friend will get accepted, but this fails when the player
is playing for the first time. This has been repaired.
2015-06-13 22:06:34 +02:00
Thijs Wiefferink 1a2d755727 Fix message using incorrect time unit 2015-06-11 15:42:39 +02:00
Thijs Wiefferink c489e6eba4 Commit changes in language file 2015-06-11 15:32:29 +02:00
Thijs Wiefferink b1a56b5230 Fix maxRentTime, inactiveTimeUntilUnrent/-Sell settings
Made a misake while converting these settings to accept human-readable
durations strings instead of only minutes.
2015-06-11 14:11:41 +02:00
Thijs Wiefferink dfbc7805b5 Fix a couple of bugs 2015-06-11 00:51:44 +02:00
Thijs Wiefferink 8f2c95f5c4 Merge branch 'master' of https://github.com/NLthijs48/AreaShop 2015-05-22 19:01:40 +02:00
Thijs Wiefferink 0b9bffe68f Fix bug with changed time settings not loading old values 2015-05-22 19:01:30 +02:00
Thijs Wiefferink 7ac6e34c89 Update README.md 2015-05-12 10:25:07 +02:00
Thijs Wiefferink 5231f6e86e Change all time period settings to readable format
Changed all settings that took minutes or seconds as unit before to use
the format also used on signs (things like '50 seconds', '1 day', '3
months' etc).
Fixed a bug with display of currency numbers being unrounded when not
displayed with SI prefix.
2015-05-03 22:51:19 +02:00
Thijs Wiefferink 791b696aff Add support for Metric prefixes to display large numbers
Indications are used as defined on:
http://en.wikipedia.org/wiki/Metric_prefix, implemented from 'k' to 'Y'.
Added setting 'metricSuffixesAbove' to config.yml to specify from which
number these characters should be used.
Added setting 'decimalMark' to change the character(s) used as decimal
separation (is a comma instead of a dot in certain countries).
2015-05-03 00:15:05 +02:00
Thijs Wiefferink c92bc716dc Change module names to fit project setup
Forgot to rename the folders that contain the interface classes. Cleaned
pom.
2015-05-02 00:33:34 +02:00
Thijs Wiefferink 463b34e952 Merge pull request #13 from Androkai/patch-1
fix typo "targer" --> "target"
2015-05-01 11:02:53 +02:00
Androkai ff6e69196d fix typo "targer" --> "target" 2015-04-30 22:50:43 +02:00
Thijs Wiefferink 76ad952bb6 Remove unnecessary marking as 'to be saved'
Marking as 'to be saved' is already done when a setting change is
written to the YAML file, so it does not have to be called from the
places where settings are changed.
2015-04-28 20:38:44 +02:00
Thijs Wiefferink 0cdff5e143 Move README.md to the correct place. 2015-04-28 18:56:13 +02:00
Thijs Wiefferink 9dc3013215 Update README.md 2015-04-28 18:54:30 +02:00
Thijs Wiefferink 796b95c9f9 Change to a Maven project
Changed project layout to Maven, all dependencies except Vault (does not
have a maven repo) are now included in the pom.xml and will be
automatically downloaded by Maven when building. The project setup uses
modules to support both WorldGuard and WorldEdit version with 1 jar file
instead of having 2 files as the last versions of AreaShop had.

Small bug with boolean settings in the config files has been fixed.
Problem with '/as stack' stacking in the Y direction instead of Z has
been fixed. Plus some refactoring and small changes.
2015-04-28 18:53:42 +02:00
Thijs Wiefferink 2785a72457 Update README.md 2015-04-10 18:50:42 +02:00
Thijs Wiefferink c2df0cd912 Package and classes explanation 2015-04-10 18:47:20 +02:00
Thijs Wiefferink 4cd32a0792 Update README.md 2015-04-10 17:57:45 +02:00
Thijs Wiefferink 354e70af57 Add basic instructions for compiling AreaShop
Intructions to compile AreaShop from the source files provided here at GitHub.
2015-04-10 17:57:00 +02:00
Thijs Wiefferink fde60e2a27 Add permissions for landlords to add regions
Added things:
- "areashop.createrent.owner", "areashop.createrent.member",
"areashop.createbuy.owner" and "areashop.createbuy.member" to let
players add regions to AreaShop when they are member/owner of the
WorldGuard region (because they made the region for example).
- "areashop.setprice.landlord" to give landlords access to setting the
price for their regions
- "areashop.setduration.landlord" to give landlords access to setting
the duration for their regions
- When "default" or "reset" is given as price then the price will be
removed and therefore inherited from a group or default.yml
- When "default" or "reset" is given as duration then the duration will
be removed and therefore inherited from a group or default.yml
2015-03-17 21:22:57 +01:00
Thijs Wiefferink d1a3027e0b Update language files to the current status
Polish is back and 88% translated, Finnish is new and fully translated.
2015-03-13 21:16:44 +01:00
Thijs Wiefferink 4e57f03fc0 Added a command to set the landlord of a region.
The landlord receives all money from rents/buys of the region. Reselling
with '/as resell' does not transfer money to the landlord.
Unrenting/selling will not substract money from the account of the
landlord, so set the 'moneyBack' to 0 to prevent cheating. The
'landlord' setting is also present in the general section of
default.yml, so this means you can also add this setting to a region
group to easily make a group of regions give money to 1 player.
2015-03-13 21:07:59 +01:00
Thijs Wiefferink 83d4efc3a8 Remove redundant setting from the config to enable schematics
The 'enableSchematics' boolean setting from the config.yml file is not
usefull, 'enableRestore' in default.yml already handles the same thing,
and is more flexible (per region or region group instead of general)
2015-03-13 18:25:24 +01:00
Thijs Wiefferink 1395afffe9 Fix a bug with teleporting
Added messages when teleporting automatically changes to teleporting to
a sign instead of to the region or other way around.
2015-03-13 14:41:54 +01:00
Thijs Wiefferink 5094d39a96 Get worlds for WorldEdit the proper way (needs wrapped world) 2015-02-28 19:40:43 +01:00
Thijs Wiefferink e664c1efd9 Load regions at startup, check them at the first tick 2015-02-24 11:48:58 +01:00
Thijs Wiefferink 871eeed29c Change the loading of regions to all at once again
Otherwise it would cause problems with plugins that hook into AreaShop
and try to get regions.
2015-02-23 22:32:54 +01:00
Thijs Wiefferink 0d56762bfc Change to Vault integration to allow custom economies
AreaShop would not use an economy if it would be loaded after it.
2015-02-23 22:21:52 +01:00
Thijs Wiefferink c08763883f Fix a bug with '/as setowner' not saving the region file
Changed the way position the regions are marked as 'to be saved' to
prevent this problem in the future.
2015-02-23 21:48:57 +01:00
Thijs Wiefferink efb534f131 Fix the schematic saving 2015-02-23 19:26:20 +01:00
Thijs Wiefferink d9405a9f49 Make the updatechecker check async
If the updatechecker cannot reach BukkitDev it would slow down the
startup of the server up to 30 seconds (and also if you use /reload),
this will not happen anymore.
2015-02-23 18:11:51 +01:00
Thijs Wiefferink 684add89cd Change the way regions are loaded
Region loading is now started at the first server tick, and will do a
certain number of regions per tick ('loading.regionsPerTick' config
setting). This prevents problems with plugins that load worlds after
AreaShop is loaded. If AreaShop detects that a region does not have a
correct WorldGuard region assigned anymore or the world of the region is
not loaded it will be printed to the console, but it will not delete the
region anymore (which would lead to data loss).
2015-02-23 17:58:10 +01:00
Thijs Wiefferink d1848c0728 Delete .project 2015-02-23 13:32:04 +01:00
Thijs Wiefferink 9fd16290c0 Fix some unclear and wrong messages in the language file
Thanks to qlick for suggesting these language changes. Also fixes a bug
with the '/as info player' command, would cause an error if a region has
an incorrect UUID as owner or an UUID without name.
2015-02-22 23:16:37 +01:00
Thijs Wiefferink 3bbca11cc9 Added the '/as stack' command to easily create and register regions
/as stack <amount> <gap> <name> <rent|buy> [group]
    <amount> Number of regions that will be created
    <gap> Blocks distance between the regions
    <name> Name of the regions (number will be behind it)
    <rent|buy> The type of the region
    [group] A group to add the created regions to
    The regions will be created in the direction you are facing
2015-02-22 17:08:32 +01:00
Thijs Wiefferink b1be87014f Change schematic functions to new WorldGuard 6 classes 2015-02-19 17:22:06 +01:00
Thijs Wiefferink badcd77cfe Changing version number to get ready for a release.
Linksigns feature will be released next version together with other
setup tools.
2015-02-11 11:55:46 +01:00
Thijs Wiefferink 779d340bbb Fix translation of color codes for greeting/farewell messages
Ticket:
http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/tickets/26-color-issue/
Thread at WorldGuard explaining the problem:
http://forum.enginehub.org/threads/color-codes-for-greeting-farewell-flags.15958/
2015-02-11 11:34:15 +01:00
Thijs Wiefferink 4e5061ba54 Added updating regions at plugin startup
Removed the '/as updaterents' and '/as updatebuys' commands, '/as
reload' also updates regions now.
2015-02-10 22:57:09 +01:00
Thijs Wiefferink b0f3bdc560 Fix the English language file
It got cleared by a faulty update script, I have some programs to get
the translated files from Transifix, and that also updates the header of
the English file but that went wrong and therefore it got cleared.
2015-02-10 12:31:21 +01:00
Thijs Wiefferink 5c9fdb6cc9 Added name change detection, updates regions when name is changed.
When a player logs in it will loop through regions owned by this players
and check if the saved playername is still the same as the current
playername and update the regionflags and -signs if necessary. Also
fixed some spelling mistakes in the English language file and updated to
the latest Transifex translations.
2015-02-09 23:46:32 +01:00
Thijs Wiefferink 23ea679cd9 Fixed a small bug with the permissions for the teleport command
The teleport command would refuse to teleport you if you only have
'areashop.teleportfriend' and/or 'areashop.teleportfriendsign'
permissions, while you should actually have access to those.
2015-02-03 22:55:31 +01:00
Thijs Wiefferink 58680c8cc4 Add a bulk sign linking mode for easier setup
When using '/as linksigns' you will get in sign linking mode. With
leftclick you can select a sign (max 100 blocks away) and with
rightclick you can select an AreaShop region (max 100 blocks away). If
you selected both then the sign will be linked to the region and then
you can select both again. This way you can easily link a lot of signs
to regions. Advice: Use WorldEdit or similar to get signs in front of
all regions (//stack), then use sign linking mode to link them all.
2015-01-30 12:12:00 +01:00
Thijs Wiefferink 75b752a235 Adds an option to '/as info' to list regions without group 2015-01-26 13:33:57 +01:00
Thijs Wiefferink fb51da84ae Fix a bug with teleporting to signs
If no signs are connected to the region it will now correctly teleport
to the location set by '/as settp' instead of always using the default
location.
2015-01-26 12:31:50 +01:00
Thijs Wiefferink 22d214e59d Add an option to set where '/as find' should teleport you to
Adds the 'findTeleportToSign' option in the general section of
default.yml, you can let it teleport to a sign or to the '/as settp'
location (if no location is set the default location is used)
2015-01-26 12:27:43 +01:00
Thijs Wiefferink 175b531eb5 Fix an unclear message when trying to create a sign for a region that is
already added to AreaShop.
2015-01-21 13:28:23 +01:00
Thijs Wiefferink 52591d3b6e Adds a blacklist of region that cannot be added
The blacklist consists of a list of regular expressions, by default the
'__global__' region is blocked because it is highly unlikely you want to
add that to AreaShop. The blacklist can for example be used to exclude
the spawn region while adding shops at spawn with the WorldEdit
selection of the '/as add' command.
2015-01-21 13:20:32 +01:00
Thijs Wiefferink 825074479c Cleanup 2015-01-18 16:58:33 +01:00
Thijs Wiefferink cc8cf1e560 Add proper punctuation to all languages (dots at the end) + more
Some preparations are made to later enable proper tab completion for
anyone instead of only OPs. Addfriend command only allows you to add
players that have played on the server before now.
2015-01-18 16:03:21 +01:00
Thijs Wiefferink a4169d127e Adds dots to all language strings and adds Chinese (Taiwan)
(All language files changed because I made a program to download them
all from Transifex and transform them to the format I want. Only
languages that are translated for 70% or more will be added to AreaShop)
2015-01-17 15:39:08 +01:00
180 changed files with 24084 additions and 13656 deletions

No files matched your search

+36
View File
@@ -0,0 +1,36 @@
---
name: Bug report
about: Report a problem in the plugin
---
**Current behavior**
<!--- Tell what happens currently and/or show the stacktrace if an error occured -->
**Expected behavior**
<!--- Tell what you expected to happen instead -->
**Steps to reproduce**
<!--- Exactly show how this bug can be triggered -->
1.
2.
3.
4.
**Your environment**
<!--- Indicate which versions you use -->
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
* Server platform (Bukkit, Spigot, etc.):
* Server version:
* AreaShop version:
* WorldEdit version:
* WorldGuard version:
* Vault version:
**Your config files**
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
+12
View File
@@ -0,0 +1,12 @@
---
name: Feature request
about: Suggest an idea
---
**Describe the problem you are trying to solve with this feature request**
<!-- When I know the problem you are trying to solve I can help you to think about the best solution -->
**Describe the solution you'd like**
<!-- Describe the config settings, commands and other features that should be added -->
@@ -0,0 +1,28 @@
---
name: Support question
about: Ask help with the setup or usage of the plugin
---
**Current behavior**
<!--- Tell what happens currently -->
**Desired behavior**
<!--- Tell what you want to happen instead -->
**Your environment**
<!--- Indicate which versions you use -->
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
* Server platform (Bukkit, Spigot, etc.):
* Server version:
* AreaShop version:
* WorldEdit version:
* WorldGuard version:
* Vault version:
**Your config files**
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
+25
View File
@@ -0,0 +1,25 @@
# Maven stuff
/target
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# Locally stored "Eclipse launch configurations"
*.launch
# IntelliJ IDEA
*.iml
.idea
dependency-reduced-pom.xml
desktop.ini
-17
View File
@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>NLThijs48 - AreaShop</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
+1
View File
@@ -0,0 +1 @@
/target
+280
View File
@@ -0,0 +1,280 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>areashop</artifactId>
<packaging>jar</packaging>
<name>AreaShop</name>
<version>2.5.0</version> <!-- Main plugin version -->
<parent>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-parent</artifactId>
<version>parent</version>
</parent>
<dependencies>
<!-- Bukkit, AreaShop aims to support 1.7.9+, but this is the lowest Bukkit version available from the Spigot repo, Bukkit repository is gone -->
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>${bukkit.version}</version>
<type>jar</type>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<!-- InteractiveMessenger library -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>interactivemessenger</artifactId>
<version>1.1-SNAPSHOT</version>
</dependency>
<!-- BukkitDo library -->
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>bukkitdo</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-5</artifactId>
<version>WorldGuard-5</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-6</artifactId>
<version>WorldGuard-6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-6_1_3</artifactId>
<version>WorldGuard-6_1_3</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-7</artifactId>
<version>WorldGuard-7</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-interface</artifactId>
<version>AreaShopInterface</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-5</artifactId>
<version>WorldEdit-5</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-6</artifactId>
<version>WorldEdit-6</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-7</artifactId>
<version>WorldEdit-7</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>worldedit</artifactId>
<scope>system</scope>
<version>any</version>
<systemPath>${project.basedir}/../dependencies/worldedit-bukkit-7.0.0-beta-01.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sk89q</groupId>
<artifactId>worldguard</artifactId>
<scope>system</scope>
<version>any</version>
<systemPath>${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta01.jar</systemPath>
</dependency>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bstats</groupId>
<artifactId>bstats-bukkit</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<profiles>
<!-- Copy the jar file to a test server, activate by using -DcopyResult="/path/to/test/server" -->
<profile>
<id>test-locally</id>
<activation>
<property>
<name>copyResult</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<configuration>
<target>
<copy file="./target/${project.build.finalName}.jar"
tofile="${copyResult}\${project.build.finalName}.jar"/>
</target>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Package the source files in a jar, activate by using -Dsources -->
<profile>
<id>package-sources</id>
<activation>
<property>
<name>sources</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<phase>package</phase>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<!-- Produce javadoc files, activate by using -Djavadoc -->
<profile>
<id>generate-javadoc</id>
<activation>
<property>
<name>javadoc</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<executions>
<execution>
<phase>package</phase>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
<configuration>
<excludePackageNames>me.wiefferink.areashop.lib</excludePackageNames>
<destDir>${javadoc}</destDir>
<links>
<link>https://hub.spigotmc.org/javadocs/bukkit/</link>
<link>http://docs.sk89q.com/worldedit/apidocs/</link>
<link>http://docs.sk89q.com/worldguard/apidocs/</link>
</links>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<directory>target</directory>
<finalName>AreaShop</finalName>
<resources>
<resource>
<targetPath>.</targetPath>
<filtering>true</filtering>
<directory>src/main/resources</directory>
<includes>
<include>plugin.yml</include>
<include>config.yml</include>
<include>hiddenConfig.yml</include>
<include>default.yml</include>
<include>README.md</include>
<include>lang/*.yml</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<!-- Relocate messaging framework -->
<relocation>
<pattern>me.wiefferink.interactivemessenger</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.interactivemessenger</shadedPattern>
</relocation>
<!-- Relocate BukkitDo -->
<relocation>
<pattern>me.wiefferink.bukkitdo</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.bukkitdo</shadedPattern>
</relocation>
<!-- Relocate bstats -->
<relocation>
<pattern>org.bstats</pattern>
<shadedPattern>me.wiefferink.areashop.shaded.bstats</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,780 @@
package me.wiefferink.areashop;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.managers.RegionManager;
import me.wiefferink.areashop.interfaces.AreaShopInterface;
import me.wiefferink.areashop.interfaces.WorldEditInterface;
import me.wiefferink.areashop.interfaces.WorldGuardInterface;
import me.wiefferink.areashop.listeners.PlayerLoginLogoutListener;
import me.wiefferink.areashop.managers.CommandManager;
import me.wiefferink.areashop.managers.FeatureManager;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.managers.Manager;
import me.wiefferink.areashop.managers.SignLinkerManager;
import me.wiefferink.areashop.tools.Analytics;
import me.wiefferink.areashop.tools.GithubUpdateCheck;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.bukkitdo.Do;
import me.wiefferink.interactivemessenger.processing.Message;
import me.wiefferink.interactivemessenger.source.LanguageManager;
import net.milkbowl.vault.economy.Economy;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
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.HandlerList;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Main class for the AreaShop plugin.
* Contains methods to get parts of the plugins functionality and definitions for constants.
*/
public final class AreaShop extends JavaPlugin implements AreaShopInterface {
// Statically available instance
private static AreaShop instance = null;
// General variables
private WorldGuardPlugin worldGuard = null;
private WorldGuardInterface worldGuardInterface = null;
private WorldEditPlugin worldEdit = null;
private WorldEditInterface worldEditInterface = null;
private FileManager fileManager = null;
private LanguageManager languageManager = null;
private CommandManager commandManager = null;
private SignLinkerManager signLinkerManager = null;
private FeatureManager featureManager = null;
private Set<Manager> managers = null;
private boolean debug = false;
private List<String> chatprefix = null;
private boolean ready = false;
private GithubUpdateCheck githubUpdateCheck = null;
// Folders and file names
public static final String languageFolder = "lang";
public static final String schematicFolder = "schem";
public static final String regionsFolder = "regions";
public static final String groupsFile = "groups.yml";
public static final String defaultFile = "default.yml";
public static final String configFile = "config.yml";
public static final String configFileHidden = "hiddenConfig.yml";
public static final String versionFile = "versions";
// Euro tag for in the config
public static final String currencyEuro = "%euro%";
// Constants for handling file versions
public static final String versionFiles = "files";
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 tagVolume = "volume"; // Number of blocks in the region (accounting for polygon regions)
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 tagTimesExtended = "timesExtended";
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;
}
/**
* Called on start or reload of the server.
*/
public void onEnable() {
AreaShop.instance = this;
Do.init(this);
managers = new HashSet<>();
boolean error = false;
// Check if WorldGuard is present
String wgVersion = null;
String rawVersion = null;
int major = 0;
int minor = 0;
int fixes = 0;
Integer build = null;
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if(!(plugin instanceof WorldGuardPlugin) || !plugin.isEnabled()) {
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)
try {
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);
}
}
}
// 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]);
}
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);
}
// Determine correct implementation to use
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
wgVersion = "5";
} else if(major == 6 && minor == 1 && fixes < 3) {
wgVersion = "6";
} else if(major == 6) {
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 {
wgVersion = "7";
}
} catch(Exception e) { // If version detection fails, at least try to load the latest version
wgVersion = "7";
}
// Load chosen implementation
try {
final Class<?> clazz = Class.forName("me.wiefferink.areashop.handlers.WorldGuardHandler" + wgVersion);
// Check if we have a NMSHandler class at that location.
if(WorldGuardInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldGuardInterface
worldGuardInterface = (WorldGuardInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch(final Exception 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;
}
}
// Check if WorldEdit is present
String weVersion = null;
plugin = getServer().getPluginManager().getPlugin("WorldEdit");
if(!(plugin instanceof WorldEditPlugin) || !plugin.isEnabled()) {
error("WorldEdit plugin is not present or has not loaded correctly");
error = true;
} else {
worldEdit = (WorldEditPlugin)plugin;
// Get correct WorldEditInterface (handles things that changed version to version)
if(worldEdit.getDescription().getVersion().startsWith("5.")) {
weVersion = "5";
} else if(worldEdit.getDescription().getVersion().startsWith("6.")) {
weVersion = "6";
} else {
weVersion = "7";
}
try {
final Class<?> clazz = Class.forName("me.wiefferink.areashop.handlers.WorldEditHandler" + weVersion);
// Check if we have a NMSHandler class at that location.
if(WorldEditInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldEditInterface
worldEditInterface = (WorldEditInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch(final Exception 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;
}
}
// Check if Vault is present
if(getServer().getPluginManager().getPlugin("Vault") == null) {
error("Vault plugin is not present or has not loaded correctly");
error = true;
}
// Load all data from files and check versions
fileManager = new FileManager();
managers.add(fileManager);
error = error | !fileManager.loadFiles(false);
// Print loaded version of WG and WE in debug
if(wgVersion != null) {
AreaShop.debug("Loaded WorldGuardHandler" + wgVersion + " (raw version: " + rawVersion + ", major:" + major + ", minor:" + minor + ", fixes:" + fixes + ", build:" + build + ")");
}
if(weVersion != null) {
AreaShop.debug("Loaded WorldEditHandler" + weVersion);
}
setupLanguageManager();
if(error) {
error("The plugin has not started, fix the errors listed above");
} else {
featureManager = new FeatureManager();
managers.add(featureManager);
// Register the event listeners
getServer().getPluginManager().registerEvents(new PlayerLoginLogoutListener(this), this);
setupTasks();
// Startup the CommandManager (registers itself for the command)
commandManager = new CommandManager();
managers.add(commandManager);
// Create a signLinkerManager
signLinkerManager = new SignLinkerManager();
managers.add(signLinkerManager);
// Enable Metrics if config allows it
if(getConfig().getBoolean("sendStats")) {
Analytics.start();
}
// Register dynamic permission (things declared in config)
registerDynamicPermissions();
// Don't initialize the updatechecker if disabled in the config
if(getConfig().getBoolean("checkForUpdates")) {
githubUpdateCheck = new GithubUpdateCheck(
AreaShop.getInstance(),
"NLThijs48",
"AreaShop"
).withVersionComparator((latestVersion, currentVersion) ->
!cleanVersion(latestVersion).equals(cleanVersion(currentVersion))
).checkUpdate((result) -> {
AreaShop.debug("Update check result:", result);
if(!result.hasUpdate()) {
return;
}
AreaShop.info("Update from AreaShop V" + cleanVersion(result.getCurrentVersion()) + " to AreaShop V" + cleanVersion(result.getLatestVersion()) + " available, get the latest version at https://www.spigotmc.org/resources/areashop.2991/");
for(Player player : Utils.getOnlinePlayers()) {
notifyUpdate(player);
}
});
}
}
}
/**
* Notify a player about an update if he wants notifications about it and an update is available.
* @param sender CommandSender to notify
*/
public void notifyUpdate(CommandSender sender) {
if(githubUpdateCheck != null && githubUpdateCheck.hasUpdate() && sender.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(sender, "update-playerNotify", cleanVersion(githubUpdateCheck.getCurrentVersion()), cleanVersion(githubUpdateCheck.getLatestVersion()));
}
}
/**
* Cleanup a version number.
* @param version Version to clean
* @return Cleaned up version (removed prefixes and suffixes)
*/
private String cleanVersion(String version) {
version = version.toLowerCase();
// Strip 'v' as used on Github tags
if(version.startsWith("v")) {
version = version.substring(1);
}
// Strip build number as used by Jenkins
if(version.contains("#")) {
version = version.substring(0, version.indexOf("#"));
}
return version;
}
/**
* Called on shutdown or reload of the server.
*/
public void onDisable() {
Bukkit.getServer().getScheduler().cancelTasks(this);
// Cleanup managers
for(Manager manager : managers) {
manager.shutdown();
}
managers = null;
fileManager = null;
languageManager = null;
commandManager = null;
signLinkerManager = null;
featureManager = null;
// Cleanup plugins
worldGuard = null;
worldGuardInterface = null;
worldEdit = null;
worldEditInterface = null;
// Cleanup other stuff
chatprefix = null;
debug = false;
ready = false;
HandlerList.unregisterAll(this);
}
/**
* Indicates if the plugin is ready to be used.
* @return true if the plugin is ready, false otherwise
*/
public boolean isReady() {
return ready;
}
/**
* Set if the plugin is ready to be used or not (not to be used from another plugin!).
* @param ready Indicate if the plugin is ready to be used
*/
public void setReady(boolean ready) {
this.ready = ready;
}
/**
* Set if the plugin should output debug messages (loaded from config normally).
* @param debug Indicates if the plugin should output debug messages or not
*/
public void setDebug(boolean debug) {
this.debug = debug;
}
/**
* Setup a new LanguageManager.
*/
private void setupLanguageManager() {
languageManager = new LanguageManager(
this,
languageFolder,
getConfig().getString("language"),
"EN",
chatprefix
);
}
/**
* Set the chatprefix to use in the chat (loaded from config normally).
* @param chatprefix The string to use in front of chat messages (supports formatting codes)
*/
public void setChatprefix(List<String> chatprefix) {
this.chatprefix = chatprefix;
}
/**
* Function to get the WorldGuard plugin.
* @return WorldGuardPlugin
*/
public WorldGuardPlugin getWorldGuard() {
return worldGuard;
}
/**
* Function to get WorldGuardInterface for version dependent things.
* @return WorldGuardInterface
*/
public WorldGuardInterface getWorldGuardHandler() {
return this.worldGuardInterface;
}
/**
* Get the RegionManager.
* @param world World to get the RegionManager for
* @return RegionManager for the given world, if there is one, otherwise null
*/
public RegionManager getRegionManager(World world) {
return this.worldGuardInterface.getRegionManager(world);
}
/**
* Function to get the WorldEdit plugin.
* @return WorldEditPlugin
*/
public WorldEditPlugin getWorldEdit() {
return worldEdit;
}
/**
* Function to get WorldGuardInterface for version dependent things.
* @return WorldGuardInterface
*/
public WorldEditInterface getWorldEditHandler() {
return this.worldEditInterface;
}
/**
* Function to get the LanguageManager.
* @return the LanguageManager
*/
public LanguageManager getLanguageManager() {
return languageManager;
}
/**
* Function to get the CommandManager.
* @return the CommandManager
*/
public CommandManager getCommandManager() {
return commandManager;
}
/**
* Get the SignLinkerManager.
* Handles sign linking mode.
* @return The SignLinkerManager
*/
public SignLinkerManager getSignlinkerManager() {
return signLinkerManager;
}
/**
* Get the FeatureManager.
* Manages region specific features.
* @return The FeatureManager
*/
public FeatureManager getFeatureManager() {
return featureManager;
}
/**
* Function to get the Vault plugin.
* @return Economy
*/
public Economy getEconomy() {
RegisteredServiceProvider<Economy> economy = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
if(economy == null || economy.getProvider() == null) {
error("There is no economy provider to support Vault, make sure you installed an economy plugin");
return null;
}
return economy.getProvider();
}
/**
* Get the Vault permissions provider.
* @return Vault permissions provider
*/
public net.milkbowl.vault.permission.Permission getPermissionProvider() {
RegisteredServiceProvider<net.milkbowl.vault.permission.Permission> permissionProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class);
if (permissionProvider == null || permissionProvider.getProvider() == null) {
return null;
}
return permissionProvider.getProvider();
}
/**
* Check for a permission of a (possibly offline) player.
* @param offlinePlayer OfflinePlayer to check
* @param permission Permission to check
* @return true if the player has the permission, false if the player does not have permission or, is offline and there is not Vault-compatible permission plugin
*/
public boolean hasPermission(OfflinePlayer offlinePlayer, String permission) {
// Online, return through Bukkit
if(offlinePlayer.getPlayer() != null) {
return offlinePlayer.getPlayer().hasPermission(permission);
}
// Resolve while offline if possible
net.milkbowl.vault.permission.Permission permissionProvider = getPermissionProvider();
if(permissionProvider != null) {
// TODO: Should we provide a world here?
return permissionProvider.playerHas(null, offlinePlayer, permission);
}
// Player offline and no offline permission provider available, safely say that there is no permission
return false;
}
/**
* Method to get the FileManager (loads/save regions and can be used to get regions).
* @return The fileManager
*/
public FileManager getFileManager() {
return fileManager;
}
/**
* Register dynamic permissions controlled by config settings.
*/
private void registerDynamicPermissions() {
// Register limit groups of amount of regions a player can have
ConfigurationSection section = getConfig().getConfigurationSection("limitGroups");
if(section == null) {
return;
}
for(String group : section.getKeys(false)) {
if(!"default".equals(group)) {
Permission perm = new Permission("areashop.limits." + group);
try {
Bukkit.getPluginManager().addPermission(perm);
} catch(IllegalArgumentException e) {
warn("Could not add the following permission to be used as limit: " + perm.getName());
}
}
}
Bukkit.getPluginManager().recalculatePermissionDefaults(Bukkit.getPluginManager().getPermission("playerwarps.limits"));
}
/**
* Register all required tasks.
*/
private void setupTasks() {
// Rent expiration timer
long expirationCheck = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("expiration.delay"));
final AreaShop finalPlugin = this;
if(expirationCheck > 0) {
Do.syncTimer(expirationCheck, () -> {
if(isReady()) {
finalPlugin.getFileManager().checkRents();
AreaShop.debugTask("Checking rent expirations...");
} else {
AreaShop.debugTask("Skipped checking rent expirations, plugin not ready");
}
});
}
// Inactive unrenting/selling timer
long inactiveCheck = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("inactive.delay"));
if(inactiveCheck > 0) {
Do.syncTimer(inactiveCheck, () -> {
if(isReady()) {
finalPlugin.getFileManager().checkForInactiveRegions();
AreaShop.debugTask("Checking for regions with players that are inactive too long...");
} else {
AreaShop.debugTask("Skipped checking for regions of inactive players, plugin not ready");
}
});
}
// Periodic updating of signs for timeleft tags
long periodicUpdate = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("signs.delay"));
if(periodicUpdate > 0) {
Do.syncTimer(periodicUpdate, () -> {
if(isReady()) {
finalPlugin.getFileManager().performPeriodicSignUpdate();
AreaShop.debugTask("Performing periodic sign update...");
} else {
AreaShop.debugTask("Skipped performing periodic sign update, plugin not ready");
}
});
}
// Saving regions and group settings
long saveFiles = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("saving.delay"));
if(saveFiles > 0) {
Do.syncTimer(saveFiles, () -> {
if(isReady()) {
finalPlugin.getFileManager().saveRequiredFiles();
AreaShop.debugTask("Saving required files...");
} else {
AreaShop.debugTask("Skipped saving required files, plugin not ready");
}
});
}
// Sending warnings about rent regions to online players
long expireWarning = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("expireWarning.delay"));
if(expireWarning > 0) {
Do.syncTimer(expireWarning, () -> {
if(isReady()) {
finalPlugin.getFileManager().sendRentExpireWarnings();
AreaShop.debugTask("Sending rent expire warnings...");
} else {
AreaShop.debugTask("Skipped sending rent expire warnings, plugin not ready");
}
});
}
// Update all regions on startup
if(getConfig().getBoolean("updateRegionsOnStartup")) {
Do.syncLater(20, () -> {
finalPlugin.getFileManager().updateAllRegions();
AreaShop.debugTask("Updating all regions at startup...");
});
}
}
/**
* 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);
}
/**
* Return the config.
*/
@Override
public YamlConfiguration getConfig() {
return fileManager.getConfig();
}
/**
* Sends an debug message to the console.
* @param message The message that should be printed to the console
*/
public static void debug(Object... message) {
if(AreaShop.getInstance().debug) {
info("Debug: " + StringUtils.join(message, " "));
}
}
/**
* Non-static debug to use as implementation of the interface.
* @param message Object parts of the message that should be logged, toString() will be used
*/
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(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 message 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(Object... message) {
if(AreaShop.getInstance().getConfig().getBoolean("debugTask")) {
AreaShop.debug(StringUtils.join(message, " "));
}
}
/**
* Reload all files of the plugin and update all regions.
* @param confirmationReceiver The CommandSender which should be notified when complete, null for nobody
*/
public void reload(final CommandSender confirmationReceiver) {
setReady(false);
fileManager.saveRequiredFilesAtOnce();
fileManager.loadFiles(true);
setupLanguageManager();
message(confirmationReceiver, "reload-reloading");
fileManager.checkRents();
fileManager.updateAllRegions(confirmationReceiver);
}
/**
* Reload all files of the plugin and update all regions.
*/
public void reload() {
reload(null);
}
}
@@ -0,0 +1,300 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.bukkitdo.Do;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;
import java.util.UUID;
import java.util.stream.Collectors;
public class AddCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop add";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.createrent")
|| target.hasPermission("areashop.createrent.member")
|| target.hasPermission("areashop.createrent.owner")
|| target.hasPermission("areashop.createbuy")
|| target.hasPermission("areashop.createbuy.member")
|| target.hasPermission("areashop.createbuy.owner")) {
return "help-add";
}
return null;
}
@Override
public void execute(final CommandSender sender, final String[] args) {
if(!sender.hasPermission("areashop.createrent")
&& !sender.hasPermission("areashop.createrent.member")
&& !sender.hasPermission("areashop.createrent.owner")
&& !sender.hasPermission("areashop.createbuy")
&& !sender.hasPermission("areashop.createbuy.member")
&& !sender.hasPermission("areashop.createbuy.owner")) {
plugin.message(sender, "add-noPermission");
return;
}
if(args.length < 2 || args[1] == null || (!"rent".equals(args[1].toLowerCase()) && !"buy".equals(args[1].toLowerCase()))) {
plugin.message(sender, "add-help");
return;
}
Map<String, ProtectedRegion> regions = new HashMap<>();
World world;
Player player = null;
if(sender instanceof Player) {
player = (Player)sender;
}
if(args.length == 2) {
if(player == null) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
world = selection.getWorld();
regions = Utils.getWorldEditRegionsInSelection(selection).stream().collect(Collectors.toMap(ProtectedRegion::getId, region -> region));
if(regions.size() == 0) {
plugin.message(player, "cmd-noWERegionsFound");
return;
}
} else {
if(player != null) {
if(args.length == 4) {
world = Bukkit.getWorld(args[3]);
if(world == null) {
plugin.message(sender, "add-incorrectWorld", args[3]);
return;
}
} else {
world = ((Player)sender).getWorld();
}
} else {
if(args.length < 4) {
plugin.message(sender, "add-specifyWorld");
return;
} else {
world = Bukkit.getWorld(args[3]);
if(world == null) {
plugin.message(sender, "add-incorrectWorld", args[3]);
return;
}
}
}
ProtectedRegion region = plugin.getRegionManager(world).getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-noRegion", args[2]);
return;
}
regions.put(args[2], region);
}
final boolean isRent = "rent".equals(args[1].toLowerCase());
final Player finalPlayer = player;
AreaShop.debug("Starting add task with " + regions.size() + " regions");
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
TreeSet<GeneralRegion> regionsAlready = new TreeSet<>();
TreeSet<GeneralRegion> regionsAlreadyOtherWorld = new TreeSet<>();
TreeSet<String> namesBlacklisted = new TreeSet<>();
TreeSet<String> namesNoPermission = new TreeSet<>();
Do.forAll(
plugin.getConfig().getInt("adding.regionsPerTick"),
regions.entrySet(),
regionEntry -> {
String regionName = regionEntry.getKey();
ProtectedRegion region = regionEntry.getValue();
// Determine if the player is an owner or member of the region
boolean isMember = finalPlayer != null && plugin.getWorldGuardHandler().containsMember(region, finalPlayer.getUniqueId());
boolean isOwner = finalPlayer != null && plugin.getWorldGuardHandler().containsMember(region, finalPlayer.getUniqueId());
String type;
if(isRent) {
type = "rent";
} else {
type = "buy";
}
FileManager.AddResult result = plugin.getFileManager().checkRegionAdd(sender, region, world, isRent ? GeneralRegion.RegionType.RENT : GeneralRegion.RegionType.BUY);
if(result == FileManager.AddResult.ALREADYADDED) {
regionsAlready.add(plugin.getFileManager().getRegion(regionName));
} else if(result == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
regionsAlreadyOtherWorld.add(plugin.getFileManager().getRegion(regionName));
} else if(result == FileManager.AddResult.BLACKLISTED) {
namesBlacklisted.add(regionName);
} else if(result == FileManager.AddResult.NOPERMISSION) {
namesNoPermission.add(regionName);
} else {
// Check if the player should be landlord
boolean landlord = (!sender.hasPermission("areashop.create" + type)
&& ((sender.hasPermission("areashop.create" + type + ".owner") && isOwner)
|| (sender.hasPermission("areashop.create" + type + ".member") && isMember)));
List<UUID> existing = new ArrayList<>();
existing.addAll(plugin.getWorldGuardHandler().getOwners(region).asUniqueIdList());
existing.addAll(plugin.getWorldGuardHandler().getMembers(region).asUniqueIdList());
if(isRent) {
RentRegion rent = new RentRegion(regionName, world);
// Set landlord
if(landlord) {
rent.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
// Run commands
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
rent.update();
// Run commands
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
// Add existing owners/members if any
if(!landlord && !existing.isEmpty()) {
// TODO also execute rent events to notify other plugins?
// Run commands
rent.runEventCommands(GeneralRegion.RegionEvent.RENTED, true);
// Add values to the rent and send it to FileManager
rent.setRentedUntil(Calendar.getInstance().getTimeInMillis() + rent.getDuration());
rent.setRenter(existing.remove(0));
rent.updateLastActiveTime();
// Add others as friends
for(UUID friend : existing) {
rent.getFriendsFeature().addFriend(friend, null);
}
// Fire schematic event and updated times extended
rent.handleSchematicEvent(GeneralRegion.RegionEvent.RENTED);
// Notify about updates
rent.update();
rent.runEventCommands(GeneralRegion.RegionEvent.RENTED, false);
}
regionsSuccess.add(rent);
} else {
BuyRegion buy = new BuyRegion(regionName, world);
// Set landlord
if(landlord) {
buy.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
buy.update();
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
// Add existing owners/members if any
if(!landlord && !existing.isEmpty()) {
// TODO also execute buy events to notify for other plugins?
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.BOUGHT, true);
// Set the owner
buy.setBuyer(existing.remove(0));
buy.updateLastActiveTime();
// Add others as friends
for(UUID friend : existing) {
buy.getFriendsFeature().addFriend(friend, null);
}
// Notify about updates
buy.update();
// Update everything
buy.handleSchematicEvent(GeneralRegion.RegionEvent.BOUGHT);
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.BOUGHT, false);
}
regionsSuccess.add(buy);
}
}
},
() -> {
if(!regionsSuccess.isEmpty()) {
plugin.message(sender, "add-success", args[1], Utils.combinedMessage(regionsSuccess, "region"));
}
if(!regionsAlready.isEmpty()) {
plugin.message(sender, "add-failed", Utils.combinedMessage(regionsAlready, "region"));
}
if(!regionsAlreadyOtherWorld.isEmpty()) {
plugin.message(sender, "add-failedOtherWorld", Utils.combinedMessage(regionsAlreadyOtherWorld, "region"));
}
if(!namesBlacklisted.isEmpty()) {
plugin.message(sender, "add-blacklisted", Utils.createCommaSeparatedList(namesBlacklisted));
}
if(!namesNoPermission.isEmpty()) {
plugin.message(sender, "add-noPermissionRegions", Utils.createCommaSeparatedList(namesNoPermission));
plugin.message(sender, "add-noPermissionOwnerMember");
}
}
);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
if(sender.hasPermission("areashop.createrent")) {
result.add("rent");
}
if(sender.hasPermission("areashop.createbuy")) {
result.add("buy");
}
} else if(toComplete == 3) {
if(sender instanceof Player) {
Player player = (Player)sender;
if(sender.hasPermission("areashop.createrent") || sender.hasPermission("areashop.createbuy")) {
for(ProtectedRegion region : plugin.getRegionManager(player.getWorld()).getRegions().values()) {
result.add(region.getId());
}
}
}
}
return result;
}
}
@@ -0,0 +1,141 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class AddfriendCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop addfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.addfriendall") || target.hasPermission("areashop.addfriend")) {
return "help-addFriend";
}
return null;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.addfriend") && !sender.hasPermission("areashop.addfriendall")) {
plugin.message(sender, "addfriend-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "addfriend-help");
return;
}
GeneralRegion region;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.addfriendall")) {
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
plugin.message(sender, "addfriend-noOwner", region);
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1], region);
return;
}
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName(), region);
return;
}
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "addfriend-successOther", friend.getName(), region);
}
} else {
if(sender.hasPermission("areashop.addfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1], region);
return;
}
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName(), region);
return;
}
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "addfriend-success", friend.getName(), region);
}
} else {
plugin.message(sender, "addfriend-noPermissionOther", region);
}
} else {
plugin.message(sender, "addfriend-noPermission", region);
}
}
}
@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());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,133 +1,125 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.material.Sign;
import org.bukkit.util.BlockIterator;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
public class AddsignCommand extends CommandAreaShop {
public AddsignCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop addsign";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.addsign")) {
return plugin.getLanguageManager().getLang("help-addsign");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.addsign")) {
plugin.message(sender, "addsign-noPermission");
return;
}
if (!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
// Get the sign
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
plugin.message(sender, "addsign-noSign");
return;
}
GeneralRegion region = null;
if(args.length > 1) {
// Get region by argument
region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "addsign-noRegion", args[1]);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = plugin.getFileManager().getASRegionsInSelection(new CuboidSelection(block.getWorld(), block.getLocation(), block.getLocation()));
if(regions.isEmpty()) {
plugin.message(sender, "addsign-noRegions");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "addsign-couldNotDetect", regions.get(0).getName(), regions.get(1).getName());
return;
}
region = regions.get(0);
}
Sign sign = (Sign)block.getState().getData();
String profile = null;
if(args.length > 2) {
profile = args[2];
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
if(!profiles.contains(profile)) {
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles));
return;
}
}
GeneralRegion signRegion = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(signRegion != null) {
plugin.message(sender, "addsign-alreadyRegistered", signRegion.getName());
return;
}
region.addSign(block.getLocation(), block.getType(), sign.getFacing(), profile);
if(profile == null) {
plugin.message(sender, "addsign-success", region.getName());
} else {
plugin.message(sender, "addsign-successProfile", region.getName(), profile);
}
region.updateSigns();
region.saveRequired();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("signProfiles"));
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.material.Sign;
import org.bukkit.util.BlockIterator;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class AddsignCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop addsign";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.addsign")) {
return "help-addsign";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.addsign")) {
plugin.message(sender, "addsign-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
// Get the sign
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
plugin.message(sender, "addsign-noSign");
return;
}
GeneralRegion region;
if(args.length > 1) {
// Get region by argument
region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[1]);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getImportantRegions(block.getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "addsign-noRegions");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "addsign-couldNotDetect", regions.get(0).getName(), regions.get(1).getName());
return;
}
region = regions.get(0);
}
Sign sign = (Sign)block.getState().getData();
String profile = null;
if(args.length > 2) {
profile = args[2];
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
if(!profiles.contains(profile)) {
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles), region);
return;
}
}
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign != null) {
plugin.message(sender, "addsign-alreadyRegistered", regionSign.getRegion());
return;
}
region.getSignsFeature().addSign(block.getLocation(), block.getType(), sign.getFacing(), profile);
if(profile == null) {
plugin.message(sender, "addsign-success", region);
} else {
plugin.message(sender, "addsign-successProfile", profile, region);
}
region.update();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("signProfiles"));
}
return result;
}
}
@@ -1,77 +1,69 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class BuyCommand extends CommandAreaShop {
public BuyCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop buy";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.buy")) {
return plugin.getLanguageManager().getLang("help-buy");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.buy")) {
plugin.message(sender, "buy-noPermission");
return;
}
if (!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(args.length > 1 && args[1] != null) {
BuyRegion region = plugin.getFileManager().getBuy(args[1]);
if(region == null) {
plugin.message(player, "buy-notBuyable");
} else {
region.buy(player);
}
} else {
// get the region by location
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
regions.get(0).buy(player);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(!region.isSold()) {
result.add(region.getName());
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class BuyCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop buy";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.buy")) {
return "help-buy";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.buy")) {
plugin.message(sender, "buy-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(args.length > 1 && args[1] != null) {
BuyRegion region = plugin.getFileManager().getBuy(args[1]);
if(region == null) {
plugin.message(player, "buy-notBuyable", args[1]);
} else {
region.buy(player);
}
} else {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
} else {
regions.get(0).buy(player);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(!region.isSold()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -0,0 +1,102 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.StringUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Abstract class for generalising command classes.
*/
public abstract class CommandAreaShop {
final AreaShop plugin = AreaShop.getInstance();
private final Map<String, CommandTime> lastUsed;
public CommandAreaShop() {
lastUsed = new HashMap<>();
}
/**
* Check if this Command instance can execute the given command and arguments.
* @param command The command to check for execution
* @param args The arguments to check
* @return true if it can execute the command, false otherwise
*/
public boolean canExecute(Command command, String[] args) {
String commandString = command.getName() + " " + StringUtils.join(args, " ");
if(commandString.length() > getCommandStart().length()) {
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase() + " ");
}
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase());
}
/**
* Get a list of string to complete a command with (raw list, not matching ones not filtered out).
* @param toComplete The number of the argument that has to be completed
* @param start The already given start of the command
* @param sender The CommandSender that wants to tab complete
* @return A collection with all the possibilities for argument to complete
*/
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
return new ArrayList<>();
}
/**
* Get the argument that comes after the base command that this command reacts to.
* @return The string that should be in front of the command for this class to act
*/
public abstract String getCommandStart();
/**
* Returns the correct help string key to be used on the help page.
* @param target The CommandSender that the help message is for
* @return The help message key according to the permissions of the reciever
*/
public abstract String getHelp(CommandSender target);
/**
* Execute a (sub)command if the conditions are met.
* @param sender The commandSender that executed the command
* @param args The arguments that are given
*/
public abstract void execute(CommandSender sender, String[] args);
/**
* Confirm a command.
* @param sender To confirm it for, or send a message to confirm
* @param args Command args
* @param message Message to send when confirmation is required
* @return true if confirmed, false if confirmation is required
*/
public boolean confirm(CommandSender sender, String[] args, Message message) {
String command = "/" + getCommandStart() + " " + StringUtils.join(args, " ", 1, args.length);
long now = System.currentTimeMillis();
CommandTime last = lastUsed.get(sender.getName());
if(last != null && last.command.equalsIgnoreCase(command) && last.time > (now - 1000 * 60)) {
return true;
}
message.prefix().append(Message.fromKey("confirm-yes").replacements(command)).send(sender);
lastUsed.put(sender.getName(), new CommandTime(command, now));
return false;
}
private class CommandTime {
public String command;
public long time;
CommandTime(String command, long time) {
this.command = command;
this.time = time;
}
}
}
@@ -0,0 +1,131 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class DelCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop del";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.destroyrent") || target.hasPermission("areashop.destroybuy") || target.hasPermission("areashop.destroyrent.landlord") || target.hasPermission("areashop.destroybuy.landlord")) {
return "help-del";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.destroybuy")
&& !sender.hasPermission("areashop.destroybuy.landlord")
&& !sender.hasPermission("areashop.destroyrent")
&& !sender.hasPermission("areashop.destroyrent.landlord")) {
plugin.message(sender, "del-noPermission");
return;
}
if(args.length < 2) {
// Only players can have a selection
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
if(regions == null || regions.size() == 0) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
// Start removing the regions that he has permission for
ArrayList<String> namesSuccess = new ArrayList<>();
TreeSet<GeneralRegion> namesFailed = new TreeSet<>();
for(GeneralRegion region : regions) {
boolean isLandlord = region.isLandlord(((Player)sender).getUniqueId());
if(region instanceof RentRegion) {
if(!sender.hasPermission("areashop.destroyrent") && !(isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
namesFailed.add(region);
} else {
plugin.getFileManager().removeRent((RentRegion)region, true);
namesSuccess.add(region.getName());
}
} else if(region instanceof BuyRegion) {
if(!sender.hasPermission("areashop.destroybuy") && !(isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
namesFailed.add(region);
} else {
plugin.getFileManager().removeBuy((BuyRegion)region, true);
namesSuccess.add(region.getName());
}
}
}
// send messages
if(namesSuccess.size() != 0) {
plugin.message(sender, "del-success", Utils.createCommaSeparatedList(namesSuccess));
}
if(namesFailed.size() != 0) {
plugin.message(sender, "del-failed", Utils.combinedMessage(namesFailed, "region"));
}
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[1]);
return;
}
boolean isLandlord = sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId());
if(region instanceof RentRegion) {
// Remove the rent if the player has permission
if(sender.hasPermission("areashop.destroyrent") || (isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
plugin.getFileManager().removeRent((RentRegion)region, true);
plugin.message(sender, "destroy-successRent", region);
} else {
plugin.message(sender, "destroy-noPermissionRent", region);
}
} else if(region instanceof BuyRegion) {
// Remove the buy if the player has permission
if(sender.hasPermission("areashop.destroybuy") || (isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
plugin.getFileManager().removeBuy((BuyRegion)region, true);
plugin.message(sender, "destroy-successBuy", region);
} else {
plugin.message(sender, "destroy-noPermissionBuy", region);
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -0,0 +1,139 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class DelfriendCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop delfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.delfriendall") || target.hasPermission("areashop.delfriend")) {
return "help-delFriend";
}
return null;
}
/**
* Check if a person can remove friends.
* @param person The person to check
* @param region The region to check for
* @return true if the person can remove friends, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(person.hasPermission("areashop.delfriendall")) {
return true;
}
if(person instanceof Player) {
Player player = (Player)person;
return region.isOwner(player) && player.hasPermission("areashop.delfriend");
}
return false;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.delfriend") && !sender.hasPermission("areashop.delfriendall")) {
plugin.message(sender, "delfriend-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "delfriend-help");
return;
}
GeneralRegion region;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.delfriendall")) {
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
plugin.message(sender, "delfriend-noOwner", region);
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
return;
}
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "delfriend-successOther", friend.getName(), region);
}
} else {
if(sender.hasPermission("areashop.delfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
return;
}
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
region.update();
plugin.message(sender, "delfriend-success", friend.getName(), region);
}
} else {
plugin.message(sender, "delfriend-noPermissionOther", region);
}
} else {
plugin.message(sender, "delfriend-noPermission", region);
}
}
}
@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());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,86 +1,78 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockIterator;
public class DelsignCommand extends CommandAreaShop {
public DelsignCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop delsign";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.delsign")) {
return plugin.getLanguageManager().getLang("help-delsign");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.delsign")) {
plugin.message(sender, "delsign-noPermission");
return;
}
if (!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
// Get the sign
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
plugin.message(sender, "delsign-noSign");
return;
}
GeneralRegion region = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(region == null) {
plugin.message(sender, "delsign-noRegion");
return;
}
plugin.message(sender, "delsign-success", region.getName());
region.removeSign(block.getLocation());
region.updateSigns();
region.saveRequired();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
return new ArrayList<String>();
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.BlockIterator;
import java.util.ArrayList;
import java.util.List;
public class DelsignCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop delsign";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.delsign")) {
return "help-delsign";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.delsign")) {
plugin.message(sender, "delsign-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
// Get the sign
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
plugin.message(sender, "delsign-noSign");
return;
}
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign == null) {
plugin.message(sender, "delsign-noRegion");
return;
}
plugin.message(sender, "delsign-success", regionSign.getRegion());
regionSign.remove();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
return new ArrayList<>();
}
}
@@ -0,0 +1,190 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class FindCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop find";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.find")) {
return "help-find";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.find")) {
plugin.message(sender, "find-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
if(args.length <= 1 || args[1] == null || (!args[1].equalsIgnoreCase("buy") && !args[1].equalsIgnoreCase("rent"))) {
plugin.message(sender, "find-help");
return;
}
Player player = (Player)sender;
double balance = 0.0;
if(plugin.getEconomy() != null) {
balance = plugin.getEconomy().getBalance(player);
}
double maxPrice = 0;
boolean maxPriceSet = false;
RegionGroup group = null;
// Parse optional price argument
if(args.length >= 3) {
try {
maxPrice = Double.parseDouble(args[2]);
maxPriceSet = true;
} catch(NumberFormatException e) {
plugin.message(sender, "find-wrongMaxPrice", args[2]);
return;
}
}
// Parse optional group argument
if(args.length >= 4) {
group = plugin.getFileManager().getGroup(args[3]);
if(group == null) {
plugin.message(sender, "find-wrongGroup", args[3]);
return;
}
}
// Find buy regions
if(args[1].equalsIgnoreCase("buy")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
List<BuyRegion> results = new ArrayList<>();
for(BuyRegion region : regions) {
if(!region.isSold()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
BuyRegion region = results.get(new Random().nextInt(results.size()));
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
// Teleport
if(maxPriceSet) {
plugin.message(player, "find-successMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup, region);
} else {
plugin.message(player, "find-success", "buy", Utils.formatCurrency(balance), onlyInGroup, region);
}
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFoundMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup);
} else {
plugin.message(player, "find-noneFound", "buy", Utils.formatCurrency(balance), onlyInGroup);
}
}
}
// Find rental regions
else {
List<RentRegion> regions = plugin.getFileManager().getRents();
List<RentRegion> results = new ArrayList<>();
for(RentRegion region : regions) {
if(!region.isRented()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
RentRegion region = results.get(new Random().nextInt(results.size()));
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
// Teleport
if(maxPriceSet) {
plugin.message(player, "find-successMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup, region);
} else {
plugin.message(player, "find-success", "rent", Utils.formatCurrency(balance), onlyInGroup, region);
}
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
Message onlyInGroup = Message.empty();
if(group != null) {
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFoundMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup);
} else {
plugin.message(player, "find-noneFound", "rent", Utils.formatCurrency(balance), onlyInGroup);
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.add("buy");
result.add("rent");
}
return result;
}
}
@@ -1,126 +1,113 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RegionGroup;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.sk89q.worldedit.bukkit.selections.Selection;
public class GroupaddCommand extends CommandAreaShop {
public GroupaddCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop groupadd";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupadd")) {
return plugin.getLanguageManager().getLang("help-groupadd");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.groupadd")) {
plugin.message(sender, "groupadd-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupadd-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
group = new RegionGroup(plugin, args[1]);
plugin.getFileManager().addGroup(group);
group.saveRequired();
}
if(args.length == 2) {
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = plugin.getFileManager().getASRegionsInSelection(selection);
if(regions.size() == 0) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
ArrayList<String> namesSuccess = new ArrayList<String>();
ArrayList<String> namesFailed = new ArrayList<String>();
ArrayList<GeneralRegion> toUpdate = new ArrayList<GeneralRegion>();
for(GeneralRegion region : regions) {
if(group.addMember(region)) {
namesSuccess.add(region.getName());
toUpdate.add(region);
} else {
namesFailed.add(region.getName());
}
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(toUpdate);
if(namesSuccess.size() != 0) {
plugin.message(player, "groupadd-weSuccess", group.getName(), Utils.createCommaSeparatedList(namesSuccess));
}
if(namesFailed.size() != 0) {
plugin.message(player, "groupadd-weFailed", group.getName(), Utils.createCommaSeparatedList(namesFailed));
}
group.saveRequired();
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "groupadd-noRegion", args[2]);
return;
}
if(group.addMember(region)) {
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "groupadd-success", region.getName(), group.getName(), group.getMembers().size());
} else {
plugin.message(sender, "groupadd-failed", region.getName(), group.getName());
}
group.saveRequired();
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
} else if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class GroupaddCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop groupadd";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupadd")) {
return "help-groupadd";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.groupadd")) {
plugin.message(sender, "groupadd-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupadd-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
group = new RegionGroup(plugin, args[1]);
plugin.getFileManager().addGroup(group);
}
if(args.length == 2) {
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
if(regions.size() == 0) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
for(GeneralRegion region : regions) {
if(group.addMember(region)) {
regionsSuccess.add(region);
} else {
regionsFailed.add(region);
}
}
if(regionsSuccess.size() != 0) {
plugin.message(player, "groupadd-weSuccess", group.getName(), Utils.combinedMessage(regionsSuccess, "region"));
}
if(regionsFailed.size() != 0) {
plugin.message(player, "groupadd-weFailed", group.getName(), Utils.combinedMessage(regionsFailed, "region"));
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(new ArrayList<>(regionsSuccess), player);
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
if(group.addMember(region)) {
region.update();
plugin.message(sender, "groupadd-success", group.getName(), group.getMembers().size(), region);
} else {
plugin.message(sender, "groupadd-failed", group.getName(), region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
} else if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -0,0 +1,115 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class GroupdelCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop groupdel";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupdel")) {
return "help-groupdel";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.groupdel")) {
plugin.message(sender, "groupdel-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupdel-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
plugin.message(sender, "groupdel-wrongGroup", args[1]);
return;
}
if(args.length == 2) {
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Player player = (Player)sender;
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
if(regions.size() == 0) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
for(GeneralRegion region : regions) {
if(group.removeMember(region)) {
regionsSuccess.add(region);
} else {
regionsFailed.add(region);
}
}
if(regionsSuccess.size() != 0) {
plugin.message(player, "groupdel-weSuccess", group.getName(), Utils.combinedMessage(regionsSuccess, "region"));
}
if(regionsFailed.size() != 0) {
plugin.message(player, "groupdel-weFailed", group.getName(), Utils.combinedMessage(regionsFailed, "region"));
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(new ArrayList<>(regionsSuccess), player);
group.saveRequired();
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
if(group.removeMember(region)) {
region.update();
plugin.message(sender, "groupdel-success", group.getName(), group.getMembers().size(), region);
} else {
plugin.message(sender, "groupdel-failed", group.getName(), region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
} else if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -1,75 +1,69 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.RegionGroup;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class GroupinfoCommand extends CommandAreaShop {
public GroupinfoCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop groupinfo";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupinfo")) {
return plugin.getLanguageManager().getLang("help-groupinfo");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.groupinfo")) {
plugin.message(sender, "groupinfo-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupinfo-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
plugin.message(sender, "groupinfo-noGroup", args[1]);
return;
}
List<String> members = group.getMembers();
if(members.size() == 0) {
plugin.message(sender, "groupinfo-noMembers", group.getName());
} else {
plugin.message(sender, "groupinfo-members", group.getName(), Utils.createCommaSeparatedList(members));
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class GroupinfoCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop groupinfo";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupinfo")) {
return "help-groupinfo";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.groupinfo")) {
plugin.message(sender, "groupinfo-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "groupinfo-help");
return;
}
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
if(group == null) {
plugin.message(sender, "groupinfo-noGroup", args[1]);
return;
}
Set<String> members = group.getMembers();
if(members.size() == 0) {
plugin.message(sender, "groupinfo-noMembers", group.getName());
} else {
plugin.message(sender, "groupinfo-members", group.getName(), Utils.createCommaSeparatedList(members));
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
}
return result;
}
}
@@ -1,60 +1,53 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class GrouplistCommand extends CommandAreaShop {
public GrouplistCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop grouplist";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.grouplist")) {
return plugin.getLanguageManager().getLang("help-grouplist");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.grouplist")) {
plugin.message(sender, "grouplist-noPermission");
return;
}
List<String> groups = plugin.getFileManager().getGroupNames();
if(groups.size() == 0) {
plugin.message(sender, "grouplist-noGroups");
} else {
plugin.message(sender, "grouplist-success", Utils.createCommaSeparatedList(groups));
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
return new ArrayList<String>();
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class GrouplistCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop grouplist";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.grouplist")) {
return "help-grouplist";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.grouplist")) {
plugin.message(sender, "grouplist-noPermission");
return;
}
List<String> groups = plugin.getFileManager().getGroupNames();
if(groups.size() == 0) {
plugin.message(sender, "grouplist-noGroups");
} else {
plugin.message(sender, "grouplist-success", Utils.createCommaSeparatedList(groups));
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
return new ArrayList<>();
}
}
@@ -0,0 +1,24 @@
package me.wiefferink.areashop.commands;
import org.bukkit.command.CommandSender;
public class HelpCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop help";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.help")) {
return "help-help";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
plugin.getCommandManager().showHelp(sender);
}
}
@@ -0,0 +1,79 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class ImportCommand extends CommandAreaShop {
/* RegionGroup priority usage:
0: Settings from /config.yml
1: Settings from /worlds/<world>/config.yml
2: Settings from /worlds/<world>/parent-regions.yml (if their priority is set it is added to this value)
*/
@Override
public String getCommandStart() {
return "areashop import";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.import")) {
return "help-import";
}
return null;
}
// TODO
// - Landlord?
// - Friends
// - Region flags?
// - Settings from the 'permissions' section in RegionForSale/config.yml?
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.import")) {
plugin.message(sender, "import-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "import-help");
return;
}
if(!"RegionForSale".equalsIgnoreCase(args[1])) {
plugin.message(sender, "import-wrongSource");
return;
}
if(!confirm(sender, args, Message.fromKey("import-confirm"))) {
return;
}
ImportJob importJob = new ImportJob(sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.add("RegionForSale");
}
return result;
}
}
@@ -0,0 +1,477 @@
package me.wiefferink.areashop.commands;
import com.google.common.base.Charsets;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
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.Bukkit;
import org.bukkit.Location;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class ImportJob {
private final AreaShop plugin;
private final CommandSender sender;
/**
* Create and execute the import.
* @param sender CommandSender that should receive progress updates
*/
public ImportJob(CommandSender sender) {
this.sender = sender;
this.plugin = AreaShop.getInstance();
execute();
}
/**
* Execute the job.
*/
private void execute() {
// Check for RegionForSale data
File regionForSaleFolder = new File(plugin.getDataFolder().getParentFile().getAbsolutePath(), "RegionForSale");
if(!regionForSaleFolder.exists()) {
message("import-noPluginFolder", regionForSaleFolder.getName());
return;
}
File worldsFolder = new File(regionForSaleFolder.getAbsolutePath(), "worlds");
if(!worldsFolder.exists()) {
message("import-noWorldsFolder");
return;
}
File[] worldFolders = worldsFolder.listFiles();
if(worldFolders == null) {
message("import-noWorldsFolder");
return;
}
// Import data for each world
message("import-start");
// Group with settings for all imported regions
RegionGroup regionForSaleGroup = new RegionGroup(plugin, "RegionForSale");
plugin.getFileManager().addGroup(regionForSaleGroup);
// Import /RegionForSale/config.yml settings
File regionForSaleConfigFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
YamlConfiguration regionForSaleConfig = loadConfiguration(regionForSaleConfigFile);
if(regionForSaleConfig == null) {
messageNoPrefix("import-loadConfigFailed", regionForSaleConfigFile.getAbsolutePath());
regionForSaleConfig = new YamlConfiguration();
} else {
importRegionSettings(regionForSaleConfig, regionForSaleGroup.getSettings(), null, false);
regionForSaleGroup.setSetting("priority", 0);
}
// Import /RegionForSale/general.yml settings
File regionForSaleGeneralFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
YamlConfiguration regionForSaleGeneral = loadConfiguration(regionForSaleConfigFile);
if(regionForSaleGeneral == null) {
messageNoPrefix("import-loadConfigFailed", regionForSaleGeneralFile.getAbsolutePath());
} else {
// Collection interval of RegionForSale maps to rent duration
String duration = "1 day";
if(regionForSaleGeneral.isLong("interval.collect_money")) {
duration = minutesToString(regionForSaleGeneral.getLong("interval.collect_money"));
}
regionForSaleGroup.setSetting("rent.duration", duration);
// Global economy account has an effect close to landlord in AreaShop
if(regionForSaleGeneral.isString("global_econ_account")) {
regionForSaleGroup.setSetting("general.landlordName", regionForSaleGeneral.getString("global_econ_account"));
}
}
regionForSaleGroup.saveRequired();
////////// Handle defaults of RegionForSale
// Set autoExtend, to keep the same behavior as RegionForSale had
regionForSaleGroup.setSetting("rent.autoExtend", true);
// Import regions from each world
for(File worldFolder : worldFolders) {
// Skip files
if(!worldFolder.isDirectory() || worldFolder.isHidden()) {
continue;
}
messageNoPrefix("import-doWorld", worldFolder.getName());
// Get the Bukkit world
World world = Bukkit.getWorld(worldFolder.getName());
if(world == null) {
messageNoPrefix("import-noBukkitWorld");
continue;
}
// Get the WorldGuard RegionManager
RegionManager regionManager = plugin.getRegionManager(world);
if(regionManager == null) {
messageNoPrefix("import-noRegionManger");
continue;
}
// Load the /worlds/<world>/regions.yml file
File regionsFile = new File(worldFolder.getAbsolutePath(), "regions.yml");
YamlConfiguration regions = loadConfiguration(regionsFile);
if(regions == null) {
messageNoPrefix("import-loadRegionsFailed", regionsFile.getAbsolutePath());
continue;
}
// Load /worlds/<world>/config.yml file
File worldConfigFile = new File(worldFolder.getAbsolutePath(), "config.yml");
YamlConfiguration worldConfig = loadConfiguration(worldConfigFile);
if(worldConfig == null) {
messageNoPrefix("import-loadWorldConfigFailed", worldConfigFile.getAbsolutePath());
// Simply skip importing the settings, since this is not really fatal
worldConfig = new YamlConfiguration();
} else {
// RegionGroup with all world settings
RegionGroup worldGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName());
importRegionSettings(worldConfig, worldGroup.getSettings(), null, false);
worldGroup.setSetting("priority", 1);
worldGroup.addWorld(worldFolder.getName());
plugin.getFileManager().addGroup(regionForSaleGroup);
worldGroup.saveRequired();
}
// Create groups to hold settings of /worlds/<world>/parent-regions.yml
File parentRegionsFile = new File(worldFolder.getAbsolutePath(), "parent-regions.yml");
YamlConfiguration parentRegions = loadConfiguration(parentRegionsFile);
if(parentRegions == null) {
messageNoPrefix("import-loadParentRegionsFailed", parentRegionsFile.getAbsolutePath());
// Non-fatal, so just continue
} else {
for(String parentRegionName : parentRegions.getKeys(false)) {
// Get WorldGuard region
ProtectedRegion worldGuardRegion = regionManager.getRegion(parentRegionName);
if(worldGuardRegion == null) {
messageNoPrefix("import-noWorldGuardRegionParent", parentRegionName);
continue;
}
// Get settings section
ConfigurationSection parentRegionSection = parentRegions.getConfigurationSection(parentRegionName);
if(parentRegionSection == null) {
messageNoPrefix("import-improperParentRegion", parentRegionName);
continue;
}
// Skip if it does not have any settings
if(parentRegionSection.getKeys(false).isEmpty()) {
continue;
}
// Import parent region settings into a RegionGroup
RegionGroup parentRegionGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName() + "-" + parentRegionName);
importRegionSettings(parentRegionSection, parentRegionGroup.getSettings(), null, false);
parentRegionGroup.setSetting("priority", 2 + parentRegionSection.getLong("info.priority", 0));
parentRegionGroup.saveRequired();
// TODO add all regions that are contained in this parent region
// Utils.getWorldEditRegionsInSelection()
}
}
// Read and import regions
for(String regionKey : regions.getKeys(false)) {
GeneralRegion existingRegion = plugin.getFileManager().getRegion(regionKey);
if(existingRegion != null) {
if(world.getName().equalsIgnoreCase(existingRegion.getWorldName())) {
messageNoPrefix("import-alreadyAdded", regionKey);
} else {
messageNoPrefix("import-alreadyAddedOtherWorld", regionKey, existingRegion.getWorldName(), world.getName());
}
continue;
}
ConfigurationSection regionSection = regions.getConfigurationSection(regionKey);
if(regionSection == null) {
messageNoPrefix("import-invalidRegionSection", regionKey);
continue;
}
// Get WorldGuard region
ProtectedRegion worldGuardRegion = regionManager.getRegion(regionKey);
if(worldGuardRegion == null) {
messageNoPrefix("import-noWorldGuardRegion", regionKey);
continue;
}
String owner = regionSection.getString("info.owner", null);
boolean isBought = regionSection.getBoolean("info.is-bought");
// TODO: should also take into config settings of parent regions
boolean rentable = regionSection.getBoolean("economic-settings.rentable", worldConfig.getBoolean("economic-settings.rentable", regionForSaleConfig.getBoolean("economic-settings.rentable")));
boolean buyable = regionSection.getBoolean("economic-settings.buyable", worldConfig.getBoolean("economic-settings.buyable", regionForSaleConfig.getBoolean("economic-settings.buyable")));
// Can be bought and rented, import as buy
if(buyable && rentable) {
messageNoPrefix("import-buyAndRent", regionKey);
}
// Cannot be bought or rented, skip
if(!buyable && !rentable && owner == null) {
messageNoPrefix("import-noBuyAndNoRent", regionKey);
continue;
}
// Create region
GeneralRegion region;
if(rentable || (owner != null && !isBought)) {
region = new RentRegion(regionKey, world);
plugin.getFileManager().addRent((RentRegion)region);
} else {
region = new BuyRegion(regionKey, world);
plugin.getFileManager().addBuy((BuyRegion)region);
}
// Import settings
importRegionSettings(regionSection, region.getConfig(), region, !buyable && !rentable);
region.getConfig().set("general.importedFrom", "RegionForSale");
// Get existing owners and members
List<UUID> existing = new ArrayList<>();
if(owner != null) {
@SuppressWarnings("deprecation")
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(owner);
if(offlinePlayer != null) {
existing.add(offlinePlayer.getUniqueId());
}
}
for(UUID uuid : plugin.getWorldGuardHandler().getOwners(worldGuardRegion).asUniqueIdList()) {
if(!existing.contains(uuid)) {
existing.add(uuid);
}
}
for(UUID uuid : plugin.getWorldGuardHandler().getMembers(worldGuardRegion).asUniqueIdList()) {
if(!existing.contains(uuid)) {
existing.add(uuid);
}
}
// First owner (or if none, the first member) will be the renter/buyer
if(!existing.isEmpty()) {
region.setOwner(existing.remove(0));
}
// Add others as friends
for(UUID friend : existing) {
region.getFriendsFeature().addFriend(friend, null);
}
region.saveRequired();
messageNoPrefix("import-imported", regionKey);
}
}
// Update all regions
plugin.getFileManager().updateAllRegions(sender);
// Write all imported regions and settings to disk
plugin.getFileManager().saveRequiredFiles();
}
/**
* Load a YamlConfiguration from disk using UTF-8 encoding.
* @param from File to read the configuration from
* @return YamlConfiguration if the file exists and got read wihout problems, otherwise null
*/
private YamlConfiguration loadConfiguration(File from) {
try(
InputStreamReader reader = new InputStreamReader(new FileInputStream(from), Charsets.UTF_8)
) {
return YamlConfiguration.loadConfiguration(reader);
} catch(IOException e) {
return null;
}
}
/**
* Import region specific settings from a RegionForSale source to an AreaShop target ConfigurationSection.
* @param from RegionForSale config section that specifies region settings
* @param to AreaShop config section that specifies region settings
* @param region GeneralRegion to copy settings to, or null if doing generic settings
* @param permanent Region cannot be rented or bought, disables some features
*/
private void importRegionSettings(ConfigurationSection from, ConfigurationSection to, GeneralRegion region, boolean permanent) {
// Maximum rental time, TODO check if this is actually the same
if(from.isLong("permissions.max-rent-time")) {
to.set("rent.maxRentTime", minutesToString(from.getLong("permissions.max-rent-time")));
}
// Region rebuild
if(from.getBoolean("region-rebuilding.auto-rebuild")) {
to.set("general.enableRestore", true);
}
// Get price settings
String unit = from.getString("economic-settings.unit-type");
String rentPrice = from.getString("economic-settings.cost-per-unit.rent");
String buyPrice = from.getString("economic-settings.cost-per-unit.buy");
String sellPrice = from.getString("economic-settings.cost-per-unit.selling-price");
// TODO: There is no easy way to import this, setup eventCommandsProfile?
String taxes = from.getString("economic-settings.cost-per-unit.taxes");
// Determine unit and add that to the price
String unitSuffix = "";
if("region".equalsIgnoreCase(unit)) {
// add nothing
} else if("m3".equalsIgnoreCase(unit)) {
unitSuffix = "*%volume%";
} else { // m2 or nothing (in case not set, we should actually look in parent files to correctly set this...)
unitSuffix = "*(%volume%/%height%)"; // This is better than width*depth because of polygon regions
}
// Apply settings
if(rentPrice != null) {
to.set("rent.price", rentPrice + unitSuffix);
}
if(buyPrice != null) {
to.set("buy.price", buyPrice + unitSuffix);
if(sellPrice != null) {
try {
double buyPriceAmount = Double.parseDouble(buyPrice);
double sellPriceAmount = Double.parseDouble(sellPrice);
to.set("buy.moneyBack", sellPriceAmount / buyPriceAmount * 100);
} catch(NumberFormatException e) {
// There is not always a region here for the message, should probably indicate something though
message("import-moneyBackFailed", buyPrice, sellPrice);
}
}
}
// Apply permanent region settings
if(permanent) {
to.set("buy.resellDisabled", true);
to.set("buy.sellDisabled", true);
to.set("general.countForLimits", false);
}
// Set rented until
if(from.isLong("info.last-withdrawal")
&& region instanceof RentRegion) {
RentRegion rentRegion = (RentRegion)region;
long lastWithdrawal = from.getLong("info.last-withdrawal");
// Because the rental duration is already imported into the region and its parents this should be correct
rentRegion.setRentedUntil(lastWithdrawal + rentRegion.getDuration());
}
// Import signs (list of strings like "297, 71, -22")
if(from.isList("info.signs") && region != null) {
for(String signLocation : from.getStringList("info.signs")) {
String[] locationParts = signLocation.split(", ");
if(locationParts.length != 3) {
message("import-invalidSignLocation", region.getName(), signLocation);
continue;
}
// Parse the location
Location location;
try {
location = new Location(region.getWorld(), Double.parseDouble(locationParts[0]), Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]));
} catch(NumberFormatException e) {
message("import-invalidSignLocation", region.getName(), signLocation);
continue;
}
// Check if this location is already added to a region
RegionSign regionSign = SignsFeature.getSignByLocation(location);
if(regionSign != null) {
if(!regionSign.getRegion().equals(region)) {
message("import-signAlreadyAdded", region.getName(), signLocation, regionSign.getRegion().getName());
}
continue;
}
// SignType and Facing will be written when the sign is updated later
region.getSignsFeature().addSign(location, null, null, null);
}
}
}
private static class TimeUnit {
public long minutes;
public String identifier;
TimeUnit(long minutes, String identifier) {
this.minutes = minutes;
this.identifier = identifier;
}
}
private static final List<TimeUnit> timeUnitLookup = new ArrayList<TimeUnit>() {
{
add(new TimeUnit(60 * 24 * 30 * 12, "year"));
add(new TimeUnit(60 * 24 * 30, "month"));
add(new TimeUnit(60 * 24, "day"));
add(new TimeUnit(60, "hour"));
}
};
/**
* Convert minutes to a human-readable string.
* @param minutes Value to convert
* @return String that represents the same length of time in a readable format, like "1 day", "5 minutes", "3 months"
*/
private String minutesToString(long minutes) {
// If the specified number of minutes can map nicely to a higher unit, use that one
String resultUnit = "minute";
long resultValue = minutes;
for(TimeUnit unit : timeUnitLookup) {
long result = minutes / unit.minutes;
if(resultValue * unit.minutes == minutes) {
resultUnit = unit.identifier;
resultValue = result;
break;
}
}
return resultValue + " " + resultUnit + (resultValue == 1 ? "" : "s");
}
/**
* Send a message to a target without a prefix.
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void messageNoPrefix(String key, Object... replacements) {
plugin.messageNoPrefix(sender, key, replacements);
if(!(sender instanceof ConsoleCommandSender)) {
plugin.messageNoPrefix(Bukkit.getConsoleSender(), key, replacements);
}
}
/**
* Send a message to a target, prefixed by the default chat prefix.
* @param key The key of the language string
* @param replacements The replacements to insert in the message
*/
public void message(String key, Object... replacements) {
plugin.message(sender, key, replacements);
if(!(sender instanceof ConsoleCommandSender)) {
plugin.message(Bukkit.getConsoleSender(), key, replacements);
}
}
}
@@ -0,0 +1,484 @@
package me.wiefferink.areashop.commands;
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 me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
// TODO fix '/as info' help message hitting replacement limit (improve depth tracking?)
// TODO add info about autoExtend
public class InfoCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop info";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.info")) {
return "help-info";
}
return null;
}
/**
* Display a page of a list of regions.
* @param sender The CommandSender to send the messages to
* @param regions The regions to display
* @param filterGroup The group to filter the regions by
* @param keyHeader The header to print above the page
* @param pageInput The page number, if any
* @param baseCommand The command to execute for next/previous page (/areashop will be added)
*/
private void showSortedPagedList(CommandSender sender, List<? extends GeneralRegion> regions, RegionGroup filterGroup, String keyHeader, String pageInput, String baseCommand) {
int maximumItems = 20;
int itemsPerPage = maximumItems - 2;
int page = 1;
if(pageInput != null && Utils.isNumeric(pageInput)) {
try {
page = Integer.parseInt(pageInput);
} catch(NumberFormatException e) {
plugin.message(sender, "info-wrongPage", pageInput);
return;
}
}
if(filterGroup != null) {
regions.removeIf(generalRegion -> !filterGroup.isMember(generalRegion));
}
if(regions.isEmpty()) {
plugin.message(sender, "info-noRegions");
} else {
// First sort by type, then by name
regions.sort((one, two) -> {
int typeCompare = getTypeOrder(two).compareTo(getTypeOrder(one));
if(typeCompare != 0) {
return typeCompare;
} else {
return one.getName().compareTo(two.getName());
}
});
// Header
Message limitedToGroup = Message.empty();
if(filterGroup != null) {
limitedToGroup = Message.fromKey("info-limitedToGroup").replacements(filterGroup.getName());
}
plugin.message(sender, keyHeader, limitedToGroup);
// Page entries
int totalPages = (int)Math.ceil(regions.size() / (double)itemsPerPage); // Clip page to correct boundaries, not much need to tell the user
if(regions.size() == itemsPerPage + 1) { // 19 total items is mapped to 1 page of 19
itemsPerPage++;
totalPages = 1;
}
page = Math.max(1, Math.min(totalPages, page));
int linesPrinted = 1; // header
for(int i = (page - 1) * itemsPerPage; i < page * itemsPerPage && i < regions.size(); i++) {
String state;
GeneralRegion region = regions.get(i);
if(region.getType() == GeneralRegion.RegionType.RENT) {
if(region.getOwner() == null) {
state = "Forrent";
} else {
state = "Rented";
}
} else {
if(region.getOwner() == null) {
state = "Forsale";
} else if(!((BuyRegion)region).isInResellingMode()) {
state = "Sold";
} else {
state = "Reselling";
}
}
plugin.messageNoPrefix(sender, "info-entry" + state, region);
linesPrinted++;
}
Message footer = Message.empty();
// Previous button
if(page > 1) {
footer.append(Message.fromKey("info-pagePrevious").replacements(baseCommand + " " + (page - 1)));
} else {
footer.append(Message.fromKey("info-pageNoPrevious"));
}
// Page status
if(totalPages > 1) {
String pageString = "" + page;
for(int i = pageString.length(); i < (totalPages + "").length(); i++) {
pageString = "0" + pageString;
}
footer.append(Message.fromKey("info-pageStatus").replacements(page, totalPages));
if(page < totalPages) {
footer.append(Message.fromKey("info-pageNext").replacements(baseCommand + " " + (page + 1)));
} else {
footer.append(Message.fromKey("info-pageNoNext"));
}
// Fill up space if the page is not full (aligns header nicely)
for(int i = linesPrinted; i < maximumItems - 1; i++) {
sender.sendMessage(" ");
}
footer.send(sender);
}
}
}
/**
* Get an integer to order by type, usable for Comparators.
* @param region The region to get the order for
* @return An integer for sorting by type
*/
private Integer getTypeOrder(GeneralRegion region) {
if(region.getType() == GeneralRegion.RegionType.RENT) {
if(region.getOwner() == null) {
return 1;
} else {
return 2;
}
} else {
if(region.getOwner() == null) {
return 3;
} else if(!((BuyRegion)region).isInResellingMode()) {
return 4;
} else {
return 5;
}
}
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.info")) {
plugin.message(sender, "info-noPermission");
return;
}
if(args.length > 1 && args[1] != null) {
// Get filter group (only used by some commands)
RegionGroup filterGroup = null;
Set<String> groupFilters = new HashSet<>(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "reselling"));
if(groupFilters.contains(args[1].toLowerCase()) && args.length > 2) {
if(!Utils.isNumeric(args[2])) {
filterGroup = plugin.getFileManager().getGroup(args[2]);
if(filterGroup == null) {
plugin.message(sender, "info-noFiltergroup", args[2]);
return;
}
// Pass page number to args[2] if available
if(args.length > 3) {
args[2] = args[3];
}
}
}
// All regions
if(args[1].equalsIgnoreCase("all")) {
showSortedPagedList(sender, plugin.getFileManager().getRegions(), filterGroup, "info-allHeader", (args.length > 2 ? args[2] : null), "info all");
}
// Rented regions
else if(args[1].equalsIgnoreCase("rented")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
regions.removeIf(RentRegion::isAvailable);
showSortedPagedList(sender, regions, filterGroup, "info-rentedHeader", (args.length > 2 ? args[2] : null), "info rented");
}
// Forrent regions
else if(args[1].equalsIgnoreCase("forrent")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
regions.removeIf(RentRegion::isRented);
showSortedPagedList(sender, regions, filterGroup, "info-forrentHeader", (args.length > 2 ? args[2] : null), "info forrent");
}
// Sold regions
else if(args[1].equalsIgnoreCase("sold")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(BuyRegion::isAvailable);
showSortedPagedList(sender, regions, filterGroup, "info-soldHeader", (args.length > 2 ? args[2] : null), "info sold");
}
// Forsale regions
else if(args[1].equalsIgnoreCase("forsale")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(BuyRegion::isSold);
showSortedPagedList(sender, regions, filterGroup, "info-forsaleHeader", (args.length > 2 ? args[2] : null), "info forsale");
}
// Reselling regions
else if(args[1].equalsIgnoreCase("reselling")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
regions.removeIf(region -> !region.isInResellingMode());
showSortedPagedList(sender, regions, filterGroup, "info-resellingHeader", (args.length > 2 ? args[2] : null), "info reselling");
}
// List of regions without a group
else if(args[1].equalsIgnoreCase("nogroup")) {
List<GeneralRegion> regions = plugin.getFileManager().getRegions();
for(RegionGroup group : plugin.getFileManager().getGroups()) {
regions.removeAll(group.getMemberRegions());
}
if(regions.isEmpty()) {
plugin.message(sender, "info-nogroupNone");
} else {
showSortedPagedList(sender, regions, filterGroup, "info-nogroupHeader", (args.length > 2 ? args[2] : null), "info nogroup");
}
}
// Region info
else if(args[1].equalsIgnoreCase("region")) {
if(args.length > 1) {
RentRegion rent = null;
BuyRegion buy = null;
if(args.length > 2) {
rent = plugin.getFileManager().getRent(args[2]);
buy = plugin.getFileManager().getBuy(args[2]);
} else {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
if(regions.get(0) instanceof RentRegion) {
rent = (RentRegion)regions.get(0);
} else if(regions.get(0) instanceof BuyRegion) {
buy = (BuyRegion)regions.get(0);
}
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
}
if(rent == null && buy == null) {
plugin.message(sender, "info-regionNotExisting", args[2]);
return;
}
if(rent != null) {
plugin.message(sender, "info-regionHeaderRent", rent);
if(rent.isRented()) {
plugin.messageNoPrefix(sender, "info-regionRented", rent);
plugin.messageNoPrefix(sender, "info-regionExtending", rent);
// Money back
if(UnrentCommand.canUse(sender, rent)) {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRentClick", rent);
} else {
plugin.messageNoPrefix(sender, "info-regionMoneyBackRent", rent);
}
// Friends
if(!rent.getFriendsFeature().getFriendNames().isEmpty()) {
String messagePart = "info-friend";
if(DelfriendCommand.canUse(sender, rent)) {
messagePart = "info-friendRemove";
}
plugin.messageNoPrefix(sender, "info-regionFriends", rent, Utils.combinedMessage(rent.getFriendsFeature().getFriendNames(), messagePart));
}
} else {
plugin.messageNoPrefix(sender, "info-regionCanBeRented", rent);
}
if(rent.getLandlordName() != null) {
plugin.messageNoPrefix(sender, "info-regionLandlord", rent);
}
// Maximum extends
if(rent.getMaxExtends() != -1) {
if(rent.getMaxExtends() == 0) {
plugin.messageNoPrefix(sender, "info-regionNoExtending", rent);
} else if(rent.isRented()) {
plugin.messageNoPrefix(sender, "info-regionExtendsLeft", rent);
} else {
plugin.messageNoPrefix(sender, "info-regionMaxExtends", rent);
}
}
// If maxExtends is zero it does not make sense to show this message
if(rent.getMaxRentTime() != -1 && rent.getMaxExtends() != 0) {
plugin.messageNoPrefix(sender, "info-regionMaxRentTime", rent);
}
if(rent.getInactiveTimeUntilUnrent() != -1) {
plugin.messageNoPrefix(sender, "info-regionInactiveUnrent", rent);
}
// Teleport
Message tp = Message.fromKey("info-prefix");
boolean foundSomething = false;
if(TeleportCommand.canUse(sender, rent)) {
foundSomething = true;
tp.append(Message.fromKey("info-regionTeleport").replacements(rent));
}
if(SetteleportCommand.canUse(sender, rent)) {
if(foundSomething) {
tp.append(", ");
}
foundSomething = true;
tp.append(Message.fromKey("info-setRegionTeleport").replacements(rent));
}
if(foundSomething) {
tp.append(".");
tp.send(sender);
}
// Signs
List<String> signLocations = new ArrayList<>();
for(Location location : rent.getSignsFeature().getSignLocations()) {
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
// Groups
if(sender.hasPermission("areashop.groupinfo") && !rent.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(rent.getGroupNames()));
}
// Restoring
if(rent.isRestoreEnabled()) {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent);
}
// Restrictions
if(!rent.isRented()) {
if(rent.restrictedToRegion()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionRent", rent);
} else if(rent.restrictedToWorld()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldRent", rent);
}
}
plugin.messageNoPrefix(sender, "info-regionFooterRent", rent);
} else if(buy != null) {
plugin.message(sender, "info-regionHeaderBuy", buy);
if(buy.isSold()) {
if(buy.isInResellingMode()) {
plugin.messageNoPrefix(sender, "info-regionReselling", buy);
plugin.messageNoPrefix(sender, "info-regionReselPrice", buy);
} else {
plugin.messageNoPrefix(sender, "info-regionBought", buy);
}
// Money back
if(!buy.getBooleanSetting("buy.sellDisabled")) {
if (SellCommand.canUse(sender, buy)) {
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuyClick", buy);
} else {
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuy", buy);
}
}
// Friends
if(!buy.getFriendsFeature().getFriendNames().isEmpty()) {
String messagePart = "info-friend";
if(DelfriendCommand.canUse(sender, buy)) {
messagePart = "info-friendRemove";
}
plugin.messageNoPrefix(sender, "info-regionFriends", buy, Utils.combinedMessage(buy.getFriendsFeature().getFriendNames(), messagePart));
}
} else {
plugin.messageNoPrefix(sender, "info-regionCanBeBought", buy);
}
if(buy.getLandlord() != null) {
plugin.messageNoPrefix(sender, "info-regionLandlord", buy);
}
if(buy.getInactiveTimeUntilSell() != -1) {
plugin.messageNoPrefix(sender, "info-regionInactiveSell", buy);
}
// Teleport
Message tp = Message.fromKey("info-prefix");
boolean foundSomething = false;
if(TeleportCommand.canUse(sender, buy)) {
foundSomething = true;
tp.append(Message.fromKey("info-regionTeleport").replacements(buy));
}
if(SetteleportCommand.canUse(sender, buy)) {
if(foundSomething) {
tp.append(", ");
}
foundSomething = true;
tp.append(Message.fromKey("info-setRegionTeleport").replacements(buy));
}
if(foundSomething) {
tp.append(".");
tp.send(sender);
}
// Signs
List<String> signLocations = new ArrayList<>();
for(Location location : buy.getSignsFeature().getSignLocations()) {
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
// Groups
if(sender.hasPermission("areashop.groupinfo") && !buy.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(buy.getGroupNames()));
}
// Restoring
if(buy.isRestoreEnabled()) {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy);
}
// Restrictions
if(!buy.isSold()) {
if(buy.restrictedToRegion()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionBuy", buy);
} else if(buy.restrictedToWorld()) {
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldBuy", buy);
}
}
plugin.messageNoPrefix(sender, "info-regionFooterBuy", buy);
}
} else {
plugin.message(sender, "info-regionHelp");
}
} else {
plugin.message(sender, "info-help");
}
} else {
plugin.message(sender, "info-help");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "player", "region", "nogroup", "reselling"));
} else if(toComplete == 3) {
if(start[2].equalsIgnoreCase("player")) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(start[2].equalsIgnoreCase("region")) {
result.addAll(plugin.getFileManager().getBuyNames());
result.addAll(plugin.getFileManager().getRentNames());
}
}
return result;
}
}
@@ -0,0 +1,87 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class LinksignsCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop linksigns";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.linksigns")) {
return "help-linksigns";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.linksigns")) {
plugin.message(sender, "linksigns-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
plugin.getSignlinkerManager().exitSignLinkMode(player);
} else {
// Get the profile
String profile = null;
if(args.length > 1) {
profile = args[1];
ConfigurationSection signProfilesSection = plugin.getConfig().getConfigurationSection("signProfiles");
if(signProfilesSection != null) {
Set<String> profiles = signProfilesSection.getKeys(false);
if(!profiles.contains(profile)) {
ArrayList<String> message = new ArrayList<>();
for(String p : profiles) {
if(!message.isEmpty()) {
message.add(", ");
}
message.addAll(Message.fromKey("addsign-profile").replacements(p).get());
}
plugin.message(sender, "addsign-wrongProfile", Message.fromList(message));
return;
}
}
}
plugin.getSignlinkerManager().enterSignLinkMode(player, profile);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.addAll(plugin.getConfig().getStringList("signProfiles"));
}
return result;
}
}
@@ -0,0 +1,143 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
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 {
@Override
public String getCommandStart() {
return "areashop me";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.me")) {
return "help-me";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.me")) {
plugin.message(sender, "me-noPermission");
return;
}
OfflinePlayer player = null;
if(!(sender instanceof Player)) {
if(args.length <= 1) {
plugin.message(sender, "me-notAPlayer");
return;
}
} else {
player = (OfflinePlayer)sender;
}
if(args.length > 1) {
player = Bukkit.getOfflinePlayer(args[1]);
if(player == null) {
plugin.message(sender, "me-noPlayer", args[1]);
return;
}
}
if(player == null) {
return;
}
// Get the regions owned by the player
Set<RentRegion> rentRegions = new HashSet<>();
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isOwner(player)) {
rentRegions.add(region);
}
}
Set<BuyRegion> buyRegions = new HashSet<>();
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isOwner(player)) {
buyRegions.add(region);
}
}
// Get the regions the player is added as friend
Set<GeneralRegion> friendRegions = new HashSet<>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.getFriendsFeature().getFriends().contains(player.getUniqueId())) {
friendRegions.add(region);
}
}
// Send messages
boolean foundSome = !rentRegions.isEmpty() || !buyRegions.isEmpty() || !friendRegions.isEmpty();
if(foundSome) {
plugin.message(sender, "me-header", player.getName());
}
if(!rentRegions.isEmpty()) {
for(RentRegion region : rentRegions) {
plugin.messageNoPrefix(sender, "me-rentLine", region);
}
}
if(!buyRegions.isEmpty()) {
for(BuyRegion region : buyRegions) {
plugin.messageNoPrefix(sender, "me-buyLine", region);
}
}
if(!friendRegions.isEmpty()) {
for(GeneralRegion region : friendRegions) {
plugin.messageNoPrefix(sender, "me-friendLine", region);
}
}
if(!foundSome) {
plugin.message(sender, "me-nothing", player.getName());
} else {
plugin.messageNoPrefix(sender, "me-clickHint");
}
}
@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;
}
}
@@ -0,0 +1,74 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class MessageCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop message";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.message")) {
return null; // Internal command, no need to show in the help list
}
return null;
}
@Override
public void execute(final CommandSender sender, final String[] args) {
if(!sender.hasPermission("areashop.message")) {
plugin.message(sender, "message-noPermission");
return;
}
if(args.length < 3) {
plugin.message(sender, "message-help");
return;
}
Player player = Bukkit.getPlayer(args[1]);
if(player == null) {
plugin.message(sender, "message-notOnline", args[1]);
return;
}
String[] messageArgs = new String[args.length - 2];
System.arraycopy(args, 2, messageArgs, 0, args.length - 2);
String message = StringUtils.join(messageArgs, " ");
Message.fromString(message).send(player);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
for(Player player : Utils.getOnlinePlayers()) {
result.add(player.getName());
}
}
return result;
}
}
@@ -0,0 +1,7 @@
# Commands
This module contains all AreaShop commands.
* `CommandAreaShop` is extended by all other classes, and implements some general functionality and defines which methods should be implemented.
* Other classes implement specific sub-commands, supply their help messages and tab completion.
* `CommandManager` class in the `managers` package handles incoming commands and dispatches them to the classes in this package.
@@ -0,0 +1,29 @@
package me.wiefferink.areashop.commands;
import org.bukkit.command.CommandSender;
public class ReloadCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop reload";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.reload")) {
return "help-reload";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(sender.hasPermission("areashop.reload")) {
// Reload the configuration files and update all region flags/signs
plugin.reload(sender);
} else {
plugin.message(sender, "reload-noPermission");
}
}
}
@@ -1,77 +1,69 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class RentCommand extends CommandAreaShop {
public RentCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop rent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.rent")) {
return plugin.getLanguageManager().getLang("help-rent");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.rent")) {
plugin.message(sender, "rent-noPermission");
return;
}
if (!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(args.length > 1 && args[1] != null) {
RentRegion rent = plugin.getFileManager().getRent(args[1]);
if(rent == null) {
plugin.message(sender, "rent-notRentable");
} else {
rent.rent(player);
}
} else {
// get the region by location
List<RentRegion> regions = plugin.getFileManager().getApplicableRentRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
regions.get(0).rent(player);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
for(RentRegion region : plugin.getFileManager().getRents()) {
if(!region.isRented()) {
result.add(region.getName());
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class RentCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop rent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.rent")) {
return "help-rent";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.rent")) {
plugin.message(sender, "rent-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
Player player = (Player)sender;
if(args.length > 1 && args[1] != null) {
RentRegion rent = plugin.getFileManager().getRent(args[1]);
if(rent == null) {
plugin.message(sender, "rent-notRentable", args[1]);
} else {
rent.rent(player);
}
} else {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
} else {
regions.get(0).rent(player);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(RentRegion region : plugin.getFileManager().getRents()) {
if(!region.isRented()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,134 +1,134 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class ResellCommand extends CommandAreaShop {
public ResellCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop resell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.resellall")) {
return plugin.getLanguageManager().getLang("help-resellAll");
} else if(target.hasPermission("areashop.resell")) {
return plugin.getLanguageManager().getLang("help-resell");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.resell") && !sender.hasPermission("areashop.resellall")) {
plugin.message(sender, "resell-noPermissionOther");
return;
}
if(args.length <= 1) {
plugin.message(sender, "resell-help");
return;
}
double price = 0.0;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "resell-wrongPrice", args[1]);
return;
}
BuyRegion buy = null;
if(args.length <= 2) {
if (sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[2]);
if(buy == null) {
plugin.message(sender, "resell-notRegistered", args[2]);
return;
}
}
if(buy == null) {
plugin.message(sender, "resell-noRegionFound");
return;
}
if(!buy.isSold()) {
plugin.message(sender, "resell-notBought", buy);
return;
}
if(sender.hasPermission("areashop.resellall")) {
buy.enableReselling(price);
buy.saveRequired();
plugin.message(sender, "resell-success", buy);
buy.updateSigns();
buy.updateRegionFlags();
} else if(sender.hasPermission("areashop.resell") && sender instanceof Player) {
if(buy.isOwner((Player)sender)) {
buy.enableReselling(price);
buy.saveRequired();
plugin.message(sender, "resell-success", buy);
buy.updateSigns();
buy.updateRegionFlags();
} else {
plugin.message(sender, "resell-noPermissionOther");
}
} else {
plugin.message(sender, "resell-noPermission");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 3) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && !region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ResellCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop resell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.resellall") || target.hasPermission("areashop.resell")) {
return "help-resell";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.resell") && !sender.hasPermission("areashop.resellall")) {
plugin.message(sender, "resell-noPermissionOther");
return;
}
if(args.length <= 1) {
plugin.message(sender, "resell-help");
return;
}
double price;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "resell-wrongPrice", args[1]);
return;
}
if(price < 0) {
plugin.message(sender, "resell-wrongPrice", args[1]);
return;
}
BuyRegion buy;
if(args.length <= 2) {
if(sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[2]);
if(buy == null) {
plugin.message(sender, "resell-notRegistered", args[2]);
return;
}
}
if(buy == null) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
}
if(!buy.isSold()) {
plugin.message(sender, "resell-notBought", buy);
return;
}
if(sender.hasPermission("areashop.resellall")) {
buy.enableReselling(price);
buy.update();
plugin.message(sender, "resell-success", buy);
} else if(sender.hasPermission("areashop.resell") && sender instanceof Player) {
if(!buy.isOwner((Player)sender)) {
plugin.message(sender, "resell-noPermissionOther", buy);
return;
}
if(buy.getBooleanSetting("buy.resellDisabled")) {
plugin.message(sender, "resell-disabled", buy);
return;
}
buy.enableReselling(price);
buy.update();
plugin.message(sender, "resell-success", buy);
} else {
plugin.message(sender, "resell-noPermission", buy);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 3) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && !region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -1,88 +1,86 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class SchematiceventCommand extends CommandAreaShop {
public SchematiceventCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop schemevent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.schematicevents")) {
return plugin.getLanguageManager().getLang("help-schemevent");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.schematicevents")) {
plugin.message(sender, "schemevent-noPermission");
return;
}
if(args.length < 3 || args[1] == null || args[2] == null) {
plugin.message(sender, "schemevent-help");
return;
}
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "schemevent-noRegion", args[1]);
return;
}
RegionEvent event = null;
boolean exception = false;
try {
event = RegionEvent.valueOf(args[2].toUpperCase());
} catch(IllegalArgumentException e) {
exception = true;
}
// Check for a totally wrong event or a non matching event
if(exception) {
ArrayList<String> values = new ArrayList<String>();
for(RegionEvent value : RegionEvent.values()) {
values.add(value.getValue().toLowerCase());
}
plugin.message(sender, "schemevent-wrongEvent", args[2], Utils.createCommaSeparatedList(values));
return;
}
region.handleSchematicEvent(event);
plugin.message(sender, "schemevent-success", args[2], region.getName());
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
GeneralRegion region = plugin.getFileManager().getRegion(start[2]);
if(region != null) {
if(region.isRentRegion()) {
result.addAll(Arrays.asList("created", "deleted", "rented", "unrented"));
} else if(region.isBuyRegion()) {
result.addAll(Arrays.asList("created", "deleted", "bought", "sold"));
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class SchematiceventCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop schemevent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.schematicevents")) {
return "help-schemevent";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.schematicevents")) {
plugin.message(sender, "schemevent-noPermission");
return;
}
if(args.length < 3 || args[1] == null || args[2] == null) {
plugin.message(sender, "schemevent-help");
return;
}
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[1]);
return;
}
if(region.getRegion() == null) {
plugin.message(sender, "general-noRegion", region);
return;
}
GeneralRegion.RegionEvent event = null;
boolean exception = false;
try {
event = GeneralRegion.RegionEvent.valueOf(args[2].toUpperCase());
} catch(IllegalArgumentException e) {
exception = true;
}
// Check for a totally wrong event or a non matching event
if(exception) {
ArrayList<String> values = new ArrayList<>();
for(GeneralRegion.RegionEvent value : GeneralRegion.RegionEvent.values()) {
values.add(value.getValue().toLowerCase());
}
plugin.message(sender, "schemevent-wrongEvent", args[2], Utils.createCommaSeparatedList(values), region);
return;
}
region.handleSchematicEvent(event);
region.update();
plugin.message(sender, "schemevent-success", args[2], region);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
GeneralRegion region = plugin.getFileManager().getRegion(start[2]);
if(region != null) {
if(region instanceof RentRegion) {
result.addAll(Arrays.asList("created", "deleted", "rented", "unrented"));
} else if(region instanceof BuyRegion) {
result.addAll(Arrays.asList("created", "deleted", "bought", "sold"));
}
}
}
return result;
}
}
@@ -0,0 +1,110 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SellCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop sell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.sell") || target.hasPermission("areashop.sellown")) {
return "help-sell";
}
return null;
}
/**
* Check if a person can sell the region.
* @param person The person to check
* @param region The region to check for
* @return true if the person can sell it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(person.hasPermission("areashop.sell")) {
return true;
}
if(person instanceof Player) {
Player player = (Player)person;
return region.isOwner(player) && person.hasPermission("areashop.sellown");
}
return false;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.sell") && !sender.hasPermission("areashop.sellown")) {
plugin.message(sender, "sell-noPermission");
return;
}
BuyRegion buy;
if(args.length <= 1) {
if(sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[1]);
}
if(buy == null) {
plugin.message(sender, "sell-notRegistered");
return;
}
if(!buy.isSold()) {
plugin.message(sender, "sell-notBought", buy);
return;
}
buy.sell(true, sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -0,0 +1,105 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetdurationCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setduration";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setduration")) {
return "help-setduration";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setduration") && (!sender.hasPermission("areashop.setduration.landlord") && sender instanceof Player)) {
plugin.message(sender, "setduration-noPermission");
return;
}
if(args.length < 3 || args[1] == null || args[2] == null) {
plugin.message(sender, "setduration-help");
return;
}
int regionArgument = 3;
if(args.length >= 2 && ("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1]))) {
regionArgument = 2;
}
RentRegion rent;
if(args.length <= regionArgument) {
if(sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
rent = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
rent = plugin.getFileManager().getRent(args[regionArgument]);
}
if(rent == null) {
plugin.message(sender, "setduration-notRegistered", args[regionArgument]);
return;
}
if(!sender.hasPermission("areashop.setduration") && !(sender instanceof Player && rent.isLandlord(((Player)sender).getUniqueId()))) {
plugin.message(sender, "setduration-noLandlord", rent);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
rent.setDuration(null);
rent.update();
plugin.message(sender, "setduration-successRemoved", rent);
return;
}
try {
Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setduration-wrongAmount", args[1], rent);
return;
}
if(!Utils.checkTimeFormat(args[1] + " " + args[2])) {
plugin.message(sender, "setduration-wrongFormat", args[1] + " " + args[2], rent);
return;
}
rent.setDuration(args[1] + " " + args[2]);
rent.update();
plugin.message(sender, "setduration-success", rent);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getRentNames();
} else if(toComplete == 4) {
result.addAll(plugin.getConfig().getStringList("minutes"));
result.addAll(plugin.getConfig().getStringList("hours"));
result.addAll(plugin.getConfig().getStringList("days"));
result.addAll(plugin.getConfig().getStringList("months"));
result.addAll(plugin.getConfig().getStringList("years"));
}
return result;
}
}
@@ -0,0 +1,87 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetlandlordCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setlandlord";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setlandlord")) {
return "help-setlandlord";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setlandlord")) {
plugin.message(sender, "setlandlord-noPermission");
return;
}
if(args.length < 2) {
plugin.message(sender, "setlandlord-help");
return;
}
@SuppressWarnings("deprecation")
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
GeneralRegion region;
if(args.length < 3) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "cmd-notRegistered", args[2]);
return;
}
String playerName = player.getName();
if(playerName == null || playerName.isEmpty()) {
playerName = args[1];
}
region.setLandlord(player.getUniqueId(), playerName);
region.update();
plugin.message(sender, "setlandlord-success", playerName, region);
}
@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());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -1,147 +1,134 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class SetownerCommand extends CommandAreaShop {
public SetownerCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop setowner";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setownerrent") || target.hasPermission("areashop.setownerbuy")) {
return plugin.getLanguageManager().getLang("help-setowner");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.setownerrent") && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermission");
return;
}
GeneralRegion region;
if(args.length < 2) {
plugin.message(sender, "setowner-help");
return;
}
if(args.length == 2) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = plugin.getFileManager().getAllApplicableRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "setowner-notRegistered");
return;
}
if(region.isRentRegion() && !sender.hasPermission("areashop.setownerrent")) {
plugin.message(sender, "setowner-noPermissionRent");
return;
}
if(region.isBuyRegion() && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermissionBuy");
return;
}
UUID uuid = null;
@SuppressWarnings("deprecation")
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
if(player != null) {
uuid = player.getUniqueId();
}
if(uuid == null) {
plugin.message(sender, "setowner-noPlayer", args[1]);
return;
}
if(region.isRentRegion()) {
RentRegion rent = (RentRegion)region;
if(rent.isRenter(uuid)) {
// extend
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(rent.getRentedUntil() + rent.getDuration());
rent.setRentedUntil(calendar.getTimeInMillis());
rent.setRenter(uuid);
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);
plugin.message(sender, "setowner-succesRent", region);
}
rent.updateRegionFlags();
rent.updateSigns();
}
if(region.isBuyRegion()) {
BuyRegion buy = (BuyRegion)region;
buy.setBuyer(uuid);
plugin.message(sender, "setowner-succesBuy", region);
buy.updateRegionFlags();
buy.updateSigns();
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
for(Player player : Bukkit.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.UUID;
public class SetownerCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setowner";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setownerrent") || target.hasPermission("areashop.setownerbuy")) {
return "help-setowner";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setownerrent") && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermission");
return;
}
GeneralRegion region;
if(args.length < 2) {
plugin.message(sender, "setowner-help");
return;
}
if(args.length == 2) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "setowner-notRegistered");
return;
}
if(region instanceof RentRegion && !sender.hasPermission("areashop.setownerrent")) {
plugin.message(sender, "setowner-noPermissionRent", region);
return;
}
if(region instanceof BuyRegion && !sender.hasPermission("areashop.setownerbuy")) {
plugin.message(sender, "setowner-noPermissionBuy", region);
return;
}
UUID uuid = null;
@SuppressWarnings("deprecation")
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
if(player != null) {
uuid = player.getUniqueId();
}
if(uuid == null) {
plugin.message(sender, "setowner-noPlayer", args[1], region);
return;
}
if(region instanceof RentRegion) {
RentRegion rent = (RentRegion)region;
if(rent.isRenter(uuid)) {
// extend
rent.setRentedUntil(rent.getRentedUntil() + rent.getDuration());
rent.setRenter(uuid);
plugin.message(sender, "setowner-succesRentExtend", region);
} else {
// change
if(!rent.isRented()) {
rent.setRentedUntil(Calendar.getInstance().getTimeInMillis() + rent.getDuration());
}
rent.setRenter(uuid);
plugin.message(sender, "setowner-succesRent", region);
}
}
if(region instanceof BuyRegion) {
BuyRegion buy = (BuyRegion)region;
buy.setBuyer(uuid);
plugin.message(sender, "setowner-succesBuy", region);
}
region.getFriendsFeature().deleteFriend(region.getOwner(), null);
region.update();
region.saveRequired();
}
@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());
}
} else if(toComplete == 3) {
result.addAll(plugin.getFileManager().getRegionNames());
}
return result;
}
}
@@ -0,0 +1,103 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetpriceCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setprice";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setprice")) {
return "help-setprice";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setprice") && (!sender.hasPermission("areashop.setprice.landlord") && sender instanceof Player)) {
plugin.message(sender, "setprice-noPermission");
return;
}
if(args.length < 2 || args[1] == null) {
plugin.message(sender, "setprice-help");
return;
}
GeneralRegion region;
if(args.length < 3) {
if(sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
region = plugin.getFileManager().getRegion(args[2]);
}
if(region == null) {
plugin.message(sender, "setprice-notRegistered", args[2]);
return;
}
if(!sender.hasPermission("areashop.setprice") && !(sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId()))) {
plugin.message(sender, "setprice-noLandlord", region);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
if(region instanceof RentRegion) {
((RentRegion)region).setPrice(null);
} else if(region instanceof BuyRegion) {
((BuyRegion)region).setPrice(null);
}
region.update();
plugin.message(sender, "setprice-successRemoved", region);
return;
}
double price;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setprice-wrongPrice", args[1], region);
return;
}
if(region instanceof RentRegion) {
((RentRegion)region).setPrice(price);
plugin.message(sender, "setprice-successRent", region);
} else if(region instanceof BuyRegion) {
((BuyRegion)region).setPrice(price);
plugin.message(sender, "setprice-successBuy", region);
}
region.update();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
@@ -1,77 +1,73 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class SetrestoreCommand extends CommandAreaShop {
public SetrestoreCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop setrestore";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setrestore")) {
return plugin.getLanguageManager().getLang("help-setrestore");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.setrestore")) {
plugin.message(sender, "setrestore-noPermission");
return;
}
if(args.length <= 2 || args[1] == null || args[2] == null) {
plugin.message(sender, "setrestore-help");
return;
}
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "setrestore-notRegistered", args[1]);
return;
}
String value = null;
if(args[2].equalsIgnoreCase("true") || args[2].equalsIgnoreCase("false") || args[2].equalsIgnoreCase("general")) {
value = args[2].toLowerCase();
} else {
plugin.message(sender, "setrestore-invalidSetting", args[2]);
return;
}
region.setRestoreSetting(value);
if(args.length > 3) {
region.setRestoreProfile(args[3]);
plugin.message(sender, "setrestore-successProfile", region.getName(), value, args[3]);
} else {
plugin.message(sender, "setrestore-success", region.getName(), value);
}
region.saveRequired();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result = plugin.getFileManager().getRegionNames();
} else if(toComplete == 3) {
result.add("true");
result.add("false");
result.add("general");
} else if(toComplete == 4) {
result.addAll(plugin.getConfig().getConfigurationSection("schematicProfiles").getKeys(false));
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
public class SetrestoreCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop setrestore";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setrestore")) {
return "help-setrestore";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setrestore")) {
plugin.message(sender, "setrestore-noPermission");
return;
}
if(args.length <= 2 || args[1] == null || args[2] == null) {
plugin.message(sender, "setrestore-help");
return;
}
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "setrestore-notRegistered", args[1]);
return;
}
Boolean value = null;
if(args[2].equalsIgnoreCase("true")) {
value = true;
} else if(args[2].equalsIgnoreCase("false")) {
value = false;
}
region.setRestoreSetting(value);
String valueString = "general";
if(value != null) {
valueString = value + "";
}
if(args.length > 3) {
region.setSchematicProfile(args[3]);
plugin.message(sender, "setrestore-successProfile", valueString, args[3], region);
} else {
plugin.message(sender, "setrestore-success", valueString, region);
}
region.update();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getRegionNames();
} else if(toComplete == 3) {
result.add("true");
result.add("false");
result.add("general");
} else if(toComplete == 4) {
result.addAll(plugin.getConfig().getConfigurationSection("schematicProfiles").getKeys(false));
}
return result;
}
}
@@ -0,0 +1,118 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetteleportCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop settp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.teleportall") || target.hasPermission("areashop.teleport")) {
return "help-setteleport";
}
return null;
}
/**
* Check if a person can set the teleport location of the region.
* @param person The person to check
* @param region The region to check for
* @return true if the person can set the teleport location, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(!(person instanceof Player)) {
return false;
}
Player player = (Player)person;
return player.hasPermission("areashop.setteleportall")
|| region.isOwner(player) && player.hasPermission("areashop.setteleport");
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.setteleport") && !sender.hasPermission("areashop.setteleportall")) {
plugin.message(sender, "setteleport-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "onlyByPlayer");
return;
}
Player player = (Player)sender;
GeneralRegion region;
if(args.length < 2) {
// get the region by location
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
region = regions.get(0);
}
} else {
region = plugin.getFileManager().getRegion(args[1]);
}
boolean owner;
if(region == null) {
plugin.message(player, "setteleport-noRentOrBuy", args[1]);
return;
}
if(region instanceof RentRegion) {
owner = player.getUniqueId().equals(((RentRegion)region).getRenter());
} else {
owner = player.getUniqueId().equals(((BuyRegion)region).getBuyer());
}
if(!player.hasPermission("areashop.setteleport")) {
plugin.message(player, "setteleport-noPermission", region);
return;
} else if(!owner && !player.hasPermission("areashop.setteleportall")) {
plugin.message(player, "setteleport-noPermissionOther", region);
return;
}
ProtectedRegion wgRegion = region.getRegion();
if(args.length > 2 && args[2] != null && (args[2].equalsIgnoreCase("reset") || args[2].equalsIgnoreCase("yes") || args[2].equalsIgnoreCase("true"))) {
region.getTeleportFeature().setTeleport(null);
region.update();
plugin.message(player, "setteleport-reset", region);
return;
}
if(!player.hasPermission("areashop.setteleportoutsideregion") && (wgRegion == null || !wgRegion.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
plugin.message(player, "setteleport-notInside", region);
return;
}
region.getTeleportFeature().setTeleport(player.getLocation());
region.update();
plugin.message(player, "setteleport-success", region);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("reset");
}
return result;
}
}
@@ -0,0 +1,262 @@
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
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 me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.List;
public class StackCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop stack";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stack")) {
return "help-stack";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
// Check permission
if(!sender.hasPermission("areashop.stack")) {
plugin.message(sender, "stack-noPermission");
return;
}
// Only from ingame
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
final Player player = (Player)sender;
// Specify enough arguments
if(args.length < 5) {
plugin.message(sender, "stack-help");
return;
}
// Check amount
int tempAmount = -1;
try {
tempAmount = Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
// Incorrect number
}
if(tempAmount <= 0) {
plugin.message(player, "stack-wrongAmount", args[1]);
return;
}
// Check gap
int gap;
try {
gap = Integer.parseInt(args[2]);
} catch(NumberFormatException e) {
plugin.message(player, "stack-wrongGap", args[2]);
return;
}
// Check region type
if(!"rent".equalsIgnoreCase(args[4]) && !"buy".equalsIgnoreCase(args[4])) {
plugin.message(sender, "stack-help");
return;
}
// Get WorldEdit selection
final WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
if(selection == null) {
plugin.message(player, "stack-noSelection");
return;
}
// Get or create group
RegionGroup group = null;
if(args.length > 5) {
group = plugin.getFileManager().getGroup(args[5]);
if(group == null) {
group = new RegionGroup(plugin, args[5]);
plugin.getFileManager().addGroup(group);
}
}
// 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(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;
}
Vector shift = new BlockVector(0, 0, 0);
if(facing == BlockFace.SOUTH) {
shift = shift.setZ(-selection.getLength() - gap);
} else if(facing == BlockFace.WEST) {
shift = shift.setX(selection.getWidth() + gap);
} else if(facing == BlockFace.NORTH) {
shift = shift.setZ(selection.getLength() + gap);
} else if(facing == BlockFace.EAST) {
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
final String nameTemplate = args[3];
final int regionsPerTick = plugin.getConfig().getInt("adding.regionsPerTick");
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.empty();
if(group != null) {
groupsMessage = Message.fromKey("stack-addToGroup").replacements(group.getName());
}
plugin.message(player, "stack-accepted", amount, type, gap, nameTemplate, groupsMessage);
plugin.message(player, "stack-addStart", amount, regionsPerTick * 20);
Location minimumLocation = selection.getMinimumLocation();
Vector minimumVector = new Vector(minimumLocation.getX(), minimumLocation.getY(), minimumLocation.getZ());
Location maximumLocation = selection.getMaximumLocation();
Vector maximumVector = new Vector(maximumLocation.getX(), maximumLocation.getY(), maximumLocation.getZ());
new BukkitRunnable() {
private int current = -1;
private final RegionManager manager = AreaShop.getInstance().getRegionManager(selection.getWorld());
private int counter = 1;
private int tooLow = 0;
private int tooHigh = 0;
@Override
public void run() {
for(int i = 0; i < regionsPerTick; i++) {
current++;
if(current < amount) {
// Create the region name
String counterName = counter + "";
int minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
while(counterName.length() < minimumLength) {
counterName = "0" + counterName;
}
String regionName;
if(nameTemplate.contains("#")) {
regionName = nameTemplate.replace("#", counterName);
} else {
regionName = nameTemplate + counterName;
}
while(manager.getRegion(regionName) != null || AreaShop.getInstance().getFileManager().getRegion(regionName) != null) {
counter++;
counterName = counter + "";
minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
while(counterName.length() < minimumLength) {
counterName = "0" + counterName;
}
if(nameTemplate.contains("#")) {
regionName = nameTemplate.replace("#", counterName);
} else {
regionName = nameTemplate + counterName;
}
}
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
BlockVector minimum = new BlockVector(minimumVector.add(finalShift.multiply(current)));
BlockVector maximum = new BlockVector(maximumVector.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(regionName, selection.getWorld());
if(finalGroup != null) {
finalGroup.addMember(rent);
}
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
rent.update();
} else {
BuyRegion buy = new BuyRegion(regionName, selection.getWorld());
if(finalGroup != null) {
finalGroup.addMember(buy);
}
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
buy.update();
}
}
}
if(current >= amount) {
if(player.isOnline()) {
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();
}
}
}.runTaskTimer(plugin, 1, 1);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 5) {
result.add("rent");
result.add("buy");
} else if(toComplete == 6) {
result.addAll(plugin.getFileManager().getGroupNames());
}
return result;
}
}
@@ -1,123 +1,111 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class StopresellCommand extends CommandAreaShop {
public StopresellCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop stopresell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stopresellall")) {
return plugin.getLanguageManager().getLang("help-stopResellAll");
} else if(target.hasPermission("areashop.stopresell")) {
return plugin.getLanguageManager().getLang("help-stopResell");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.stopresell") && !sender.hasPermission("areashop.stopresellall")) {
plugin.message(sender, "stopresell-noPermissionOther");
return;
}
BuyRegion buy = null;
if(args.length <= 1) {
if (sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
if (regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if (regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[1]);
if(buy == null) {
plugin.message(sender, "stopresell-notRegistered", args[1]);
return;
}
}
if(buy == null) {
plugin.message(sender, "stopresell-noRegionFound");
return;
}
if(!buy.isInResellingMode()) {
plugin.message(sender, "stopresell-notResell", buy);
return;
}
if(sender.hasPermission("areashop.stopresellall")) {
buy.disableReselling();
buy.saveRequired();
plugin.message(sender, "stopresell-success", buy);
buy.updateSigns();
buy.updateRegionFlags();
} else if(sender.hasPermission("areashop.stopresell") && sender instanceof Player) {
if(buy.isOwner((Player)sender)) {
buy.disableReselling();
buy.saveRequired();
plugin.message(sender, "stopresell-success", buy);
buy.updateSigns();
buy.updateRegionFlags();
} else {
plugin.message(sender, "stopresell-noPermissionOther");
}
} else {
plugin.message(sender, "stopresell-noPermission");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class StopresellCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop stopresell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stopresellall") || target.hasPermission("areashop.stopresell")) {
return "help-stopResell";
}
return null;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.stopresell") && !sender.hasPermission("areashop.stopresellall")) {
plugin.message(sender, "stopresell-noPermissionOther");
return;
}
BuyRegion buy;
if(args.length <= 1) {
if(sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
buy = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
buy = plugin.getFileManager().getBuy(args[1]);
if(buy == null) {
plugin.message(sender, "stopresell-notRegistered", args[1]);
return;
}
}
if(buy == null) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
}
if(!buy.isInResellingMode()) {
plugin.message(sender, "stopresell-notResell", buy);
return;
}
if(sender.hasPermission("areashop.stopresellall")) {
buy.disableReselling();
buy.update();
plugin.message(sender, "stopresell-success", buy);
} else if(sender.hasPermission("areashop.stopresell") && sender instanceof Player) {
if(buy.isOwner((Player)sender)) {
buy.disableReselling();
buy.update();
plugin.message(sender, "stopresell-success", buy);
} else {
plugin.message(sender, "stopresell-noPermissionOther", buy);
}
} else {
plugin.message(sender, "stopresell-noPermission", buy);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isSold() && region.isInResellingMode()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -0,0 +1,81 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class TeleportCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop tp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.teleportall") || target.hasPermission("areashop.teleport")) {
return "help-teleport";
}
return null;
}
/**
* Check if a person can teleport to the region (assuming he is not teleporting to a sign).
* @param person The person to check
* @param region The region to check for
* @return true if the person can teleport to it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(!(person instanceof Player)) {
return false;
}
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.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;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "cmd-onlyByPlayer");
return;
}
if(args.length <= 1 || args[1] == null) {
plugin.message(sender, "teleport-help");
return;
}
Player player = (Player)sender;
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(player, "teleport-noRentOrBuy", args[1]);
return;
}
if(args.length >= 3 && (args[2].equalsIgnoreCase("sign") || args[2].equalsIgnoreCase("yes") || args[2].equalsIgnoreCase("true"))) {
region.getTeleportFeature().teleportPlayer(player, true);
} else {
region.getTeleportFeature().teleportPlayer(player, false);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("sign");
}
return result;
}
}
@@ -0,0 +1,102 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class UnrentCommand extends CommandAreaShop {
@Override
public String getCommandStart() {
return "areashop unrent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.unrent") || target.hasPermission("areashop.unrentown")) {
return "help-unrent";
}
return null;
}
/**
* Check if a person can unrent the region.
* @param person The person to check
* @param region The region to check for
* @return true if the person can unrent it, otherwise false
*/
public static boolean canUse(CommandSender person, GeneralRegion region) {
if(person.hasPermission("areashop.unrent")) {
return true;
}
if(person instanceof Player) {
Player player = (Player)person;
return region.isOwner(player) && person.hasPermission("areashop.unrentown");
}
return false;
}
@Override
public void execute(CommandSender sender, String[] args) {
if(!sender.hasPermission("areashop.unrent") && !sender.hasPermission("areashop.unrentown")) {
plugin.message(sender, "unrent-noPermission");
return;
}
RentRegion rent;
if(args.length <= 1) {
if(sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
if(regions.isEmpty()) {
plugin.message(sender, "cmd-noRegionsAtLocation");
return;
} else if(regions.size() > 1) {
plugin.message(sender, "cmd-moreRegionsAtLocation");
return;
} else {
rent = regions.get(0);
}
} else {
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
return;
}
} else {
rent = plugin.getFileManager().getRent(args[1]);
}
if(rent == null) {
plugin.message(sender, "unrent-notRegistered");
return;
}
if(!rent.isRented()) {
plugin.message(sender, "unrent-notRented", rent);
return;
}
rent.unRent(true, sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<>();
if(toComplete == 2) {
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isRented()) {
result.add(region.getName());
}
}
}
return result;
}
}
@@ -0,0 +1,45 @@
package me.wiefferink.areashop.events;
public class CancellableRegionEvent<T> extends RegionEvent<T> {
private boolean cancelled;
private String reason;
public CancellableRegionEvent(T region) {
super(region);
}
/**
* Cancel the event from happening.
* @param reason The reason of cancelling, used for display to the user, should end with a dot
*/
public void cancel(String reason) {
this.cancelled = true;
this.reason = reason;
}
/**
* Let the event continue, possible overwriting a cancel() call from another plugin.
*/
public void allow() {
this.cancelled = false;
this.reason = null;
}
/**
* Check if the event has been cancelled.
* @return true if the event has been cancelled, otherwise false
*/
public boolean isCancelled() {
return cancelled;
}
/**
* Get the reason why this event is cancelled.
* @return null if there is no reason or the event is not cancelled, otherwise a string
*/
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);
}
}
@@ -0,0 +1,7 @@
# Events
This package contains event classes that allow other plugins to listen to events about AreaShop regions.
* `RegionEvent` class represents a generic event.
* `CancellableRegionEvent` represents an event that has a region and can be cancelled.
* `NotifyRegionEvent` represents events that are to inform only, and cannot be cancelled anymore (an `CancellableRegionEvent` would be sent first).
@@ -0,0 +1,30 @@
package me.wiefferink.areashop.events;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
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;
}
public static HandlerList getHandlerList() {
return handlers;
}
/**
* Get the region of this event.
* @return The region the event is about
*/
public T getRegion() {
return region;
}
}
@@ -0,0 +1,31 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to buy a region.
*/
public class BuyingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private final OfflinePlayer player;
/**
* Constructor.
* @param region The region that is about to get bought
* @param player The player that tries to buy the region
*/
public BuyingRegionEvent(BuyRegion region, OfflinePlayer player) {
super(region);
this.player = player;
}
/**
* Get the player that is trying to buy the region.
* @return The player that is trying to buy the region
*/
public OfflinePlayer getPlayer() {
return player;
}
}
@@ -0,0 +1,42 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to rent a region.
*/
public class RentingRegionEvent extends CancellableRegionEvent<RentRegion> {
private final OfflinePlayer player;
private final boolean extending;
/**
* Constructor.
* @param region The region that is about to be rented
* @param player The player that tries to rent the region
* @param extending true if the player is extending the rental of the region, otherwise false
*/
public RentingRegionEvent(RentRegion region, OfflinePlayer player, boolean extending) {
super(region);
this.player = player;
this.extending = extending;
}
/**
* Get the player that is trying to rent the region.
* @return The player that is trying to rent the region
*/
public OfflinePlayer getPlayer() {
return player;
}
/**
* Check if the player is extending the region or renting it for the first time.
* @return true if the player tries to extend the region, false if he tries to rent it the first time
*/
public boolean isExtending() {
return extending;
}
}
@@ -0,0 +1,31 @@
package me.wiefferink.areashop.events.ask;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.OfflinePlayer;
/**
* Broadcasted when a player tries to resell a region.
*/
public class ResellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private final OfflinePlayer player;
/**
* Contructor.
* @param region The region that the player is trying to resell
* @param player The player that is trying to buy this region from the current owner
*/
public ResellingRegionEvent(BuyRegion region, OfflinePlayer player) {
super(region);
this.player = player;
}
/**
* Get the player that is trying to buy the region.
* @return The player that is trying to buy the region
*/
public OfflinePlayer getBuyer() {
return player;
}
}
@@ -0,0 +1,18 @@
package me.wiefferink.areashop.events.ask;
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 CancellableRegionEvent<BuyRegion> {
/**
* Constructor.
* @param region The region that is about to get sold
*/
public SellingRegionEvent(BuyRegion region) {
super(region);
}
}
@@ -0,0 +1,18 @@
package me.wiefferink.areashop.events.ask;
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 CancellableRegionEvent<RentRegion> {
/**
* Constructor.
* @param region The region that is about to be unrented
*/
public UnrentingRegionEvent(RentRegion region) {
super(region);
}
}
@@ -0,0 +1,43 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region.
*/
public class AddedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private final OfflinePlayer friend;
private final CommandSender by;
/**
* Constructor.
* @param region The region the friend is getting added to
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public AddedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the OfflinePlayer that is getting added as friend.
* @return The friend that is getting added
*/
public OfflinePlayer getFriend() {
return friend;
}
/**
* Get the CommandSender that is adding the friend.
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
*/
public CommandSender getBy() {
return by;
}
}
@@ -0,0 +1,43 @@
package me.wiefferink.areashop.events.askandnotify;
import me.wiefferink.areashop.events.CancellableRegionEvent;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
/**
* Broadcasted when a friend is being added to a region.
*/
public class DeletedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
private final OfflinePlayer friend;
private final CommandSender by;
/**
* Constructor.
* @param region The region the friend is getting added to
* @param friend The friend that is about to be added
* @param by The CommandSender that is adding the friend, or null if none
*/
public DeletedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
super(region);
this.friend = friend;
this.by = by;
}
/**
* Get the OfflinePlayer that is getting added as friend.
* @return The friend that is getting added
*/
public OfflinePlayer getFriend() {
return friend;
}
/**
* Get the CommandSender that is adding the friend.
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
*/
public CommandSender getBy() {
return by;
}
}
@@ -0,0 +1,19 @@
package me.wiefferink.areashop.events.notify;
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 NotifyRegionEvent<GeneralRegion> {
/**
* Constructor.
* @param region The region that has been added
*/
public AddedRegionEvent(GeneralRegion region) {
super(region);
}
}
@@ -0,0 +1,19 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
/**
* Broadcasted when a region has been bought.
*/
public class BoughtRegionEvent extends NotifyRegionEvent<BuyRegion> {
/**
* Constructor.
* @param region The region that has been bought
*/
public BoughtRegionEvent(BuyRegion region) {
super(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);
}
}
@@ -0,0 +1,31 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
/**
* Broadcasted when a region has been rented.
*/
public class RentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private final boolean extended;
/**
* Constructor.
* @param region The region that has been rented
* @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;
}
/**
* 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
*/
public boolean hasExtended() {
return extended;
}
}
@@ -0,0 +1,32 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
/**
* Broadcasted when a region has been resold.
*/
public class ResoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private final UUID from;
/**
* Constructor.
* @param region The region that has been resold
* @param from The player from who the region has been resold to the current owner
*/
public ResoldRegionEvent(BuyRegion region, UUID from) {
super(region);
this.from = from;
}
/**
* Get the player that the region has been bought from.
* @return The UUID of the player that the region has been bought from
*/
public UUID getFromPlayer() {
return from;
}
}
@@ -0,0 +1,43 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.BuyRegion;
import java.util.UUID;
/**
* Broadcasted when a region is sold.
*/
public class SoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
private final UUID oldBuyer;
private final double refundedMoney;
/**
* Constructor.
* @param region The region that has been sold
* @param oldBuyer The player for which the region has been sold
* @param refundedMoney The amount of money that has been refunded
*/
public SoldRegionEvent(BuyRegion region, UUID oldBuyer, double refundedMoney) {
super(region);
this.oldBuyer = oldBuyer;
this.refundedMoney = refundedMoney;
}
/**
* Get the player that the region is sold for.
* @return The UUID of the player that the region is sold for
*/
public UUID getOldBuyer() {
return oldBuyer;
}
/**
* Get the amount that is paid back to the player.
* @return The amount of money paid back to the player
*/
public double getRefundedMoney() {
return refundedMoney;
}
}
@@ -0,0 +1,43 @@
package me.wiefferink.areashop.events.notify;
import me.wiefferink.areashop.events.NotifyRegionEvent;
import me.wiefferink.areashop.regions.RentRegion;
import java.util.UUID;
/**
* Broadcasted when a region has been unrented.
*/
public class UnrentedRegionEvent extends NotifyRegionEvent<RentRegion> {
private final UUID oldRenter;
private final double refundedMoney;
/**
* Constructor.
* @param region The region that has been unrented
* @param oldRenter The player that rented the region before it was unrented
* @param refundedMoney The amount of money that has been refunded
*/
public UnrentedRegionEvent(RentRegion region, UUID oldRenter, double refundedMoney) {
super(region);
this.oldRenter = oldRenter;
this.refundedMoney = refundedMoney;
}
/**
* Get the player that the region was unrented for.
* @return The UUID of the player that the region was unrented for
*/
public UUID getOldRenter() {
return oldRenter;
}
/**
* Get the amount that is paid back to the player.
* @return The amount of money paid back to the player
*/
public double getRefundedMoney() {
return refundedMoney;
}
}
@@ -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);
}
}
@@ -0,0 +1,98 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.events.notify.AddedRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.DeletedRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.event.EventHandler;
public class DebugFeature extends RegionFeature {
@EventHandler
public void buyingRegion(BuyingRegionEvent event) {
AreaShop.debug("BuyingRegionEvent: " + event.getPlayer().getName() + " is trying to buy " + event.getRegion().getName());
}
@EventHandler
public void boughtRegion(BoughtRegionEvent event) {
AreaShop.debug("BoughtRegionEvent: " + event.getRegion().getPlayerName() + " bought " + event.getRegion().getName());
}
@EventHandler
public void sellingRegion(SellingRegionEvent event) {
AreaShop.debug("SellingRegionEvent: " + event.getRegion().getName() + " is trying to sell " + event.getRegion().getName());
}
@EventHandler
public void soldRegion(SoldRegionEvent event) {
AreaShop.debug("SoldRegionEvent: " + Utils.toName(event.getOldBuyer()) + " sold " + event.getRegion().getName());
}
@EventHandler
public void resellingRegion(ResellingRegionEvent event) {
AreaShop.debug("ResellingRegionEvent: " + event.getRegion().getName() + " is trying to resell " + event.getRegion().getName());
}
@EventHandler
public void resoldRegion(ResoldRegionEvent event) {
AreaShop.debug("ResoldRegionEvent: " + Utils.toName(event.getFromPlayer()) + " resold " + event.getRegion().getName() + " to " + event.getRegion().getPlayerName());
}
@EventHandler
public void rentingRegion(RentingRegionEvent event) {
AreaShop.debug("RentingRegionEvent: " + event.getPlayer().getName() + " is trying to rent " + event.getRegion().getName() + ", extending=" + event.isExtending());
}
@EventHandler
public void rentedRegion(RentedRegionEvent event) {
AreaShop.debug("RentedRegionEvent: " + event.getRegion().getPlayerName() + " rented " + event.getRegion().getName() + ", extending=" + event.hasExtended());
}
@EventHandler
public void unrentingRegion(UnrentingRegionEvent event) {
AreaShop.debug("UnrentingRegionEvent: " + event.getRegion().getPlayerName() + " is trying to unrent " + event.getRegion().getName());
}
@EventHandler
public void unrentedRegion(UnrentedRegionEvent event) {
AreaShop.debug("UnrentedRegionEvent: " + Utils.toName(event.getOldRenter()) + " unrented " + event.getRegion().getName());
}
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
//AreaShop.debug("UpdateRegionEvent: " + event.getRegion().getName() + " updated");
}
@EventHandler
public void addedRegion(AddedRegionEvent event) {
AreaShop.debug("AddedRegionEvent: " + event.getRegion().getName());
}
@EventHandler
public void removedRegion(DeletedRegionEvent event) {
AreaShop.debug("DeletedRegionEvent: " + event.getRegion().getName());
}
@EventHandler
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(DeletedFriendEvent event) {
AreaShop.debug("DeletedFriendEvent: region " + event.getRegion().getName() + ", " + event.getFriend().getName() + " by " + (event.getBy() == null ? "<nobody>" : event.getBy().getName()));
}
}
@@ -0,0 +1,109 @@
package me.wiefferink.areashop.features;
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;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;
public class FriendsFeature extends RegionFeature {
public FriendsFeature(GeneralRegion region) {
setRegion(region);
}
/**
* Add a friend to the region.
* @param player The UUID of the player to add
* @param by The CommandSender that is adding the friend, or null
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
*/
public boolean addFriend(UUID player, CommandSender by) {
// Fire and check event
AddedFriendEvent event = new AddedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
return false;
}
Set<String> friends = new HashSet<>(getRegion().getConfig().getStringList("general.friends"));
friends.add(player.toString());
List<String> list = new ArrayList<>(friends);
getRegion().setSetting("general.friends", list);
return true;
}
/**
* Delete a friend from the region.
* @param player The UUID of the player to delete
* @param by The CommandSender that is adding the friend, or null
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
*/
public boolean deleteFriend(UUID player, CommandSender by) {
// Fire and check event
DeletedFriendEvent event = new DeletedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
plugin.message(by, "general-cancelled", event.getReason(), this);
return false;
}
Set<String> friends = new HashSet<>(getRegion().getConfig().getStringList("general.friends"));
friends.remove(player.toString());
List<String> list = new ArrayList<>(friends);
if(list.isEmpty()) {
getRegion().setSetting("general.friends", null);
} else {
getRegion().setSetting("general.friends", list);
}
return true;
}
/**
* Get the list of friends added to this region.
* @return Friends added to this region
*/
public Set<UUID> getFriends() {
HashSet<UUID> result = new HashSet<>();
for(String friend : getRegion().getConfig().getStringList("general.friends")) {
try {
UUID id = UUID.fromString(friend);
result.add(id);
} catch(IllegalArgumentException e) {
// Don't add it
}
}
return result;
}
/**
* Get the list of friends added to this region.
* @return Friends added to this region
*/
public Set<String> getFriendNames() {
HashSet<String> result = new HashSet<>();
for(UUID friend : getFriends()) {
OfflinePlayer player = Bukkit.getOfflinePlayer(friend);
if(player != null && player.getName() != null) {
result.add(player.getName());
}
}
return result;
}
/**
* Remove all friends that are added to this region.
*/
public void clearFriends() {
getRegion().setSetting("general.friends", null);
}
}
@@ -0,0 +1,6 @@
# Features
This package contains classes that represent a certain feature and implement it for all regions.
* `RegionFeature` represents a single feature, for each implementing class one instance is created without an assigned region, to listen for events etc, and an instance per region is created on-demand to handle region specific things.
* More features will be moved from `GeneralRegion` to these kind of classes, to keep all code for a feature together and cleanup `GeneralRegion`.
@@ -0,0 +1,52 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
public abstract class RegionFeature implements Listener {
public static final AreaShop plugin = AreaShop.getInstance();
public YamlConfiguration config = plugin.getConfig();
private GeneralRegion region;
/**
* Set the region for this feature.
* @param region Feature region
*/
public void setRegion(GeneralRegion region) {
this.region = region;
}
/**
* Get the region of this feature.
* @return region of this feature, or null if generic
*/
public GeneralRegion getRegion() {
return region;
}
/**
* Start listening to events.
*/
public void listen() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Destroy the feature and deregister everything.
*/
public void shutdownFeature() {
HandlerList.unregisterAll(this);
shutdown();
}
/**
* Dummy method a RegionFeature implementation can override.
*/
public void shutdown() {
}
}
@@ -0,0 +1,520 @@
package me.wiefferink.areashop.features;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.areashop.tools.Value;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class TeleportFeature extends RegionFeature {
private static final 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 final 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));
private static final ArrayList<Material> cannotSpawnBeside = new ArrayList<>(Arrays.asList(Material.LAVA, Material.STATIONARY_LAVA, Material.CACTUS));
public TeleportFeature() {
}
public TeleportFeature(GeneralRegion region) {
setRegion(region);
}
/**
* Get the teleportlocation set for this region.
* @return The teleport location, or null if not set
*/
public Location getTeleportLocation() {
return Utils.configToLocation(getRegion().getConfigurationSectionSetting("general.teleportLocation"));
}
/**
* Check if the region has a teleportLocation specified.
* @return true if the region has a teleportlocation, false otherwise
*/
public boolean hasTeleportLocation() {
return getRegion().getConfigurationSectionSetting("general.teleportLocation") != null;
}
/**
* Set the teleport location of this region.
* @param location The location to set as teleport location
*/
public void setTeleport(Location location) {
if(location == null) {
getRegion().setSetting("general.teleportLocation", null);
} else {
getRegion().setSetting("general.teleportLocation", Utils.locationToConfig(location, true));
}
}
/**
* 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 checkRestrictions Set to true if teleport permissions should be checked, false otherwise, also toggles cross-world check
* @return true if the teleport succeeded, otherwise false
*/
public boolean teleportPlayer(Player player, boolean toSign, boolean checkRestrictions) {
// Check basics
if(getRegion().getWorld() == null) {
getRegion().message(player, "general-noWorld");
return false;
}
if(getRegion().getRegion() == null) {
getRegion().message(player, "general-noRegion");
return false;
}
if(checkRestrictions) {
// Check correct world
if(!getRegion().getBooleanSetting("general.teleportCrossWorld") && !player.getWorld().equals(getRegion().getWorld())) {
getRegion().message(player, "teleport-wrongWorld", player.getWorld().getName());
return false;
}
boolean owner = player.getUniqueId().equals(getRegion().getOwner());
boolean friend = getRegion().getFriendsFeature().getFriends().contains(player.getUniqueId());
boolean available = getRegion().isAvailable();
// 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 && available && !player.hasPermission("areashop.teleportavailable") && player.hasPermission("areashop.teleportavailablesign"))) {
getRegion().message(player, "teleport-changedToSign");
toSign = true;
}
// Check permissions
if(owner && !available && !player.hasPermission("areashop.teleport") && !toSign) {
getRegion().message(player, "teleport-noPermission");
return false;
} else if(!owner && !available && !player.hasPermission("areashop.teleportall") && !toSign && !friend) {
getRegion().message(player, "teleport-noPermissionOther");
return false;
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriend") && !toSign && friend) {
getRegion().message(player, "teleport-noPermissionFriend");
return false;
} else if(available && !player.hasPermission("areashop.teleportavailable") && !toSign) {
getRegion().message(player, "teleport-noPermissionAvailable");
return false;
} else if(owner && !available && !player.hasPermission("areashop.teleportsign") && toSign) {
getRegion().message(player, "teleport-noPermissionSign");
return false;
} else if(!owner && !available && !player.hasPermission("areashop.teleportsignall") && toSign && !friend) {
getRegion().message(player, "teleport-noPermissionOtherSign");
return false;
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriendsign") && toSign && friend) {
getRegion().message(player, "teleport-noPermissionFriendSign");
return false;
} else if(available && !player.hasPermission("areashop.teleportavailablesign") && toSign) {
getRegion().message(player, "teleport-noPermissionAvailableSign");
return false;
}
}
// Get the starting location
Value<Boolean> toSignRef = new Value<>(toSign);
Location startLocation = getStartLocation(player, toSignRef);
toSign = toSignRef.get();
boolean insideRegion;
if(toSign) {
insideRegion = getRegion().getBooleanSetting("general.teleportToSignIntoRegion");
} else {
insideRegion = getRegion().getBooleanSetting("general.teleportIntoRegion");
}
// Check locations starting from startLocation and then a cube that increases
// radius around that (until no block in the region is found at all cube sides)
Location safeLocation = startLocation;
ProtectedRegion worldguardRegion = getRegion().getRegion();
boolean blocksInRegion = worldguardRegion.contains(startLocation.getBlockX(), startLocation.getBlockY(), startLocation.getBlockZ());
if(!blocksInRegion && insideRegion) {
getRegion().message(player, "teleport-blocked");
return false;
}
// Tries limit tracking
int radius = 1;
int checked = 1;
int maxTries = plugin.getConfig().getInt("maximumTries");
// Tracking of which sides to continue the search
boolean done = isSafe(safeLocation) && (blocksInRegion || !insideRegion);
boolean northDone = false, eastDone = false, southDone = false, westDone = false, topDone = false, bottomDone = false;
boolean continueThisDirection;
while((blocksInRegion || !insideRegion) && !done) {
blocksInRegion = false;
// North side
continueThisDirection = false;
for(int x = -radius + 1; x <= radius && !done && !northDone; x++) {
for(int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(x, y, -radius);
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
northDone = northDone || !continueThisDirection;
// East side
continueThisDirection = false;
for(int z = -radius + 1; z <= radius && !done && !eastDone; z++) {
for(int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(radius, y, z);
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
eastDone = eastDone || !continueThisDirection;
// South side
continueThisDirection = false;
for(int x = radius - 1; x >= -radius && !done && !southDone; x--) {
for(int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(x, y, radius);
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
southDone = southDone || !continueThisDirection;
// West side
continueThisDirection = false;
for(int z = radius - 1; z >= -radius && !done && !westDone; z--) {
for(int y = -radius + 1; y < radius && !done; y++) {
safeLocation = startLocation.clone().add(-radius, y, z);
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
continue;
}
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
westDone = westDone || !continueThisDirection;
// Top side
continueThisDirection = false;
// Middle block of the top
if((startLocation.getBlockY() + radius) > 256) {
topDone = true;
}
if(!done && !topDone) {
safeLocation = startLocation.clone().add(0, radius, 0);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
for(int r = 1; r <= radius && !done && !topDone; r++) {
// North
for(int x = -r + 1; x <= r && !done; x++) {
safeLocation = startLocation.clone().add(x, radius, -r);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// East
for(int z = -r + 1; z <= r && !done; z++) {
safeLocation = startLocation.clone().add(r, radius, z);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// South side
for(int x = r - 1; x >= -r && !done; x--) {
safeLocation = startLocation.clone().add(x, radius, r);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// West side
for(int z = r - 1; z >= -r && !done; z--) {
safeLocation = startLocation.clone().add(-r, radius, z);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
topDone = topDone || !continueThisDirection;
// Bottom side
continueThisDirection = false;
// Middle block of the bottom
if(startLocation.getBlockY() - radius < 0) {
bottomDone = true;
}
if(!done && !bottomDone) {
safeLocation = startLocation.clone().add(0, -radius, 0);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
for(int r = 1; r <= radius && !done && !bottomDone; r++) {
// North
for(int x = -r + 1; x <= r && !done; x++) {
safeLocation = startLocation.clone().add(x, -radius, -r);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// East
for(int z = -r + 1; z <= r && !done; z++) {
safeLocation = startLocation.clone().add(r, -radius, z);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// South side
for(int x = r - 1; x >= -r && !done; x--) {
safeLocation = startLocation.clone().add(x, -radius, r);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
// West side
for(int z = r - 1; z >= -r && !done; z--) {
safeLocation = startLocation.clone().add(-r, -radius, z);
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
checked++;
done = isSafe(safeLocation) || checked > maxTries;
blocksInRegion = true;
continueThisDirection = true;
}
}
}
bottomDone = bottomDone || !continueThisDirection;
// Increase cube radius
radius++;
}
if(done && isSafe(safeLocation)) {
if(toSign) {
getRegion().message(player, "teleport-successSign");
// Let the player look at the sign
Vector playerVector = safeLocation.toVector();
playerVector.setY(playerVector.getY() + player.getEyeHeight(true));
Vector signVector = getRegion().getSignsFeature().getSigns().get(0).getLocation().toVector().add(new Vector(0.5, 0.5, 0.5));
Vector direction = playerVector.clone().subtract(signVector).normalize();
safeLocation.setYaw(180 - (float)Math.toDegrees(Math.atan2(direction.getX(), direction.getZ())));
safeLocation.setPitch(90 - (float)Math.toDegrees(Math.acos(direction.getY())));
} else {
getRegion().message(player, "teleport-success");
}
player.teleport(safeLocation);
AreaShop.debug("Found location: " + safeLocation.toString() + " Tries: " + (checked - 1));
return true;
} else {
getRegion().message(player, "teleport-noSafe", checked - 1, maxTries);
AreaShop.debug("No location found, checked " + (checked - 1) + " spots of max " + maxTries);
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);
}
/**
* Checks if a certain location is safe to teleport to.
* @param location The location to check
* @return true if it is safe, otherwise false
*/
private boolean isSafe(Location location) {
Block feet = location.getBlock();
Block head = feet.getRelative(BlockFace.UP);
Block below = feet.getRelative(BlockFace.DOWN);
Block above = head.getRelative(BlockFace.UP);
// Check the block at the feet and head of the player
if((feet.getType().isSolid() && !canSpawnIn.contains(feet.getType())) || feet.isLiquid()) {
return false;
} else if((head.getType().isSolid() && !canSpawnIn.contains(head.getType())) || head.isLiquid()) {
return false;
} else if(!below.getType().isSolid() || cannotSpawnOn.contains(below.getType()) || below.isLiquid()) {
return false;
} else if(above.isLiquid() || cannotSpawnBeside.contains(above.getType())) {
return false;
}
// Get all blocks around the player (below foot level, foot level, head level and above head level)
Set<Material> around = new HashSet<>();
for(int y = 0; y <= 3; y++) {
for(int x = -1; x <= 1; x++) {
for(int z = -1; z <= 1; z++) {
// Skip blocks in the column of the player
if(x == 0 && z == 0) {
continue;
}
around.add(below.getRelative(x, y, z).getType());
}
}
}
// Check the blocks around the player
for(Material material : around) {
if(cannotSpawnBeside.contains(material)) {
return false;
}
}
return true;
}
/**
* Get the start location of a safe teleport search.
* @param player The player to get it for
* @param toSign true to try teleporting to the first sign, false for teleporting to the region
* @return The start location
*/
private Location getStartLocation(Player player, Value<Boolean> toSign) {
Location startLocation = null;
ProtectedRegion worldguardRegion = getRegion().getRegion();
// Try to get sign location
List<RegionSign> signs = getRegion().getSignsFeature().getSigns();
boolean signAvailable = !signs.isEmpty();
if(toSign.get()) {
if(signAvailable) {
// Use the location 1 below the sign to prevent weird spawing above the sign
startLocation = signs.get(0).getLocation(); //.subtract(0.0, 1.0, 0.0);
startLocation.setPitch(player.getLocation().getPitch());
startLocation.setYaw(player.getLocation().getYaw());
// Move player x blocks away from the sign
double distance = getRegion().getDoubleSetting("general.teleportSignDistance");
if(distance > 0) {
BlockFace facing = getRegion().getSignsFeature().getSigns().get(0).getFacing();
Vector facingVector = new Vector(facing.getModX(), facing.getModY(), facing.getModZ())
.normalize()
.multiply(distance);
startLocation.setX(startLocation.getBlockX() + 0.5);
startLocation.setZ(startLocation.getBlockZ() + 0.5);
startLocation.add(facingVector);
}
} else {
// No sign available
getRegion().message(player, "teleport-changedToNoSign");
toSign.set(false);
}
}
// Use teleportation location that is set for the region
if(startLocation == null && hasTeleportLocation()) {
startLocation = getTeleportLocation();
}
// Calculate a default location
if(startLocation == null) {
// Set to block in the middle, y configured in the config
com.sk89q.worldedit.Vector middle = com.sk89q.worldedit.Vector.getMidpoint(worldguardRegion.getMaximumPoint(), worldguardRegion.getMinimumPoint());
String configSetting = getRegion().getStringSetting("general.teleportLocationY");
if("bottom".equalsIgnoreCase(configSetting)) {
middle = middle.setY(worldguardRegion.getMinimumPoint().getBlockY());
} else if("top".equalsIgnoreCase(configSetting)) {
middle = middle.setY(worldguardRegion.getMaximumPoint().getBlockY());
} else if("middle".equalsIgnoreCase(configSetting)) {
middle = middle.setY(middle.getBlockY());
} else {
try {
int vertical = Integer.parseInt(configSetting);
middle = middle.setY(vertical);
} catch(NumberFormatException e) {
AreaShop.warn("Could not parse general.teleportLocationY: '" + configSetting + "'");
}
}
startLocation = new Location(getRegion().getWorld(), middle.getX(), middle.getY(), middle.getZ(), player.getLocation().getYaw(), player.getLocation().getPitch());
}
// Set location in the center of the block
startLocation.setX(startLocation.getBlockX() + 0.5);
startLocation.setZ(startLocation.getBlockZ() + 0.5);
return startLocation;
}
}
@@ -0,0 +1,266 @@
package me.wiefferink.areashop.features;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import com.sk89q.worldguard.protection.flags.Flag;
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.UpdateRegionEvent;
import me.wiefferink.areashop.interfaces.RegionAccessSet;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
public class WorldGuardRegionFlagsFeature extends RegionFeature {
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
updateRegionFlags(event.getRegion());
}
/**
* Set the region flags/options to the values of a ConfigurationSection.
* @param region The region to update the flags for
* @return true if the flags have been set correctly, otherwise false
*/
private boolean updateRegionFlags(GeneralRegion region) {
boolean result = true;
// Get section defining the region flag profile
ConfigurationSection flagProfileSection = region.getConfigurationSectionSetting("general.flagProfile", "flagProfiles");
if(flagProfileSection == null) {
return false;
}
// Region flags for all states
ConfigurationSection allFlags = flagProfileSection.getConfigurationSection("ALL");
if(allFlags != null) {
result = result && updateRegionFlags(region, allFlags);
}
// Region flags for the current state
ConfigurationSection stateFlags = flagProfileSection.getConfigurationSection(region.getState().getValue());
// If in reselling mode, fallback to 'resale' section if 'resell' is not found (legacy configuration problem: https://github.com/NLthijs48/AreaShop/issues/303)
if(stateFlags == null && region.getState() == GeneralRegion.RegionState.RESELL) {
stateFlags = flagProfileSection.getConfigurationSection("resale");
}
if(stateFlags != null) {
result = result && updateRegionFlags(region, stateFlags);
}
return result;
}
/**
* Set the region flags/options to the values of a ConfigurationSection.
* @param region The region to update the flags for
* @param flags The flags to apply
* @return true if the flags have been set correctly, otherwise false
*/
private boolean updateRegionFlags(GeneralRegion region, ConfigurationSection flags) {
boolean result = true;
Set<String> flagNames = flags.getKeys(false);
WorldGuardPlugin worldGuard = plugin.getWorldGuard();
// Get the region
ProtectedRegion worldguardRegion = region.getRegion();
if(worldguardRegion == null) {
AreaShop.debug("Region '" + region.getName() + "' does not exist, setting flags failed");
return false;
}
// Loop through all flags that are set in the config
for(String flagName : flagNames) {
String value = Message.fromString(flags.getString(flagName)).replacements(region).getPlain();
// In the config normal Bukkit color codes are used, those only need to be translated on 5.X WorldGuard versions
if(plugin.getWorldGuard().getDescription().getVersion().startsWith("5.")) {
value = translateBukkitToWorldGuardColors(value);
}
if(flagName.equalsIgnoreCase("members")) {
plugin.getWorldGuardHandler().setMembers(worldguardRegion, parseAccessSet(value));
//AreaShop.debug(" Flag " + flagName + " set: " + members.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("owners")) {
plugin.getWorldGuardHandler().setOwners(worldguardRegion, parseAccessSet(value));
//AreaShop.debug(" Flag " + flagName + " set: " + owners.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("priority")) {
try {
int priority = Integer.parseInt(value);
if(worldguardRegion.getPriority() != priority) {
worldguardRegion.setPriority(priority);
}
//AreaShop.debug(" Flag " + flagName + " set: " + value);
} catch(NumberFormatException e) {
AreaShop.warn("The value of flag " + flagName + " is not a number");
result = false;
}
} else if(flagName.equalsIgnoreCase("parent")) {
if(region.getWorld() == null || plugin.getRegionManager(region.getWorld()) == null) {
continue;
}
ProtectedRegion parentRegion = plugin.getRegionManager(region.getWorld()).getRegion(value);
if(parentRegion != null) {
if(!parentRegion.equals(worldguardRegion.getParent())) {
try {
worldguardRegion.setParent(parentRegion);
//AreaShop.debug(" Flag " + flagName + " set: " + value);
} catch(ProtectedRegion.CircularInheritanceException e) {
AreaShop.warn("The parent set in the config is not correct (circular inheritance)");
}
}
} else {
AreaShop.warn("The parent set in the config is not correct (region does not exist)");
}
} else {
// Parse all other normal flags (groups are also handled)
String flagSetting = null;
com.sk89q.worldguard.protection.flags.RegionGroup groupValue = null;
Flag<?> foundFlag = plugin.getWorldGuardHandler().fuzzyMatchFlag(flagName);
if(foundFlag == null) {
AreaShop.warn("Found wrong flag in flagProfiles section: " + flagName + ", check if that is the correct WorldGuard flag");
continue;
}
RegionGroupFlag groupFlag = foundFlag.getRegionGroupFlag();
if(value == null || value.isEmpty()) {
if(worldguardRegion.getFlag(foundFlag) != null) {
worldguardRegion.setFlag(foundFlag, null);
}
if(groupFlag != null && worldguardRegion.getFlag(groupFlag) != null) {
worldguardRegion.setFlag(groupFlag, null);
}
//AreaShop.debug(" Flag " + flagName + " reset (+ possible group of flag)");
} else {
if(groupFlag == null) {
flagSetting = value;
} else {
for(String part : value.split(" ")) {
if(part.startsWith("g:")) {
if(part.length() > 2) {
try {
groupValue = plugin.getWorldGuardHandler().parseFlagGroupInput(groupFlag, part.substring(2));
} catch(InvalidFlagFormat e) {
AreaShop.warn("Found wrong group value for flag " + flagName);
}
}
} else {
if(flagSetting == null) {
flagSetting = part;
} else {
flagSetting += " " + part;
}
}
}
}
if(flagSetting != null) {
try {
setFlag(worldguardRegion, foundFlag, flagSetting);
//AreaShop.debug(" Flag " + flagName + " set: " + flagSetting);
} catch(InvalidFlagFormat e) {
AreaShop.warn("Found wrong value for flag " + flagName);
}
}
if(groupValue != null) {
if(groupValue == groupFlag.getDefault()) {
worldguardRegion.setFlag(groupFlag, null);
//AreaShop.debug(" Group of flag " + flagName + " set to default: " + groupValue);
} else {
worldguardRegion.setFlag(groupFlag, groupValue);
//AreaShop.debug(" Group of flag " + flagName + " set: " + groupValue);
}
}
}
}
}
// Indicate that the regions needs to be saved
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
plugin.getFileManager().saveIsRequiredForRegionWorld(region.getWorldName());
}
return result;
}
/**
* Build an RegionAccessSet from an input that specifies player names, player uuids and groups.
* @param input Input string defining the access set
* @return RegionAccessSet containing the entities parsed from the input
*/
public RegionAccessSet parseAccessSet(String input) {
RegionAccessSet result = new RegionAccessSet();
String[] inputParts = input.split(", ");
for(String access : inputParts) {
if(access != null && !access.isEmpty()) {
// Check for groups
if(access.startsWith("g:")) {
if(access.length() > 2) {
result.getGroupNames().add(access.substring(2));
}
} else if(access.startsWith("n:")) {
if(access.length() > 2) {
result.getPlayerNames().add(access.substring(2));
}
} else {
try {
result.getPlayerUniqueIds().add(UUID.fromString(access));
} catch(IllegalArgumentException e) {
AreaShop.warn("Tried using '" + access + "' as uuid for a region member/owner, is your flagProfiles section correct?");
}
}
}
}
return result;
}
/**
* Set a WorldGuard region flag.
* @param region The WorldGuard region to set
* @param flag The flag to set
* @param value The value to set the flag to
* @param <V> They type of flag to set
* @throws InvalidFlagFormat When the value of the flag is wrong
*/
private <V> void setFlag(ProtectedRegion region, Flag<V> flag, String value) throws InvalidFlagFormat {
V current = region.getFlag(flag);
V next = plugin.getWorldGuardHandler().parseFlagInput(flag, value);
if(!Objects.equals(current, next)) {
region.setFlag(flag, next);
}
}
/**
* Translate the color codes you put in greeting/farewell messages to the weird color codes of WorldGuard.
* @param message The message where the color codes should be translated (this message has bukkit color codes)
* @return The string with the WorldGuard color codes
*/
private String translateBukkitToWorldGuardColors(String message) {
String result = message;
result = result.replace("&c", "&r");
result = result.replace("&4", "&R");
result = result.replace("&e", "&y");
result = result.replace("&6", "&Y");
result = result.replace("&a", "&g");
result = result.replace("&2", "&G");
result = result.replace("&b", "&c");
result = result.replace("&3", "&C");
result = result.replace("&9", "&b");
result = result.replace("&1", "&B");
result = result.replace("&d", "&p");
result = result.replace("&5", "&P");
result = result.replace("&0", "&0");
result = result.replace("&8", "&1");
result = result.replace("&7", "&2");
result = result.replace("&f", "&w");
result = result.replace("&r", "&x");
return result;
}
}
@@ -0,0 +1,252 @@
package me.wiefferink.areashop.features.signs;
import com.google.common.base.Objects;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.interactivemessenger.processing.Message;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Sign;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
/**
* Sign that is connected to a region to display information and interact with the region.
*/
public class RegionSign {
private final SignsFeature signsFeature;
private final String key;
public RegionSign(SignsFeature signsFeature, String key) {
this.signsFeature = signsFeature;
this.key = key;
}
/**
* Get the location of this sign.
* @return The location of this sign
*/
public Location getLocation() {
return Utils.configToLocation(getRegion().getConfig().getConfigurationSection("general.signs." + key + ".location"));
}
/**
* Location string to be used as key in maps.
* @return Location string
*/
public String getStringLocation() {
return SignsFeature.locationToString(getLocation());
}
/**
* Chunk string to be used as key in maps.
* @return Chunk string
*/
public String getStringChunk() {
return SignsFeature.chunkToString(getLocation());
}
/**
* Get the region this sign is linked to.
* @return The region this sign is linked to
*/
public GeneralRegion getRegion() {
return signsFeature.getRegion();
}
/**
* Remove this sign from the region.
*/
public void remove() {
getLocation().getBlock().setType(Material.AIR);
signsFeature.getSignsRef().remove(getStringLocation());
SignsFeature.getAllSigns().remove(getStringLocation());
SignsFeature.getSignsByChunk().get(getStringChunk()).remove(this);
getRegion().setSetting("general.signs." + key, null);
}
/**
* Get the ConfigurationSection defining the sign layout.
* @return The sign layout config
*/
public ConfigurationSection getProfile() {
return getRegion().getConfigurationSectionSetting("general.signProfile", "signProfiles", getRegion().getConfig().get("general.signs." + key + ".profile"));
}
/**
* Get the facing of the sign.
* @return BlockFace the sign faces, or null if unknown
*/
public BlockFace getFacing() {
try {
return BlockFace.valueOf(getRegion().getConfig().getString("general.signs." + key + ".facing"));
} catch(NullPointerException | IllegalArgumentException e) {
return null;
}
}
/**
* Get the material of the sign
* @return Material of the sign, normally {@link Material#WALL_SIGN} or {@link Material#SIGN_POST}, but could be something else or null.
*/
public Material getMaterial() {
try {
return Material.valueOf(getRegion().getConfig().getString("general.signs." + key + ".signType"));
} catch(NullPointerException | IllegalArgumentException e) {
return null;
}
}
/**
* Update this sign.
* @return true if the update was successful, otherwise false
*/
public boolean update() {
// Ignore updates of signs in chunks that are not loaded
Location signLocation = getLocation();
if(signLocation == null
|| signLocation.getWorld() == null
|| !signLocation.getWorld().isChunkLoaded(signLocation.getBlockX() >> 4, signLocation.getBlockZ() >> 4)) {
return false;
}
if(getRegion().isDeleted()) {
return false;
}
YamlConfiguration regionConfig = getRegion().getConfig();
ConfigurationSection signConfig = getProfile();
Block block = signLocation.getBlock();
if(signConfig == null || !signConfig.isSet(getRegion().getState().getValue())) {
block.setType(Material.AIR);
return true;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue());
// Get the lines
String[] signLines = new String[4];
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 = getMaterial();
if(signType != Material.WALL_SIGN && signType != Material.SIGN_POST) {
AreaShop.debug("Setting sign", key, "of region", getRegion().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 = getFacing();
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")) {
getRegion().setSetting("general.signs." + key + ".signType", signState.getType().toString());
}
if(!regionConfig.isString("general.signs." + key + ".facing")) {
getRegion().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(getRegion()).getSingle();
signLines[i] = Utils.applyColors(signLines[i]);
signState.setLine(i, signLines[i]);
}
signState.update();
return true;
}
/**
* Check if the sign needs to update periodically.
* @return true if it needs periodic updates, otherwise false
*/
public boolean needsPeriodicUpdate() {
ConfigurationSection signConfig = getProfile();
if(signConfig == null || !signConfig.isSet(getRegion().getState().getValue().toLowerCase())) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().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.VARIABLE_START + AreaShop.tagTimeLeft + Message.VARIABLE_END)) {
return true;
}
}
return false;
}
/**
* Run commands when a player clicks a sign.
* @param clicker The player that clicked the sign
* @param clickType The type of clicking
* @return true if the commands ran successfully, false if any of them failed
*/
public boolean runSignCommands(Player clicker, GeneralRegion.ClickType clickType) {
ConfigurationSection signConfig = getProfile();
if(signConfig == null) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue().toLowerCase());
// Run player commands if specified
List<String> playerCommands = new ArrayList<>();
for(String command : stateConfig.getStringList(clickType.getValue() + "Player")) {
// TODO move variable checking code to InteractiveMessenger?
playerCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
}
getRegion().runCommands(clicker, playerCommands);
// Run console commands if specified
List<String> consoleCommands = new ArrayList<>();
for(String command : stateConfig.getStringList(clickType.getValue() + "Console")) {
consoleCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
}
getRegion().runCommands(Bukkit.getConsoleSender(), consoleCommands);
return !playerCommands.isEmpty() || !consoleCommands.isEmpty();
}
@Override
public boolean equals(Object object) {
return object instanceof RegionSign && ((RegionSign)object).getRegion().equals(this.getRegion()) && ((RegionSign)object).key.equals(this.key);
}
@Override
public int hashCode() {
return Objects.hashCode(key, getRegion().getName());
}
}
@@ -0,0 +1,600 @@
package me.wiefferink.areashop.features.signs;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.features.RegionFeature;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.bukkitdo.Do;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.world.ChunkLoadEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class SignsFeature extends RegionFeature {
private static final Map<String, RegionSign> allSigns = Collections.synchronizedMap(new HashMap<>());
private static final Map<String, List<RegionSign>> signsByChunk = Collections.synchronizedMap(new HashMap<>());
private Map<String, RegionSign> signs;
public SignsFeature() {
}
/**
* Constructor.
* @param region The region to bind to
*/
public SignsFeature(GeneralRegion region) {
setRegion(region);
signs = new HashMap<>();
// Setup current signs
ConfigurationSection signSection = region.getConfig().getConfigurationSection("general.signs");
if(signSection != null) {
for(String signKey : signSection.getKeys(false)) {
RegionSign sign = new RegionSign(this, signKey);
Location location = sign.getLocation();
if(location == null) {
AreaShop.warn("Sign with key " + signKey + " of region " + region.getName() + " does not have a proper location");
continue;
}
signs.put(sign.getStringLocation(), sign);
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
.add(sign);
}
allSigns.putAll(signs);
}
}
@Override
public void shutdown() {
// Deregister signs from the registry
if(signs != null) {
for(Map.Entry<String, RegionSign> entry : signs.entrySet()) {
allSigns.remove(entry.getKey());
signsByChunk.get(entry.getValue().getStringChunk()).remove(entry.getValue());
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onSignBreak(BlockBreakEvent event) {
if(event.isCancelled()) {
return;
}
Block block = event.getBlock();
// Check if it is a sign
if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) {
// Check if the rent sign is really the same as a saved rent
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign == null) {
return;
}
// Remove the sign of the rental region if the player has permission
if(event.getPlayer().hasPermission("areashop.delsign")) {
regionSign.remove();
plugin.message(event.getPlayer(), "delsign-success", regionSign.getRegion());
} else { // Cancel the breaking of the sign
event.setCancelled(true);
plugin.message(event.getPlayer(), "delsign-noPermission", regionSign.getRegion());
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onIndirectSignBreak(BlockPhysicsEvent event) {
if(event.getBlock().getType() == Material.SIGN_POST || event.getBlock().getType() == Material.WALL_SIGN) {
// Check if the rent sign is really the same as a saved rent
if(SignsFeature.getSignByLocation(event.getBlock().getLocation()) != null) {
// Cancel the sign breaking, will create a floating sign but at least it is not disconnected/gone
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void onSignClick(PlayerInteractEvent event) {
if(event.isCancelled()) {
return;
}
Block block = event.getClickedBlock();
// Check for clicking a sign and rightclicking
if((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK)
&& (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN)) {
// Check if the rent sign is really the same as a saved rent
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign == null) {
return;
}
Player player = event.getPlayer();
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
return;
}
// Get the clicktype
GeneralRegion.ClickType clickType = null;
if(player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.SHIFTLEFTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.LEFTCLICK;
} else if(player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.SHIFTRIGHTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = GeneralRegion.ClickType.RIGHTCLICK;
}
// Run the commands
boolean ran = regionSign.runSignCommands(player, clickType);
// Only cancel event if at least one command has been executed
event.setCancelled(ran);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onSignChange(SignChangeEvent event) {
if(event.isCancelled()) {
return;
}
Player player = event.getPlayer();
if(!plugin.isReady()) {
plugin.message(player, "general-notReady");
return;
}
// Check if the sign is meant for this plugin
if(event.getLine(0).contains(plugin.getConfig().getString("signTags.rent"))) {
if(!player.hasPermission("areashop.createrent") && !player.hasPermission("areashop.createrent.member") && !player.hasPermission("areashop.createrent.owner")) {
plugin.message(player, "setup-noPermissionRent");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
String fourthLine = event.getLine(3);
// Get the regionManager for accessing regions
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
// If the secondLine does not contain a name try to find the region by location
if(secondLine == null || secondLine.length() == 0) {
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
if(regions != null) {
boolean first = true;
ProtectedRegion candidate = null;
for(ProtectedRegion pr : regions) {
if(first) {
candidate = pr;
first = false;
} else {
if(pr.getPriority() > candidate.getPriority()) {
candidate = pr;
} else if(pr.getPriority() < candidate.getPriority()) {
// Already got the correct one
} else if(pr.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} else if(candidate.getParent() != null && candidate.getParent().equals(pr)) {
// Already got the correct one
} else {
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
return;
}
}
}
if(candidate != null) {
secondLine = candidate.getId();
}
}
}
boolean priceSet = fourthLine != null && fourthLine.length() != 0;
boolean durationSet = thirdLine != null && thirdLine.length() != 0;
// check if all the lines are correct
if(secondLine == null || secondLine.length() == 0) {
plugin.message(player, "setup-noRegion");
return;
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, regionManager.getRegion(secondLine), event.getPlayer().getWorld(), GeneralRegion.RegionType.RENT);
if(addResult == FileManager.AddResult.BLACKLISTED) {
plugin.message(player, "setup-blacklisted", secondLine);
} else if(addResult == FileManager.AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign");
} else if(addResult == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
plugin.message(player, "setup-alreadyOtherWorld");
} else if(addResult == FileManager.AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
} else if(thirdLine != null && thirdLine.length() != 0 && !Utils.checkTimeFormat(thirdLine)) {
plugin.message(player, "setup-wrongDuration");
} else {
double price = 0.0;
if(priceSet) {
// Check the fourth line
try {
price = Double.parseDouble(fourthLine);
} catch(NumberFormatException e) {
plugin.message(player, "setup-wrongPrice");
return;
}
}
// Add rent to the FileManager
final RentRegion rent = new RentRegion(secondLine, event.getPlayer().getWorld());
boolean isMember = plugin.getWorldGuardHandler().containsMember(rent.getRegion(), player.getUniqueId());
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(rent.getRegion(), player.getUniqueId());
boolean landlord = (!player.hasPermission("areashop.createrent")
&& ((player.hasPermission("areashop.createrent.owner") && isOwner)
|| (player.hasPermission("areashop.createrent.member") && isMember)));
if(landlord) {
rent.setLandlord(player.getUniqueId(), player.getName());
}
if(priceSet) {
rent.setPrice(price);
}
if(durationSet) {
rent.setDuration(thirdLine);
}
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
rent.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
// Run commands
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
plugin.message(player, "setup-rentSuccess", rent);
// Update the region after the event has written its lines
Do.sync(rent::update);
// Run commands
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
}
} else if(event.getLine(0).contains(plugin.getConfig().getString("signTags.buy"))) {
// Check for permission
if(!player.hasPermission("areashop.createbuy") && !player.hasPermission("areashop.createbuy.member") && !player.hasPermission("areashop.createbuy.owner")) {
plugin.message(player, "setup-noPermissionBuy");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
// Get the regionManager for accessing regions
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
// If the secondLine does not contain a name try to find the region by location
if(secondLine == null || secondLine.length() == 0) {
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
if(regions != null) {
boolean first = true;
ProtectedRegion candidate = null;
for(ProtectedRegion pr : regions) {
if(first) {
candidate = pr;
first = false;
} else {
if(pr.getPriority() > candidate.getPriority()) {
candidate = pr;
} else if(pr.getPriority() < candidate.getPriority()) {
// Already got the correct one
} else if(pr.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} else if(candidate.getParent() != null && candidate.getParent().equals(pr)) {
// Already got the correct one
} else {
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
return;
}
}
}
if(candidate != null) {
secondLine = candidate.getId();
}
}
}
boolean priceSet = thirdLine != null && thirdLine.length() != 0;
// Check if all the lines are correct
if(secondLine == null || secondLine.length() == 0) {
plugin.message(player, "setup-noRegion");
return;
}
ProtectedRegion region = regionManager.getRegion(secondLine);
if(region == null) {
plugin.message(player, "cmd-noRegion", secondLine);
return;
}
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, event.getPlayer().getWorld(), GeneralRegion.RegionType.BUY);
if(addResult == FileManager.AddResult.BLACKLISTED) {
plugin.message(player, "setup-blacklisted", secondLine);
} else if(addResult == FileManager.AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign");
} else if(addResult == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
plugin.message(player, "setup-alreadyOtherWorld");
} else if(addResult == FileManager.AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
} else {
double price = 0.0;
if(priceSet) {
// Check the fourth line
try {
price = Double.parseDouble(thirdLine);
} catch(NumberFormatException e) {
plugin.message(player, "setup-wrongPrice");
return;
}
}
// Add buy to the FileManager
final BuyRegion buy = new BuyRegion(secondLine, event.getPlayer().getWorld());
boolean isMember = plugin.getWorldGuardHandler().containsMember(buy.getRegion(), player.getUniqueId());
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(buy.getRegion(), player.getUniqueId());
boolean landlord = (!player.hasPermission("areashop.createbuy")
&& ((player.hasPermission("areashop.createbuy.owner") && isOwner)
|| (player.hasPermission("areashop.createbuy.member") && isMember)));
if(landlord) {
buy.setLandlord(player.getUniqueId(), player.getName());
}
if(priceSet) {
buy.setPrice(price);
}
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
buy.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
plugin.message(player, "setup-buySuccess", buy);
// Update the region after the event has written its lines
Do.sync(buy::update);
// Run commands
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
}
} else if(event.getLine(0).contains(plugin.getConfig().getString("signTags.add"))) {
// Check for permission
if(!player.hasPermission("areashop.addsign")) {
plugin.message(player, "addsign-noPermission");
return;
}
// Get the other lines
String secondLine = event.getLine(1);
String thirdLine = event.getLine(2);
GeneralRegion region;
if(secondLine != null && secondLine.length() != 0) {
// Get region by secondLine of the sign
region = plugin.getFileManager().getRegion(secondLine);
if(region == null) {
plugin.message(player, "addSign-notRegistered", secondLine);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getImportantRegions(event.getBlock().getLocation());
if(regions.isEmpty()) {
plugin.message(player, "addsign-noRegions");
return;
} else if(regions.size() > 1) {
plugin.message(player, "addsign-couldNotDetectSign", regions.get(0).getName(), regions.get(1).getName());
return;
}
region = regions.get(0);
}
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
if(thirdLine == null || thirdLine.length() == 0) {
region.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
plugin.message(player, "addsign-success", region);
} else {
region.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), thirdLine);
plugin.message(player, "addsign-successProfile", thirdLine, region);
}
// Update the region later because this event will do it first
Do.sync(region::update);
}
}
/**
* Convert a location to a string to use as map key.
* @param location The location to get the key for
* @return A string to use in a map for a location
*/
public static String locationToString(Location location) {
return location.getWorld().getName() + ";" + location.getBlockX() + ";" + location.getBlockY() + ";" + location.getBlockZ();
}
/**
* Convert a chunk to a string to use as map key.
* @param location The location to get the key for
* @return A string to use in a map for a chunk
*/
public static String chunkToString(Location location) {
return location.getWorld().getName() + ";" + (location.getBlockX() >> 4) + ";" + (location.getBlockZ() >> 4);
}
/**
* Convert a chunk to a string to use as map key.
* Use a Location argument to prevent chunk loading!
* @param chunk The location to get the key for
* @return A string to use in a map for a chunk
*/
public static String chunkToString(Chunk chunk) {
return chunk.getWorld().getName() + ";" + chunk.getX() + ";" + chunk.getZ();
}
/**
* Get a sign by a location.
* @param location The location to get the sign for
* @return The RegionSign that is at the location, or null if none
*/
public static RegionSign getSignByLocation(Location location) {
return allSigns.get(locationToString(location));
}
/**
* Get the map with all signs.
* @return Map with all signs: locationString -&gt; RegionSign
*/
public static Map<String, RegionSign> getAllSigns() {
return allSigns;
}
/**
* Get the map with signs by chunk.
* @return Map with signs by chunk: chunkString -&gt; List&lt;RegionSign&gt;
*/
public static Map<String, List<RegionSign>> getSignsByChunk() {
return signsByChunk;
}
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
event.getRegion().getSignsFeature().update();
}
@EventHandler(priority = EventPriority.MONITOR)
public void onChunkLoad(ChunkLoadEvent event) {
List<RegionSign> chunkSigns = signsByChunk.get(chunkToString(event.getChunk()));
if(chunkSigns == null) {
return;
}
Do.forAll(chunkSigns, RegionSign::update);
}
/**
* Update all signs connected to this region.
* @return true if all signs are updated correctly, false if one or more updates failed
*/
public boolean update() {
boolean result = true;
for(RegionSign sign : signs.values()) {
result = result & sign.update();
}
return result;
}
/**
* Check if any of the signs need periodic updating.
* @return true if one or more of the signs need periodic updating, otherwise false
*/
public boolean needsPeriodicUpdate() {
boolean result = false;
for(RegionSign sign : signs.values()) {
result = result | sign.needsPeriodicUpdate();
}
return result;
}
/**
* Get the signs of this region.
* @return List of signs
*/
public List<RegionSign> getSigns() {
return Collections.unmodifiableList(new ArrayList<>(signs.values()));
}
/**
* Get the signs of this region.
* @return Map with signs: locationString -&gt; RegionSign
*/
Map<String, RegionSign> getSignsRef() {
return signs;
}
/**
* Get a list with all sign locations.
* @return A List with all sign locations
*/
public List<Location> getSignLocations() {
List<Location> result = new ArrayList<>();
for(RegionSign sign : signs.values()) {
result.add(sign.getLocation());
}
return result;
}
/**
* Add a sign to this region.
* @param location The location of the sign
* @param signType The type of the sign (WALL_SIGN or SIGN_POST)
* @param facing The orientation of the sign
* @param profile The profile to use with this sign (null for default)
*/
public void addSign(Location location, Material signType, BlockFace facing, String profile) {
int i = 0;
while(getRegion().getConfig().isSet("general.signs." + i)) {
i++;
}
String signPath = "general.signs." + i + ".";
getRegion().setSetting(signPath + "location", Utils.locationToConfig(location));
getRegion().setSetting(signPath + "facing", facing != null ? facing.name() : null);
getRegion().setSetting(signPath + "signType", signType != null ? signType.name() : null);
if(profile != null && profile.length() != 0) {
getRegion().setSetting(signPath + "profile", profile);
}
// Add to the map
RegionSign sign = new RegionSign(this, i + "");
signs.put(sign.getStringLocation(), sign);
allSigns.put(sign.getStringLocation(), sign);
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
.add(sign);
}
/**
* Checks if there is a sign from this region at the specified location.
* @param location Location to check
* @return true if this region has a sign at the location, otherwise false
*/
public boolean isSignOfRegion(Location location) {
Set<String> signs;
if(getRegion().getConfig().getConfigurationSection("general.signs") == null) {
return false;
}
signs = getRegion().getConfig().getConfigurationSection("general.signs").getKeys(false);
for(String sign : signs) {
Location signLocation = Utils.configToLocation(getRegion().getConfig().getConfigurationSection("general.signs." + sign + ".location"));
if(signLocation != null
&& signLocation.getWorld().equals(location.getWorld())
&& signLocation.getBlockX() == location.getBlockX()
&& signLocation.getBlockY() == location.getBlockY()
&& signLocation.getBlockZ() == location.getBlockZ()) {
return true;
}
}
return false;
}
}
@@ -0,0 +1,769 @@
/*
* Copyright 2011-2013 Tyler Blair. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and contributors and should not be interpreted as representing official policies,
* either expressed or implied, of anybody else.
*/
package me.wiefferink.areashop.lib;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.scheduler.BukkitTask;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Level;
import java.util.zip.GZIPOutputStream;
public class Metrics {
/**
* The current revision number.
*/
private static final int REVISION = 7;
/**
* The base url of the metrics domain.
*/
private static final String BASE_URL = "http://report.mcstats.org";
/**
* The url used to report a server's status.
*/
private static final String REPORT_URL = "/plugin/%s";
/**
* Interval of time to ping (in minutes).
*/
private static final int PING_INTERVAL = 15;
/**
* The plugin this metrics submits for.
*/
private final Plugin plugin;
/**
* All of the custom graphs to submit to metrics.
*/
private final Set<Graph> graphs = Collections.synchronizedSet(new HashSet<Graph>());
/**
* The plugin configuration file.
*/
private final YamlConfiguration configuration;
/**
* The plugin configuration file.
*/
private final File configurationFile;
/**
* Unique server id.
*/
private final String guid;
/**
* Debug mode.
*/
private final boolean debug;
/**
* Lock for synchronization.
*/
private final Object optOutLock = new Object();
/**
* The scheduled task.
*/
private volatile BukkitTask task = null;
/**
* Constructor.
* @param plugin The plugin to report stats for
* @throws IOException When the plugin or configuration is wrong
*/
public Metrics(final Plugin plugin) throws IOException {
if(plugin == null) {
throw new IllegalArgumentException("Plugin cannot be null");
}
this.plugin = plugin;
// load the config
configurationFile = getConfigFile();
configuration = YamlConfiguration.loadConfiguration(configurationFile);
// add some defaults
configuration.addDefault("opt-out", false);
configuration.addDefault("guid", UUID.randomUUID().toString());
configuration.addDefault("debug", false);
// Do we need to create the file?
if(configuration.get("guid", null) == null) {
configuration.options().header("http://mcstats.org").copyDefaults(true);
configuration.save(configurationFile);
}
// Load the guid then
guid = configuration.getString("guid");
debug = configuration.getBoolean("debug", false);
}
/**
* Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics
* website. Plotters can be added to the graph object returned.
* @param name The name of the graph
* @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given
*/
public Graph createGraph(final String name) {
if(name == null) {
throw new IllegalArgumentException("Graph name cannot be null");
}
// Construct the graph object
final Graph graph = new Graph(name);
// Now we can add our graph
graphs.add(graph);
// and return back
return graph;
}
/**
* Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend.
* @param graph The name of the graph
*/
public void addGraph(final Graph graph) {
if(graph == null) {
throw new IllegalArgumentException("Graph cannot be null");
}
graphs.add(graph);
}
/**
* Start measuring statistics. This will immediately create an async repeating task as the plugin and send the
* initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200
* ticks.
* @return True if statistics measuring is running, otherwise false.
*/
public boolean start() {
synchronized(optOutLock) {
// Did we opt out?
if(isOptOut()) {
return false;
}
// Is metrics already running?
if(task != null) {
return true;
}
// Begin hitting the server with glorious data
task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() {
private boolean firstPost = true;
public void run() {
try {
// This has to be synchronized or it can collide with the disable method.
synchronized(optOutLock) {
// Disable Task, if it is running and the server owner decided to opt-out
if(isOptOut() && task != null) {
task.cancel();
task = null;
// Tell all plotters to stop gathering information.
for(Graph graph : graphs) {
graph.onOptOut();
}
}
}
// We use the inverse of firstPost because if it is the first time we are posting,
// it is not a interval ping, so it evaluates to FALSE
// Each time thereafter it will evaluate to TRUE, i.e PING!
postPlugin(!firstPost);
// After the first post we set firstPost to false
// Each post thereafter will be a ping
firstPost = false;
} catch(IOException e) {
if(debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
}
}
}
}, 0, PING_INTERVAL * 1200);
return true;
}
}
/**
* If the server owner denied plugin metrics.
* @return true if metrics should be opted out of it
*/
public boolean isOptOut() {
synchronized(optOutLock) {
try {
// Reload the metrics file
configuration.load(getConfigFile());
} catch(IOException ex) {
if(debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
}
return true;
} catch(InvalidConfigurationException ex) {
if(debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
}
return true;
}
return configuration.getBoolean("opt-out", false);
}
}
/**
* Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task.
* @throws IOException when saving the config file fails
*/
public void enable() throws IOException {
// This has to be synchronized or it can collide with the check in the task.
synchronized(optOutLock) {
// Check if the server owner has already set opt-out, if not, set it.
if(isOptOut()) {
configuration.set("opt-out", false);
configuration.save(configurationFile);
}
// Enable Task, if it is not running
if(task == null) {
start();
}
}
}
/**
* Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task.
* @throws IOException when saving the config file fails
*/
public void disable() throws IOException {
// This has to be synchronized or it can collide with the check in the task.
synchronized(optOutLock) {
// Check if the server owner has already set opt-out, if not, set it.
if(!isOptOut()) {
configuration.set("opt-out", true);
configuration.save(configurationFile);
}
// Disable Task, if it is running
if(task != null) {
task.cancel();
task = null;
}
}
}
/**
* Gets the File object of the config file that should be used to store data such as the GUID and opt-out status.
* @return the File object for the config file
*/
public File getConfigFile() {
// I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use
// is to abuse the plugin object we already have
// plugin.getDataFolder() => base/plugins/PluginA/
// pluginsFolder => base/plugins/
// The base is not necessarily relative to the startup directory.
File pluginsFolder = plugin.getDataFolder().getParentFile();
// return => base/plugins/PluginMetrics/config.yml
return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml");
}
/**
* Gets the online player (backwards compatibility).
* @return online player amount
*/
private int getOnlinePlayers() {
try {
Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers");
if(onlinePlayerMethod.getReturnType().equals(Collection.class)) {
return ((Collection<?>)onlinePlayerMethod.invoke(Bukkit.getServer())).size();
} else {
return ((Player[])onlinePlayerMethod.invoke(Bukkit.getServer())).length;
}
} catch(Exception ex) {
if(debug) {
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
}
}
return 0;
}
/**
* Generic method that posts a plugin to the metrics website.
*/
private void postPlugin(final boolean isPing) throws IOException {
// Server software specific section
PluginDescriptionFile description = plugin.getDescription();
String pluginName = description.getName();
boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled
String pluginVersion = description.getVersion();
String serverVersion = Bukkit.getVersion();
int playersOnline = this.getOnlinePlayers();
// END server software specific section -- all code below does not use any code outside of this class / Java
// Construct the post data
StringBuilder json = new StringBuilder(1024);
json.append('{');
// The plugin's description file containg all of the plugin data such as name, version, author, etc
appendJsonPair(json, "guid", guid);
appendJsonPair(json, "plugin_version", pluginVersion);
appendJsonPair(json, "server_version", serverVersion);
appendJsonPair(json, "players_online", Integer.toString(playersOnline));
// New data as of R6
String osname = System.getProperty("os.name");
String osarch = System.getProperty("os.arch");
String osversion = System.getProperty("os.version");
String javaVersion = System.getProperty("java.version");
int coreCount = Runtime.getRuntime().availableProcessors();
// normalize os arch .. amd64 -> x86_64
if(osarch.equals("amd64")) {
osarch = "x86_64";
}
appendJsonPair(json, "osname", osname);
appendJsonPair(json, "osarch", osarch);
appendJsonPair(json, "osversion", osversion);
appendJsonPair(json, "cores", Integer.toString(coreCount));
appendJsonPair(json, "auth_mode", onlineMode ? "1" : "0");
appendJsonPair(json, "java_version", javaVersion);
// If we're pinging, append it
if(isPing) {
appendJsonPair(json, "ping", "1");
}
if(graphs.size() > 0) {
synchronized(graphs) {
json.append(',');
json.append('"');
json.append("graphs");
json.append('"');
json.append(':');
json.append('{');
boolean firstGraph = true;
final Iterator<Graph> iter = graphs.iterator();
while(iter.hasNext()) {
Graph graph = iter.next();
StringBuilder graphJson = new StringBuilder();
graphJson.append('{');
for(Plotter plotter : graph.getPlotters()) {
appendJsonPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue()));
}
graphJson.append('}');
if(!firstGraph) {
json.append(',');
}
json.append(escapeJson(graph.getName()));
json.append(':');
json.append(graphJson);
firstGraph = false;
}
json.append('}');
}
}
// close json
json.append('}');
// Create the url
URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName)));
// Connect to the website
URLConnection connection;
// Mineshafter creates a socks proxy, so we can safely bypass it
// It does not reroute POST requests so we need to go around it
if(isMineshafterPresent()) {
connection = url.openConnection(Proxy.NO_PROXY);
} else {
connection = url.openConnection();
}
byte[] uncompressed = json.toString().getBytes();
byte[] compressed = gzip(json.toString());
// Headers
connection.addRequestProperty("User-Agent", "MCStats/" + REVISION);
connection.addRequestProperty("Content-Type", "application/json");
connection.addRequestProperty("Content-Encoding", "gzip");
connection.addRequestProperty("Content-Length", Integer.toString(compressed.length));
connection.addRequestProperty("Accept", "application/json");
connection.addRequestProperty("Connection", "close");
connection.setDoOutput(true);
if(debug) {
System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length);
}
// Write the data
OutputStream os = connection.getOutputStream();
os.write(compressed);
os.flush();
// Now read the response
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String response = reader.readLine();
// close resources
os.close();
reader.close();
if(response == null || response.startsWith("ERR") || response.startsWith("7")) {
if(response == null) {
response = "null";
} else if(response.startsWith("7")) {
response = response.substring(response.startsWith("7,") ? 2 : 1);
}
throw new IOException(response);
} else {
// Is this the first update this hour?
if(response.equals("1") || response.contains("This is your first update this hour")) {
synchronized(graphs) {
final Iterator<Graph> iter = graphs.iterator();
while(iter.hasNext()) {
final Graph graph = iter.next();
for(Plotter plotter : graph.getPlotters()) {
plotter.reset();
}
}
}
}
}
}
/**
* GZip compress a string of bytes.
* @param input Content to gzip
* @return byte[] of the gzipped input
*/
public static byte[] gzip(String input) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzos = null;
try {
gzos = new GZIPOutputStream(baos);
gzos.write(input.getBytes(StandardCharsets.UTF_8));
} catch(IOException e) {
e.printStackTrace();
} finally {
if(gzos != null) {
try {
gzos.close();
} catch(IOException ignore) {
// ignore
}
}
}
return baos.toByteArray();
}
/**
* Check if mineshafter is present. If it is, we need to bypass it to send POST requests
* @return true if mineshafter is installed on the server
*/
private boolean isMineshafterPresent() {
try {
Class.forName("mineshafter.MineServer");
return true;
} catch(Exception e) {
return false;
}
}
/**
* Appends a json encoded key/value pair to the given string builder.
*/
private static void appendJsonPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException {
boolean isValueNumeric = false;
try {
if(value.equals("0") || !value.endsWith("0")) {
Double.parseDouble(value);
isValueNumeric = true;
}
} catch(NumberFormatException e) {
isValueNumeric = false;
}
if(json.charAt(json.length() - 1) != '{') {
json.append(',');
}
json.append(escapeJson(key));
json.append(':');
if(isValueNumeric) {
json.append(value);
} else {
json.append(escapeJson(value));
}
}
/**
* Escape a string to create a valid JSON string.
*/
private static String escapeJson(String text) {
StringBuilder builder = new StringBuilder();
builder.append('"');
for(int index = 0; index < text.length(); index++) {
char chr = text.charAt(index);
switch(chr) {
case '"':
case '\\':
builder.append('\\');
builder.append(chr);
break;
case '\b':
builder.append("\\b");
break;
case '\t':
builder.append("\\t");
break;
case '\n':
builder.append("\\n");
break;
case '\r':
builder.append("\\r");
break;
default:
if(chr < ' ') {
String t = "000" + Integer.toHexString(chr);
builder.append("\\u" + t.substring(t.length() - 4));
} else {
builder.append(chr);
}
break;
}
}
builder.append('"');
return builder.toString();
}
/**
* Encode text as UTF-8.
* @param text the text to encode
* @return the encoded text, as UTF-8
*/
private static String urlEncode(final String text) throws UnsupportedEncodingException {
return URLEncoder.encode(text, "UTF-8");
}
/**
* Represents a custom graph on the website.
*/
public static class Graph {
/**
* The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is
* rejected.
*/
private final String name;
/**
* The set of plotters that are contained within this graph.
*/
private final Set<Plotter> plotters = new LinkedHashSet<Plotter>();
private Graph(final String name) {
this.name = name;
}
/**
* Gets the graph's name.
* @return the Graph's name
*/
public String getName() {
return name;
}
/**
* Add a plotter to the graph, which will be used to plot entries.
* @param plotter the plotter to add to the graph
*/
public void addPlotter(final Plotter plotter) {
plotters.add(plotter);
}
/**
* Remove a plotter from the graph.
* @param plotter the plotter to remove from the graph
*/
public void removePlotter(final Plotter plotter) {
plotters.remove(plotter);
}
/**
* Gets an <b>unmodifiable</b> set of the plotter objects in the graph.
* @return an unmodifiable {@link java.util.Set} of the plotter objects
*/
public Set<Plotter> getPlotters() {
return Collections.unmodifiableSet(plotters);
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(final Object object) {
if(!(object instanceof Graph)) {
return false;
}
final Graph graph = (Graph)object;
return graph.name.equals(name);
}
/**
* Called when the server owner decides to opt-out of BukkitMetrics while the server is running.
*/
protected void onOptOut() {
}
}
/**
* Interface used to collect custom data for a plugin.
*/
public abstract static class Plotter {
/**
* The plot's name.
*/
private final String name;
/**
* Construct a plotter with the default plot name.
*/
public Plotter() {
this("Default");
}
/**
* Construct a plotter with a specific plot name.
* @param name the name of the plotter to use, which will show up on the website
*/
public Plotter(final String name) {
this.name = name;
}
/**
* Get the current value for the plotted point. Since this function defers to an external function it may or may
* not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called
* from any thread so care should be taken when accessing resources that need to be synchronized.
* @return the current value for the point to be plotted.
*/
public abstract int getValue();
/**
* Get the column name for the plotted point.
* @return the plotted point's column name
*/
public String getColumnName() {
return name;
}
/**
* Called after the website graphs have been updated.
*/
public void reset() {
}
@Override
public int hashCode() {
return getColumnName().hashCode();
}
@Override
public boolean equals(final Object object) {
if(!(object instanceof Plotter)) {
return false;
}
final Plotter plotter = (Plotter)object;
return plotter.name.equals(name) && plotter.getValue() == getValue();
}
}
}
@@ -0,0 +1,163 @@
package me.wiefferink.areashop.listeners;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.areashop.tools.Utils;
import me.wiefferink.bukkitdo.Do;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.player.PlayerQuitEvent;
import java.util.ArrayList;
import java.util.List;
/**
* Notify region expiry and track activity time.
*/
public final class PlayerLoginLogoutListener implements Listener {
private final AreaShop plugin;
/**
* Constructor.
* @param plugin The AreaShop plugin
*/
public PlayerLoginLogoutListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a sign is changed.
* @param event The event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogin(PlayerLoginEvent event) {
if(event.getResult() != Result.ALLOWED) {
return;
}
final Player player = event.getPlayer();
// Schedule task to check for notifications, prevents a lag spike at login
Do.syncTimerLater(25, 25, () -> {
// Delay until all regions are loaded
if(!plugin.isReady()) {
return true;
}
if(!player.isOnline()) {
return false;
}
// Notify for rents that almost run out
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isRenter(player)) {
String warningSetting = region.getStringSetting("rent.warningOnLoginTime");
if(warningSetting == null || warningSetting.isEmpty()) {
continue;
}
long warningTime = Utils.durationStringToLong(warningSetting);
if(region.getTimeLeft() < warningTime) {
// Send the warning message later to let it appear after general MOTD messages
AreaShop.getInstance().message(player, "rent-expireWarning", region);
}
}
}
// Notify admins for plugin updates
AreaShop.getInstance().notifyUpdate(player);
return false;
});
// Check if the player has regions that use an old name of him and update them
Do.syncTimerLater(22, 10, () -> {
if(!plugin.isReady()) {
return true;
}
List<GeneralRegion> regions = new ArrayList<>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.isOwner(player)) {
regions.add(region);
}
}
Do.forAll(
plugin.getConfig().getInt("nameupdate.regionsPerTick"),
regions,
region -> {
if(region instanceof BuyRegion) {
if(!player.getName().equals(region.getStringSetting("buy.buyerName"))) {
region.setSetting("buy.buyerName", player.getName());
region.update();
}
} else if(region instanceof RentRegion) {
if(!player.getName().equals(region.getStringSetting("rent.renterName"))) {
region.setSetting("rent.renterName", player.getName());
region.update();
}
}
}
);
return false;
});
}
// Active time updates
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogout(PlayerQuitEvent event) {
updateLastActive(event.getPlayer());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerKick(PlayerKickEvent event) {
updateLastActive(event.getPlayer());
}
/**
* Update the last active time for all regions the player is owner off.
* @param player The player to update the active times for
*/
private void updateLastActive(Player player) {
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.isOwner(player)) {
region.updateLastActiveTime();
}
}
}
}
@@ -0,0 +1,214 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.commands.AddCommand;
import me.wiefferink.areashop.commands.AddfriendCommand;
import me.wiefferink.areashop.commands.AddsignCommand;
import me.wiefferink.areashop.commands.BuyCommand;
import me.wiefferink.areashop.commands.CommandAreaShop;
import me.wiefferink.areashop.commands.DelCommand;
import me.wiefferink.areashop.commands.DelfriendCommand;
import me.wiefferink.areashop.commands.DelsignCommand;
import me.wiefferink.areashop.commands.FindCommand;
import me.wiefferink.areashop.commands.GroupaddCommand;
import me.wiefferink.areashop.commands.GroupdelCommand;
import me.wiefferink.areashop.commands.GroupinfoCommand;
import me.wiefferink.areashop.commands.GrouplistCommand;
import me.wiefferink.areashop.commands.HelpCommand;
import me.wiefferink.areashop.commands.ImportCommand;
import me.wiefferink.areashop.commands.InfoCommand;
import me.wiefferink.areashop.commands.LinksignsCommand;
import me.wiefferink.areashop.commands.MeCommand;
import me.wiefferink.areashop.commands.MessageCommand;
import me.wiefferink.areashop.commands.ReloadCommand;
import me.wiefferink.areashop.commands.RentCommand;
import me.wiefferink.areashop.commands.ResellCommand;
import me.wiefferink.areashop.commands.SchematiceventCommand;
import me.wiefferink.areashop.commands.SellCommand;
import me.wiefferink.areashop.commands.SetdurationCommand;
import me.wiefferink.areashop.commands.SetlandlordCommand;
import me.wiefferink.areashop.commands.SetownerCommand;
import me.wiefferink.areashop.commands.SetpriceCommand;
import me.wiefferink.areashop.commands.SetrestoreCommand;
import me.wiefferink.areashop.commands.SetteleportCommand;
import me.wiefferink.areashop.commands.StackCommand;
import me.wiefferink.areashop.commands.StopresellCommand;
import me.wiefferink.areashop.commands.TeleportCommand;
import me.wiefferink.areashop.commands.UnrentCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
public class CommandManager extends Manager implements CommandExecutor, TabCompleter {
private final ArrayList<CommandAreaShop> commands;
/**
* Constructor.
*/
public CommandManager() {
commands = new ArrayList<>();
commands.add(new HelpCommand());
commands.add(new RentCommand());
commands.add(new UnrentCommand());
commands.add(new BuyCommand());
commands.add(new SellCommand());
commands.add(new MeCommand());
commands.add(new InfoCommand());
commands.add(new TeleportCommand());
commands.add(new SetteleportCommand());
commands.add(new AddfriendCommand());
commands.add(new DelfriendCommand());
commands.add(new FindCommand());
commands.add(new ResellCommand());
commands.add(new StopresellCommand());
commands.add(new SetrestoreCommand());
commands.add(new SetpriceCommand());
commands.add(new SetownerCommand());
commands.add(new SetdurationCommand());
commands.add(new ReloadCommand());
commands.add(new GroupaddCommand());
commands.add(new GroupdelCommand());
commands.add(new GrouplistCommand());
commands.add(new GroupinfoCommand());
commands.add(new SchematiceventCommand());
commands.add(new AddCommand());
commands.add(new DelCommand());
commands.add(new AddsignCommand());
commands.add(new DelsignCommand());
commands.add(new LinksignsCommand());
commands.add(new StackCommand());
commands.add(new SetlandlordCommand());
commands.add(new MessageCommand());
commands.add(new ImportCommand());
// Register commands in bukkit
plugin.getCommand("AreaShop").setExecutor(this);
plugin.getCommand("AreaShop").setTabCompleter(this);
}
/**
* Get the list with AreaShop commands.
* @return The list with AreaShop commands
*/
public ArrayList<CommandAreaShop> getCommands() {
return commands;
}
/**
* Shows the help page for the CommandSender.
* @param target The CommandSender to show the help to
*/
public void showHelp(CommandSender target) {
if(!target.hasPermission("areashop.help")) {
plugin.message(target, "help-noPermission");
return;
}
// Add all messages to a list
ArrayList<String> messages = new ArrayList<>();
plugin.message(target, "help-header");
plugin.message(target, "help-alias");
for(CommandAreaShop command : commands) {
String help = command.getHelp(target);
if(help != null && help.length() != 0) {
messages.add(help);
}
}
// Send the messages to the target
for(String message : messages) {
plugin.messageNoPrefix(target, message);
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
if(!plugin.isReady()) {
plugin.message(sender, "general-notReady");
return true;
}
// Redirect `/as info player <player>` to `/as me <player>`
if(args.length == 3 && "info".equals(args[0]) && "player".equals(args[1])) {
args[0] = "me";
args[1] = args[2];
}
// Execute command
boolean executed = false;
for(int i = 0; i < commands.size() && !executed; i++) {
if(commands.get(i).canExecute(command, args)) {
commands.get(i).execute(sender, args);
executed = true;
}
}
if(!executed && args.length == 0) {
this.showHelp(sender);
} else if(!executed && args.length > 0) {
// Indicate that the '/as updaterents' and '/as updatebuys' commands are removed
if("updaterents".equalsIgnoreCase(args[0]) || "updatebuys".equalsIgnoreCase(args[0])) {
plugin.message(sender, "reload-updateCommandChanged");
} else {
plugin.message(sender, "cmd-notValid");
}
}
return true;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
List<String> result = new ArrayList<>();
if(!sender.hasPermission("areashop.tabcomplete")) {
return result;
}
int toCompleteNumber = args.length;
String toCompletePrefix = args[args.length - 1].toLowerCase();
//AreaShop.debug("toCompleteNumber=" + toCompleteNumber + ", toCompletePrefix=" + toCompletePrefix + ", length=" + toCompletePrefix.length());
if(toCompleteNumber == 1) {
for(CommandAreaShop c : commands) {
String begin = c.getCommandStart();
result.add(begin.substring(begin.indexOf(' ') + 1));
}
} else {
String[] start = new String[args.length];
start[0] = command.getName();
System.arraycopy(args, 0, start, 1, args.length - 1);
for(CommandAreaShop c : commands) {
if(c.canExecute(command, args)) {
result = c.getTabCompleteList(toCompleteNumber, start, sender);
}
}
}
// Filter and sort the results
if(result.size() > 0) {
SortedSet<String> set = new TreeSet<>();
for(String suggestion : result) {
if(suggestion.toLowerCase().startsWith(toCompletePrefix)) {
set.add(suggestion);
}
}
result.clear();
result.addAll(set);
}
//AreaShop.debug("Tabcomplete #" + toCompleteNumber + ", prefix="+ toCompletePrefix + ", result=" + result.toString());
return result;
}
}
@@ -0,0 +1,88 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.DebugFeature;
import me.wiefferink.areashop.features.FriendsFeature;
import me.wiefferink.areashop.features.RegionFeature;
import me.wiefferink.areashop.features.TeleportFeature;
import me.wiefferink.areashop.features.WorldGuardRegionFlagsFeature;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class FeatureManager extends Manager {
// List of defined features
private static final Set<Class<? extends RegionFeature>> featureClasses = new HashSet<>(Arrays.asList(
DebugFeature.class,
SignsFeature.class,
FriendsFeature.class,
WorldGuardRegionFlagsFeature.class,
TeleportFeature.class
));
// One instance of each feature, registered for event handling
private final Set<RegionFeature> globalFeatures;
private final Map<Class<? extends RegionFeature>, Constructor<? extends RegionFeature>> regionFeatureConstructors;
/**
* Constructor.
*/
public FeatureManager() {
// Instantiate and register global features (one per type, for event handling)
globalFeatures = new HashSet<>();
for(Class<? extends RegionFeature> clazz : featureClasses) {
try {
Constructor<? extends RegionFeature> constructor = clazz.getConstructor();
try {
RegionFeature feature = constructor.newInstance();
feature.listen();
globalFeatures.add(feature);
} catch(InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
AreaShop.error("Failed to instantiate global feature:", clazz, e);
}
} catch(NoSuchMethodException e) {
// Feature does not have a global part
}
}
// Setup constructors for region specific features
regionFeatureConstructors = new HashMap<>();
for(Class<? extends RegionFeature> clazz : featureClasses) {
try {
regionFeatureConstructors.put(clazz, clazz.getConstructor(GeneralRegion.class));
} catch(NoSuchMethodException | IllegalArgumentException e) {
// The feature does not have a region specific part
}
}
}
@Override
public void shutdown() {
for(RegionFeature feature : globalFeatures) {
feature.shutdown();
}
}
/**
* Instanciate a feature for a certain region.
* @param region The region to create a feature for
* @param featureClazz The class of the feature to create
* @return The feature class
*/
public RegionFeature getRegionFeature(GeneralRegion region, Class<? extends RegionFeature> featureClazz) {
try {
return regionFeatureConstructors.get(featureClazz).newInstance(region);
} catch(InstantiationException | InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
AreaShop.error("Failed to instanciate feature", featureClazz, "for region", region, e, e.getCause());
}
return null;
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,16 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
public abstract class Manager {
final AreaShop plugin = AreaShop.getInstance();
/**
* Called at shutdown of the plugin.
*/
public void shutdown() {
// To override by extending classes
}
}
@@ -0,0 +1,231 @@
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.features.signs.RegionSign;
import me.wiefferink.areashop.features.signs.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.tools.Utils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.material.Sign;
import org.bukkit.util.BlockIterator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class SignLinkerManager extends Manager implements Listener {
private final Map<UUID, SignLinker> signLinkers;
private boolean eventsRegistered;
public SignLinkerManager() {
signLinkers = new HashMap<>();
eventsRegistered = false;
}
@Override
public void shutdown() {
for(UUID uuid : signLinkers.keySet()) {
exitSignLinkMode(Bukkit.getPlayer(uuid));
}
}
/**
* Let a player enter sign linking mode.
* @param player The player that has to enter sign linking mode
* @param profile The profile to use for the signs (null for default)
*/
public void enterSignLinkMode(Player player, String profile) {
signLinkers.put(player.getUniqueId(), new SignLinker(player, profile));
plugin.message(player, "linksigns-first");
plugin.message(player, "linksigns-next");
if(!eventsRegistered) {
eventsRegistered = true;
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
}
/**
* Let a player exit sign linking mode.
* @param player The player that has to exit sign linking mode
*/
public void exitSignLinkMode(Player player) {
signLinkers.remove(player.getUniqueId());
if(eventsRegistered && signLinkers.isEmpty()) {
eventsRegistered = false;
HandlerList.unregisterAll(this);
}
plugin.message(player, "linksigns-stopped");
}
/**
* Check if the player is in sign linking mode.
* @param player The player to check
* @return true if the player is in sign linking mode, otherwise false
*/
public boolean isInSignLinkMode(Player player) {
return signLinkers.containsKey(player.getUniqueId());
}
/**
* On player interactions.
* @param event The PlayerInteractEvent
*/
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerInteract(PlayerInteractEvent event) {
if(isInSignLinkMode(event.getPlayer())) {
event.setCancelled(true);
Player player = event.getPlayer();
SignLinker linker = signLinkers.get(event.getPlayer().getUniqueId());
if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
// Get the region
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext()) {
Block next = blockIterator.next();
List<GeneralRegion> regions = Utils.getRegions(next.getLocation());
if(regions.size() == 1) {
linker.setRegion(regions.get(0));
return;
} else if(regions.size() > 1) {
Set<String> names = new HashSet<>();
for(GeneralRegion region : regions) {
names.add(region.getName());
}
plugin.message(player, "linksigns-multipleRegions", Utils.createCommaSeparatedList(names));
plugin.message(player, "linksigns-multipleRegionsAdvice");
return;
}
}
// No regions found within the maximum range
plugin.message(player, "linksigns-noRegions");
} else if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
Block block = null;
BlockIterator blockIterator = new BlockIterator(player, 100);
while(blockIterator.hasNext() && block == null) {
Block next = blockIterator.next();
if(next.getType() != Material.AIR) {
block = next;
}
}
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
plugin.message(player, "linksigns-noSign");
return;
}
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign != null) {
plugin.message(player, "linksigns-alreadyRegistered", regionSign.getRegion());
return;
}
Sign sign = (Sign)block.getState().getData();
linker.setSign(block.getLocation(), block.getType(), sign.getFacing());
}
}
}
/**
* Handle disconnection players.
* @param event The PlayerQuitEvent
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLeave(PlayerQuitEvent event) {
exitSignLinkMode(event.getPlayer());
}
/**
* Class to keep track of the signlinking data.
*/
private class SignLinker {
private boolean hasSign = false;
private boolean hasRegion = false;
public final Player linker;
public final String profile;
public GeneralRegion region = null;
public Location location = null;
public Material type = null;
public BlockFace facing = null;
public SignLinker(Player linker, String profile) {
this.linker = linker;
this.profile = profile;
}
public void setRegion(GeneralRegion region) {
this.region = region;
hasRegion = true;
if(!isComplete()) {
plugin.message(linker, "linksigns-regionFound", region);
}
finish();
}
public void setSign(Location location, Material type, BlockFace facing) {
this.location = location;
this.type = type;
this.facing = facing;
hasSign = true;
if(!isComplete()) {
plugin.message(linker, "linksigns-signFound", location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
finish();
}
public void finish() {
if(isComplete()) {
region.getSignsFeature().addSign(location, type, facing, profile);
if(profile == null) {
plugin.message(linker, "addsign-success", region);
} else {
plugin.message(linker, "addsign-successProfile", region, profile);
}
region.update();
reset();
plugin.message(linker, "linksigns-next");
}
}
public void reset() {
hasSign = false;
hasRegion = false;
}
public boolean isComplete() {
return hasSign && hasRegion;
}
}
}
@@ -0,0 +1,595 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.util.Calendar;
import java.util.UUID;
public class BuyRegion extends GeneralRegion {
public BuyRegion(YamlConfiguration config) {
super(config);
}
public BuyRegion(String name, World world) {
super(name, world);
}
@Override
public RegionType getType() {
return RegionType.BUY;
}
@Override
public RegionState getState() {
if(isSold() && isInResellingMode()) {
return RegionState.RESELL;
} else if(isSold() && !isInResellingMode()) {
return RegionState.SOLD;
} else {
return RegionState.FORSALE;
}
}
@Override
public boolean isAvailable() {
return !isSold();
}
/**
* Get the UUID of the owner of this region.
* @return The UUID of the owner of this region
*/
public UUID getBuyer() {
String buyer = config.getString("buy.buyer");
if(buyer != null) {
try {
return UUID.fromString(buyer);
} catch(IllegalArgumentException e) {
// Incorrect UUID
}
}
return null;
}
/**
* Check if a player is the buyer of this region.
* @param player Player to check
* @return true if this player owns this region, otherwise false
*/
public boolean isBuyer(OfflinePlayer player) {
return player != null && isBuyer(player.getUniqueId());
}
public boolean isBuyer(UUID player) {
UUID buyer = getBuyer();
return !(buyer == null || player == null) && buyer.equals(player);
}
/**
* Set the buyer of this region.
* @param buyer The UUID of the player that should be set as buyer
*/
public void setBuyer(UUID buyer) {
if(buyer == null) {
setSetting("buy.buyer", null);
setSetting("buy.buyerName", null);
} else {
setSetting("buy.buyer", buyer.toString());
setSetting("buy.buyerName", Utils.toName(buyer));
}
}
/**
* Get the name of the player that owns this region.
* @return The name of the player that owns this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return &lt;UNKNOWN&gt;
*/
public String getPlayerName() {
String result = Utils.toName(getBuyer());
if(result == null || result.isEmpty()) {
result = getStringSetting("buy.buyerName");
if(result == null || result.isEmpty()) {
result = "<UNKNOWN>";
}
}
return result;
}
/**
* Check if the region is sold.
* @return true if the region is sold, otherwise false
*/
public boolean isSold() {
return getBuyer() != null;
}
/**
* Check if the region is being resold.
* @return true if the region is available for reselling, otherwise false
*/
public boolean isInResellingMode() {
return config.getBoolean("buy.resellMode");
}
/**
* Get the price of the region.
* @return The price of the region
*/
public double getPrice() {
return Math.max(0, Utils.evaluateToDouble(getStringSetting("buy.price"), this));
}
/**
* Get the resell price of this region.
* @return The resell price if isInResellingMode(), otherwise 0.0
*/
public double getResellPrice() {
return Math.max(0, config.getDouble("buy.resellPrice"));
}
/**
* Get the formatted string of the price (includes prefix and suffix).
* @return The formatted string of the price
*/
public String getFormattedPrice() {
return Utils.formatCurrency(getPrice());
}
/**
* Get the formatted string of the resellprice (includes prefix and suffix).
* @return The formatted string of the resellprice
*/
public String getFormattedResellPrice() {
return Utils.formatCurrency(getResellPrice());
}
/**
* Change the price of the region.
* @param price The price to set this region to
*/
public void setPrice(Double price) {
setSetting("buy.price", price);
}
/**
* Set the region into resell mode with the given price.
* @param price The price this region should be put up for sale
*/
public void enableReselling(double price) {
setSetting("buy.resellMode", true);
setSetting("buy.resellPrice", price);
}
/**
* Stop this region from being in resell mode.
*/
public void disableReselling() {
setSetting("buy.resellMode", null);
setSetting("buy.resellPrice", null);
}
/**
* Get the moneyBack percentage.
* @return The % of money the player will get back when selling
*/
public double getMoneyBackPercentage() {
return Utils.evaluateToDouble(getStringSetting("buy.moneyBack"), this);
}
/**
* Get the amount of money that should be paid to the player when selling the region.
* @return The amount of money the player should get back
*/
public double getMoneyBackAmount() {
return getPrice() * (getMoneyBackPercentage() / 100.0);
}
/**
* Get the formatted string of the amount of the moneyBack amount.
* @return String with currency symbols and proper fractional part
*/
public String getFormattedMoneyBackAmount() {
return Utils.formatCurrency(getMoneyBackAmount());
}
@Override
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);
}
}
/**
* Minutes until automatic unrent when player is offline.
* @return The number of milliseconds until the region is unrented while player is offline
*/
public long getInactiveTimeUntilSell() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("buy.inactiveTimeUntilSell"));
}
/**
* Get a human readable string indicating how long the player can be offline until automatic unrent.
* @return String indicating the inactive time until unrent
*/
public String getFormattedInactiveTimeUntilSell() {
return Utils.millisToHumanFormat(getInactiveTimeUntilSell());
}
/**
* Buy a region.
* @param offlinePlayer The player that wants to buy the region
* @return true if it succeeded and false if not
*/
@SuppressWarnings("deprecation")
public boolean buy(OfflinePlayer offlinePlayer) {
// Check if the player has permission
if(plugin.hasPermission(offlinePlayer, "areashop.buy")) {
if(plugin.getEconomy() == null) {
message(offlinePlayer, "general-noEconomy");
return false;
}
if(isInResellingMode()) {
if(!plugin.hasPermission(offlinePlayer, "areashop.buyresell")) {
message(offlinePlayer, "buy-noPermissionResell");
return false;
}
} else {
if(!plugin.hasPermission(offlinePlayer, "areashop.buynormal")) {
message(offlinePlayer, "buy-noPermissionNoResell");
return false;
}
}
if(getWorld() == null) {
message(offlinePlayer, "general-noWorld");
return false;
}
if(getRegion() == null) {
message(offlinePlayer, "general-noRegion");
return false;
}
if(!isSold() || (isInResellingMode() && !isBuyer(offlinePlayer))) {
boolean isResell = isInResellingMode();
// Only relevant if the player is online
Player player = offlinePlayer.getPlayer();
if(player != null) {
// Check if the players needs to be in the region for buying
if(restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
message(offlinePlayer, "buy-restrictedToRegion");
return false;
}
// Check if the players needs to be in the world for buying
if(restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
message(offlinePlayer, "buy-restrictedToWorld", player.getWorld().getName());
return false;
}
}
// Check region limits
LimitResult limitResult = this.limitsAllow(RegionType.BUY, offlinePlayer);
AreaShop.debug("LimitResult: " + limitResult.toString());
if(!limitResult.actionAllowed()) {
if(limitResult.getLimitingFactor() == LimitType.TOTAL) {
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if(limitResult.getLimitingFactor() == LimitType.BUYS) {
message(offlinePlayer, "buy-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
// Should not be reached, but is safe like this
return false;
}
// Check if the player has enough money
if((!isResell && plugin.getEconomy().has(offlinePlayer, getWorldName(), getPrice())) || (isResell && plugin.getEconomy().has(offlinePlayer, getWorldName(), getResellPrice()))) {
UUID oldOwner = getBuyer();
if(isResell && oldOwner != null) {
// Broadcast and check event
ResellingRegionEvent event = new ResellingRegionEvent(this, offlinePlayer);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
getFriendsFeature().clearFriends();
double resellPrice = getResellPrice();
// Transfer the money to the previous owner
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getResellPrice());
if(!r.transactionSuccess()) {
message(offlinePlayer, "buy-payError");
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while buying " + getName() + ": " + r.errorMessage);
return false;
}
r = null;
OfflinePlayer oldOwnerPlayer = Bukkit.getOfflinePlayer(oldOwner);
String oldOwnerName = getPlayerName();
if(oldOwnerPlayer != null && oldOwnerPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(oldOwnerPlayer, getWorldName(), getResellPrice());
oldOwnerName = oldOwnerPlayer.getName();
} else if(oldOwnerName != null) {
r = plugin.getEconomy().depositPlayer(oldOwnerName, getWorldName(), getResellPrice());
}
if(r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + oldOwnerName + "' " + getFormattedPrice() + " for his resell of region " + getName() + " to " + offlinePlayer.getName());
}
// Resell is done, disable that now
disableReselling();
// Run commands
this.runEventCommands(RegionEvent.RESELL, true);
// Set the owner
setBuyer(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Update everything
handleSchematicEvent(RegionEvent.RESELL);
// Notify about updates
this.notifyAndUpdate(new ResoldRegionEvent(this, oldOwner));
// Send message to the player
message(offlinePlayer, "buy-successResale", oldOwnerName);
Player seller = Bukkit.getPlayer(oldOwner);
if(seller != null) {
message(seller, "buy-successSeller", resellPrice);
}
// Run commands
this.runEventCommands(RegionEvent.RESELL, false);
} else {
// Broadcast and check event
BuyingRegionEvent event = new BuyingRegionEvent(this, offlinePlayer);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
// Substract the money from the players balance
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getPrice());
if(!r.transactionSuccess()) {
message(offlinePlayer, "buy-payError");
return false;
}
// Optionally give money to the landlord
OfflinePlayer landlordPlayer = null;
if(getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
if(landlordName != null) {
if(landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), getPrice());
} else {
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), getPrice());
}
if(r != null && !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + getFormattedPrice() + " for his sell of region " + getName() + " to " + offlinePlayer.getName());
}
}
// Run commands
this.runEventCommands(RegionEvent.BOUGHT, true);
// Set the owner
setBuyer(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Notify about updates
this.notifyAndUpdate(new BoughtRegionEvent(this));
// Update everything
handleSchematicEvent(RegionEvent.BOUGHT);
// Send message to the player
message(offlinePlayer, "buy-succes");
// Run commands
this.runEventCommands(RegionEvent.BOUGHT, false);
}
return true;
} else {
// Player has not enough money
if(isResell) {
message(offlinePlayer, "buy-lowMoneyResell", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
} else {
message(offlinePlayer, "buy-lowMoney", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
}
}
} else {
if(isBuyer(offlinePlayer)) {
message(offlinePlayer, "buy-yours");
} else {
message(offlinePlayer, "buy-someoneElse");
}
}
} else {
message(offlinePlayer, "buy-noPermission");
}
return false;
}
/**
* Sell a buyed region, get part of the money back.
* @param giveMoneyBack true if the player should be given money back, otherwise false
* @param executor CommandSender to receive a message when the sell fails, or null
* @return true if the region has been sold, otherwise false
*/
@SuppressWarnings("deprecation")
public boolean sell(boolean giveMoneyBack, CommandSender executor) {
boolean own = executor instanceof Player && this.isBuyer((Player)executor);
if(executor != null) {
if(!executor.hasPermission("areashop.sell") && !own) {
message(executor, "sell-noPermissionOther");
return false;
}
if(!executor.hasPermission("areashop.sell") && !executor.hasPermission("areashop.sellown") && own) {
message(executor, "sell-noPermission");
return false;
}
if(!executor.hasPermission("areashop.sell")
&& executor.hasPermission("areashop.sellown")
&& own
&& getBooleanSetting("buy.sellDisabled")) {
message(executor, "sell-disabled");
return false;
}
}
if(plugin.getEconomy() == null) {
return false;
}
// Broadcast and check event
SellingRegionEvent event = new SellingRegionEvent(this);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
message(executor, "general-cancelled", event.getReason());
return false;
}
// Run commands
this.runEventCommands(RegionEvent.SOLD, true);
disableReselling();
// Give part of the buying price back
double moneyBack = getMoneyBackAmount();
if(moneyBack > 0 && giveMoneyBack) {
boolean noPayBack = false;
OfflinePlayer landlordPlayer = null;
if(getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
EconomyResponse r;
if(landlordName != null) {
if(landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
} else {
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
}
if(r == null || !r.transactionSuccess()) {
noPayBack = true;
}
}
// Give back the money
OfflinePlayer player = Bukkit.getOfflinePlayer(getBuyer());
if(player != null && !noPayBack) {
EconomyResponse response = null;
boolean error = false;
try {
if(player.getName() != null) {
response = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
} else if(getPlayerName() != null) {
response = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
}
} catch(Exception e) {
error = true;
}
if(error || response == null || !response.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying back money to " + getPlayerName() + " while selling region " + getName());
}
}
}
message(executor, "sell-sold");
// Handle schematic save/restore (while %uuid% is still available)
handleSchematicEvent(RegionEvent.SOLD);
// Remove friends and the owner
getFriendsFeature().clearFriends();
UUID oldBuyer = getBuyer();
setBuyer(null);
removeLastActiveTime();
// Notify about updates
this.notifyAndUpdate(new SoldRegionEvent(this, oldBuyer, Math.max(moneyBack, 0)));
// Run commands
this.runEventCommands(RegionEvent.SOLD, false);
return true;
}
@Override
public boolean checkInactive() {
if(isDeleted() || !isSold()) {
return false;
}
long inactiveSetting = getInactiveTimeUntilSell();
OfflinePlayer player = Bukkit.getOfflinePlayer(getBuyer());
if(inactiveSetting <= 0 || player.isOp()) {
return false;
}
long lastPlayed = getLastActiveTime();
//AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis()-player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
if(Calendar.getInstance().getTimeInMillis() > (lastPlayed + inactiveSetting)) {
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
return this.sell(true, null);
}
return false;
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,7 @@
# Regions
This package contains the `GeneralRegion` class which represents a region in AreaShop. Such a region is linked to a WorldGuard region and has its own configuration file at `/plugins/AreaShop/regions/<name>.yml`.
The `BuyRegion` and `RentRegion` classes represent buy and rental regions (mutually exclusive) and inherit from `GeneralRegion`.
To group regions there is `RegionGroup`, which allows configuring settings for a lot of regions at once.
@@ -0,0 +1,225 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
// TODO consider switching to saving lowercase regions
public class RegionGroup {
private final AreaShop plugin;
private final String name;
private final Set<String> regions;
private Set<String> autoRegions;
private boolean autoDirty;
private final Set<String> worlds;
/**
* Constructor, used when creating new groups or restoring them from groups.yml at server boot.
* @param plugin The AreaShop plugin
* @param name Name of the group, has to be unique
*/
public RegionGroup(AreaShop plugin, String name) {
this.plugin = plugin;
this.name = name;
this.autoDirty = true;
setSetting("name", name);
// Load regions and worlds
regions = new HashSet<>(getSettings().getStringList("regions"));
worlds = new HashSet<>(getSettings().getStringList("worlds"));
}
/**
* Get automatically added regions.
* @return Set of regions automatically added by the configuration
*/
public Set<String> getAutoRegions() {
if(autoDirty) {
autoRegions = new HashSet<>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(worlds.contains(region.getWorldName())) {
autoRegions.add(region.getName());
}
}
autoDirty = false;
}
return autoRegions;
}
/**
* Mark that automatically added regions should be regenerated.
*/
public void autoDirty() {
autoDirty = true;
}
/**
* Adds a world from which all regions should be added to the group.
* @param world World from which all regions should be added
* @return true if the region was not already added, otherwise false
*/
public boolean addWorld(String world) {
if(worlds.add(world)) {
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
saveRequired();
autoDirty();
return true;
}
return false;
}
/**
* Remove a member from the group.
* @param world World to remove
* @return true if the region was in the group before, otherwise false
*/
public boolean removeWorld(String world) {
if(worlds.remove(world)) {
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
saveRequired();
autoDirty();
return true;
}
return false;
}
/**
* Get all worlds from which regions are added automatically.
* @return A list with the names of all worlds (immutable)
*/
public Set<String> getWorlds() {
return new HashSet<>(worlds);
}
/**
* Adds a member to a group.
* @param region The region to add to the group (GeneralRegion or a subclass of it)
* @return true if the region was not already added, otherwise false
*/
public boolean addMember(GeneralRegion region) {
if(regions.add(region.getName())) {
setSetting("regions", new ArrayList<>(regions));
saveRequired();
return true;
}
return false;
}
/**
* Remove a member from the group.
* @param region The region to remove
* @return true if the region was in the group before, otherwise false
*/
public boolean removeMember(GeneralRegion region) {
if(regions.remove(region.getName())) {
setSetting("regions", new ArrayList<>(regions));
saveRequired();
return true;
}
return false;
}
/**
* Get all members of the group.
* @return A list with the names of all members of the group (immutable)
*/
public Set<String> getMembers() {
HashSet<String> result = new HashSet<>(regions);
result.addAll(getAutoRegions());
return result;
}
/**
* Get all manually added members of the group.
* @return A list with the names of all members of the group (immutable)
*/
public Set<String> getManualMembers() {
return new HashSet<>(regions);
}
/**
* Get all members of the group as GeneralRegions.
* @return A Set with all group members
*/
public Set<GeneralRegion> getMemberRegions() {
Set<GeneralRegion> result = new HashSet<>();
for(String name : getMembers()) {
result.add(plugin.getFileManager().getRegion(name));
}
return result;
}
/**
* Get the name of the group.
* @return The name of the group
*/
public String getName() {
return name;
}
/**
* Get the lowercase name of the group (used for getting the config etc).
* @return The name of the group in lowercase
*/
public String getLowerCaseName() {
return getName().toLowerCase();
}
/**
* Check if a region is member of the group.
* @param region Region to check
* @return true if the region is in the group, otherwise false
*/
public boolean isMember(GeneralRegion region) {
return getMembers().contains(region.getName());
}
/**
* Get the priority of the group (higher overwrites).
* @return The priority of the group
*/
public int getPriority() {
return getSettings().getInt("priority");
}
/**
* Get the configurationsection with the settings of this group.
* @return The ConfigurationSection with the settings of the group
*/
public ConfigurationSection getSettings() {
ConfigurationSection result = plugin.getFileManager().getGroupSettings(name);
if(result != null) {
return result;
} else {
return new YamlConfiguration();
}
}
/**
* Set a setting of this group.
* @param path The path to set
* @param setting The value to set
*/
public void setSetting(String path, Object setting) {
plugin.getFileManager().setGroupSetting(this, path, setting);
}
/**
* Indicates this file needs to be saved, will actually get saved later by a task.
*/
public void saveRequired() {
plugin.getFileManager().saveGroupsIsRequired();
}
/**
* Save the groups to disk now, normally saveRequired() is preferred because of performance.
*/
public void saveNow() {
plugin.getFileManager().saveGroupsNow();
}
}
@@ -0,0 +1,762 @@
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
import me.wiefferink.areashop.tools.Utils;
import net.milkbowl.vault.economy.EconomyResponse;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.UUID;
import static me.wiefferink.areashop.tools.Utils.millisToHumanFormat;
public class RentRegion extends GeneralRegion {
private long warningsDoneUntil = Calendar.getInstance().getTimeInMillis();
/**
* Constructor.
* @param config All settings of this region
*/
public RentRegion(YamlConfiguration config) {
super(config);
}
/**
* Create a new RentRegion.
* @param name The name of the region (correct casing)
* @param world The world of the WorldGuard region
*/
public RentRegion(String name, World world) {
super(name, world);
}
@Override
public RegionType getType() {
return RegionType.RENT;
}
@Override
public RegionState getState() {
if(isRented()) {
return RegionState.RENTED;
} else {
return RegionState.FORRENT;
}
}
@Override
public boolean isAvailable() {
return !isRented();
}
/**
* Get the UUID of the player renting the region.
* @return The UUID of the renter
*/
public UUID getRenter() {
String renter = config.getString("rent.renter");
if(renter != null) {
try {
return UUID.fromString(renter);
} catch(IllegalArgumentException e) {
// Incorrect UUID
}
}
return null;
}
/**
* Check if a player is the renter of this region.
* @param player Player to check
* @return true if this player rents this region, otherwise false
*/
public boolean isRenter(Player player) {
return player != null && isRenter(player.getUniqueId());
}
public boolean isRenter(UUID player) {
UUID renter = getRenter();
return !(player == null || renter == null) && renter.equals(player);
}
/**
* Set the renter of this region.
* @param renter The UUID of the player that should be set as the renter
*/
public void setRenter(UUID renter) {
if(renter == null) {
setSetting("rent.renter", null);
setSetting("rent.renterName", null);
} else {
setSetting("rent.renter", renter.toString());
setSetting("rent.renterName", Utils.toName(renter));
}
}
/**
* Get the max number of extends of this region.
* @return -1 if infinite otherwise the maximum number
*/
public int getMaxExtends() {
return getIntegerSetting("rent.maxExtends");
}
/**
* Get how many times the rent has already been extended.
* @return The number of times extended
*/
public int getTimesExtended() {
return config.getInt("rent.timesExtended");
}
/**
* Set the number of times the region has been extended.
* @param times The number of times the region has been extended
*/
public void setTimesExtended(int times) {
if(times < 0) {
setSetting("rent.timesExtended", null);
} else {
setSetting("rent.timesExtended", times);
}
}
@Override
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.tagTimesExtended:
return this.getTimesExtended();
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);
}
}
/**
* Check if the region is rented.
* @return true if the region is rented, otherwise false
*/
public boolean isRented() {
return getRenter() != null;
}
/**
* Get the name of the player renting this region.
* @return Name of the player renting this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return &lt;UNKNOWN&gt;
*/
public String getPlayerName() {
String result = Utils.toName(getRenter());
if(result == null || result.isEmpty()) {
result = config.getString("rent.renterName");
if(result == null || result.isEmpty()) {
result = "<UNKNOWN>";
}
}
return result;
}
/**
* Get the time until this region is rented (time from 1970 epoch).
* @return The epoch time until which this region is rented
*/
public long getRentedUntil() {
return getLongSetting("rent.rentedUntil");
}
/**
* Set the time until the region is rented (milliseconds from 1970, system time).
* @param rentedUntil The time until the region is rented
*/
public void setRentedUntil(Long rentedUntil) {
if(rentedUntil == null) {
setSetting("rent.rentedUntil", null);
} else {
setSetting("rent.rentedUntil", rentedUntil);
}
}
/**
* Get the price of the region.
* @return The price of the region
*/
public double getPrice() {
return Math.max(0, Utils.evaluateToDouble(getStringSetting("rent.price"), this));
}
/**
* Get the formatted string of the price (includes prefix and suffix).
* @return The formatted string of the price
*/
public String getFormattedPrice() {
return Utils.formatCurrency(getPrice());
}
/**
* Get the duration of 1 rent period.
* @return The duration in milliseconds of 1 rent period
*/
public long getDuration() {
return Utils.durationStringToLong(getDurationString());
}
/**
* Get the duration string, includes 'number indentifier'.
* @return The duration string
*/
public String getDurationString() {
return getStringSetting("rent.duration");
}
/**
* Get the time that is left on the region.
* @return The time left on the region
*/
public long getTimeLeft() {
if(isRented()) {
return this.getRentedUntil() - Calendar.getInstance().getTimeInMillis();
} else {
return 0;
}
}
/**
* Get a formatted string indicating the rent time that is left.
* @return Time left on the rent, for example '29 days', '3 months', '1 second'
*/
public String getTimeLeftString() {
return Utils.millisToHumanFormat(getTimeLeft());
}
/**
* Minutes until automatic unrent when player is offline.
* @return The number of milliseconds until the region is unrented while player is offline
*/
public long getInactiveTimeUntilUnrent() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.inactiveTimeUntilUnrent"));
}
/**
* Get a human readable string indicating how long the player can be offline until automatic unrent.
* @return String indicating the inactive time until unrent
*/
public String getFormattedInactiveTimeUntilUnrent() {
return Utils.millisToHumanFormat(getInactiveTimeUntilUnrent());
}
/**
* Change the price of the region.
* @param price The price of the region
*/
public void setPrice(Double price) {
setSetting("rent.price", price);
}
/**
* Set the duration of the rent.
* @param duration The duration of the rent (as specified on the documentation pages)
*/
public void setDuration(String duration) {
setSetting("rent.duration", duration);
}
/**
* Get the moneyBack percentage.
* @return The % of money the player will get back when unrenting
*/
public double getMoneyBackPercentage() {
return Utils.evaluateToDouble(getStringSetting("rent.moneyBack"), this);
}
/**
* Get the amount of money that should be paid to the player when unrenting the region.
* @return The amount of money the player should get back
*/
public double getMoneyBackAmount() {
Long currentTime = Calendar.getInstance().getTimeInMillis();
Double timeLeft = (double)((getRentedUntil() - currentTime));
double percentage = (getMoneyBackPercentage()) / 100.0;
Double timePeriod = (double)(getDuration());
double periods = timeLeft / timePeriod;
return Math.max(0, periods * getPrice() * percentage);
}
/**
* Get the formatted string of the amount of the moneyBack amount.
* @return String with currency symbols and proper fractional part
*/
public String getFormattedMoneyBackAmount() {
return Utils.formatCurrency(getMoneyBackAmount());
}
/**
* Get the maximum time the player can rent the region in advance (milliseconds).
* @return The maximum rent time in milliseconds
*/
public long getMaxRentTime() {
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.maxRentTime"));
}
/**
* Check if the rent should expire.
* @return true if the rent has expired and has been unrented, false otherwise
*/
public boolean checkExpiration() {
long now = Calendar.getInstance().getTimeInMillis();
if(!isDeleted() && isRented() && now > getRentedUntil()) {
// Extend rent if configured for that
if(getBooleanSetting("rent.autoExtend")) {
if(extend()) {
return false;
}
}
// Send message to the player if online
Player player = Bukkit.getPlayer(getRenter());
if(unRent(false, null)) {
if(player != null) {
message(player, "unrent-expired");
}
return true;
}
}
return false;
}
/**
* Send the expiration warnings from the selected profile which is specified in the config.
* 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
if(isDeleted() || !isRented()) {
return;
}
ConfigurationSection profileSection = getConfigurationSectionSetting("rent.expirationWarningProfile", "expirationWarningProfiles");
if(profileSection == null) {
return;
}
// 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;
}
long checkTime = getRentedUntil() - timeBeforeParsed;
if(checkTime > warningsDoneUntil && checkTime <= sendUntil) {
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");
}
} else {
commands = profileSection.getStringList(timeBefore);
}
this.runCommands(Bukkit.getConsoleSender(), commands);
}
}
warningsDoneUntil = sendUntil;
}
/**
* Try to extend the rent for the current owner, respecting all restrictions.
* @return true if successful, otherwise false
*/
public boolean extend() {
if(!isRented()) {
return false;
}
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(getRenter());
return offlinePlayer != null && rent(offlinePlayer);
}
/**
* Rent a region.
* @param offlinePlayer The player that wants to rent the region
* @return true if it succeeded and false if not
*/
public boolean rent(OfflinePlayer offlinePlayer) {
if(plugin.getEconomy() == null) {
message(offlinePlayer, "general-noEconomy");
return false;
}
//Check if the player has permission
if(plugin.hasPermission(offlinePlayer, "areashop.rent")) {
if(getWorld() == null) {
message(offlinePlayer, "general-noWorld");
return false;
}
if(getRegion() == null) {
message(offlinePlayer, "general-noRegion");
return false;
}
boolean extend = false;
if(getRenter() != null && offlinePlayer.getUniqueId().equals(getRenter())) {
extend = true;
}
// Check if the region is available for renting or if the player wants to extend the rent
if(!isRented() || extend) {
// These checks are only relevant for online players doing the renting/buying themselves
Player player = offlinePlayer.getPlayer();
if(player != null) {
// Check if the players needs to be in the region for renting
if(restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
message(offlinePlayer, "rent-restrictedToRegion");
return false;
}
// Check if the players needs to be in the world for renting
if(restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
message(offlinePlayer, "rent-restrictedToWorld", player.getWorld().getName());
return false;
}
}
// Check region limits if this is not extending
if(!(extend && config.getBoolean("allowRegionExtendsWhenAboveLimits"))) {
LimitResult limitResult;
if(extend) {
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer, true);
} else {
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer);
}
AreaShop.debug("LimitResult: " + limitResult.toString());
if(!limitResult.actionAllowed()) {
if(limitResult.getLimitingFactor() == LimitType.TOTAL) {
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if(limitResult.getLimitingFactor() == LimitType.RENTS) {
message(offlinePlayer, "rent-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
return false;
}
if(limitResult.getLimitingFactor() == LimitType.EXTEND) {
message(offlinePlayer, "rent-maximumExtend", limitResult.getMaximum(), limitResult.getCurrent() + 1, limitResult.getLimitingGroup());
return false;
}
return false;
}
}
// Check if the player can still extend this rent
if(extend && !plugin.hasPermission(offlinePlayer, "areashop.rentextendbypass")) {
if(getMaxExtends() >= 0 && getTimesExtended() >= getMaxExtends()) {
message(offlinePlayer, "rent-maxExtends");
return false;
}
}
// Check if there is enough time left before hitting maxRentTime
boolean extendToMax = false;
double price = getPrice();
long timeNow = Calendar.getInstance().getTimeInMillis();
long timeRented = 0;
long maxRentTime = getMaxRentTime();
if(isRented()) {
timeRented = getRentedUntil() - timeNow;
}
if((timeRented + getDuration()) > (maxRentTime)
&& !plugin.hasPermission(offlinePlayer, "areashop.renttimebypass")
&& maxRentTime != -1) {
// Extend to the maximum instead of adding a full period
if(getBooleanSetting("rent.extendToFullWhenAboveMaxRentTime")) {
if(timeRented >= maxRentTime) {
message(offlinePlayer, "rent-alreadyAtFull");
return false;
} else {
long toRentPart = maxRentTime - timeRented;
extendToMax = true;
price = ((double)toRentPart) / getDuration() * price;
}
} else {
message(offlinePlayer, "rent-maxRentTime");
return false;
}
}
if(plugin.getEconomy().has(offlinePlayer, getWorldName(), price)) {
// Broadcast and check event
RentingRegionEvent event = new RentingRegionEvent(this, offlinePlayer, extend);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
message(offlinePlayer, "general-cancelled", event.getReason());
return false;
}
// Substract the money from the players balance
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), price);
if(!r.transactionSuccess()) {
message(offlinePlayer, "rent-payError");
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while renting " + getName() + ": " + r.errorMessage);
return false;
}
// Optionally give money to the landlord
OfflinePlayer landlordPlayer = null;
if(getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
if(landlordName != null) {
if(landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), price);
} else {
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), price);
}
if(r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + Utils.formatCurrency(price) + " for his rent of region " + getName() + " to " + offlinePlayer.getName());
}
}
if(!extend) {
// Run commands
runEventCommands(RegionEvent.RENTED, true);
} else {
// Run commands
runEventCommands(RegionEvent.EXTENDED, true);
}
// Get the time until the region will be rented
Calendar calendar = Calendar.getInstance();
if(extendToMax) {
calendar.setTimeInMillis(calendar.getTimeInMillis() + getMaxRentTime());
} else if(extend) {
calendar.setTimeInMillis(getRentedUntil() + getDuration());
} else {
calendar.setTimeInMillis(calendar.getTimeInMillis() + getDuration());
}
// Add values to the rent and send it to FileManager
setRentedUntil(calendar.getTimeInMillis());
setRenter(offlinePlayer.getUniqueId());
updateLastActiveTime();
// Fire schematic event and updated times extended
if(!extend) {
this.handleSchematicEvent(RegionEvent.RENTED);
setTimesExtended(0);
} else {
setTimesExtended(getTimesExtended() + 1);
}
// Notify about updates
this.notifyAndUpdate(new RentedRegionEvent(this, extend));
// Send message to the player
if(extendToMax) {
message(offlinePlayer, "rent-extendedToMax");
} else if(extend) {
message(offlinePlayer, "rent-extended");
} else {
message(offlinePlayer, "rent-rented");
}
if(!extend) {
// Run commands
this.runEventCommands(RegionEvent.RENTED, false);
} else {
// Run commands
this.runEventCommands(RegionEvent.EXTENDED, false);
}
return true;
} else {
// Player has not enough money
if(extend) {
message(offlinePlayer, "rent-lowMoneyExtend", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
} else {
message(offlinePlayer, "rent-lowMoneyRent", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
}
}
} else {
message(offlinePlayer, "rent-someoneElse");
}
} else {
message(offlinePlayer, "rent-noPermission");
}
return false;
}
/**
* Unrent a region, reset to unrented.
* @param giveMoneyBack true if money should be given back to the player, false otherwise
* @param executor The CommandSender that should get the cancelled message if there is any, or null
* @return true if unrenting succeeded, othwerwise false
*/
@SuppressWarnings("deprecation")
public boolean unRent(boolean giveMoneyBack, CommandSender executor) {
boolean own = executor instanceof Player && this.isRenter((Player) executor);
if(executor != null) {
if(!executor.hasPermission("areashop.unrent") && !own) {
message(executor, "unrent-noPermissionOther");
return false;
}
if(!executor.hasPermission("areashop.unrent") && !executor.hasPermission("areashop.unrentown") && own) {
message(executor, "unrent-noPermission");
return false;
}
}
if(plugin.getEconomy() == null) {
return false;
}
// Broadcast and check event
UnrentingRegionEvent event = new UnrentingRegionEvent(this);
Bukkit.getPluginManager().callEvent(event);
if(event.isCancelled()) {
message(executor, "general-cancelled", event.getReason());
return false;
}
// Run commands
this.runEventCommands(RegionEvent.UNRENTED, true);
double moneyBack = getMoneyBackAmount();
if(moneyBack > 0 && giveMoneyBack) {
boolean noPayBack = false;
OfflinePlayer landlordPlayer = null;
if(getLandlord() != null) {
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
}
String landlordName = getLandlordName();
EconomyResponse r;
if(landlordName != null) {
if(landlordPlayer != null && landlordPlayer.getName() != null) {
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
} else {
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
}
if(r == null || !r.transactionSuccess()) {
noPayBack = true;
}
}
// Give back the money
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
if(player != null && !noPayBack) {
r = null;
boolean error = false;
try {
if(player.getName() != null) {
r = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
} else if(getPlayerName() != null) {
r = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
}
} catch(Exception e) {
error = true;
}
if(error || r == null || !r.transactionSuccess()) {
AreaShop.warn("Something went wrong with paying back to " + getPlayerName() + " money while unrenting region " + getName());
}
}
}
// Send messages
message(executor, "unrent-unrented");
// Handle schematic save/restore (while %uuid% is still available)
handleSchematicEvent(RegionEvent.UNRENTED);
// Remove friends, the owner and renteduntil values
getFriendsFeature().clearFriends();
UUID oldRenter = getRenter();
setRenter(null);
setRentedUntil(null);
setTimesExtended(-1);
removeLastActiveTime();
// Notify about updates
this.notifyAndUpdate(new UnrentedRegionEvent(this, oldRenter, Math.max(0, moneyBack)));
// Run commands
this.runEventCommands(RegionEvent.UNRENTED, false);
return true;
}
@Override
public boolean checkInactive() {
if(isDeleted() || !isRented()) {
return false;
}
long inactiveSetting = getInactiveTimeUntilUnrent();
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
if(inactiveSetting <= 0 || player.isOp()) {
return false;
}
long lastPlayed = getLastActiveTime();
//AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis()-player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
if(Calendar.getInstance().getTimeInMillis() > (lastPlayed + inactiveSetting)) {
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
return this.unRent(true, null);
}
return false;
}
}
@@ -0,0 +1,147 @@
package me.wiefferink.areashop.tools;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bstats.Metrics;
import java.util.HashMap;
public class Analytics {
/**
* Start analytics tracking.
*/
public static void start() {
// Legacy MCstats statistics (remove at some point)
try {
new me.wiefferink.areashop.lib.Metrics(AreaShop.getInstance()).start();
AreaShop.debug("Started mcstats.org statistics service");
} catch(Exception e) {
AreaShop.debug("Could not start mcstats.org statistics service");
}
// bStats statistics
try {
Metrics metrics = new Metrics(AreaShop.getInstance());
// Number of regions
metrics.addCustomChart(new Metrics.SingleLineChart("region_count") {
@Override
public int getValue() {
return AreaShop.getInstance().getFileManager().getRegions().size();
}
});
// Number of rental regions
metrics.addCustomChart(new Metrics.SingleLineChart("rental_region_count") {
@Override
public int getValue() {
return AreaShop.getInstance().getFileManager().getRents().size();
}
});
// Number of buy regions
metrics.addCustomChart(new Metrics.SingleLineChart("buy_region_count") {
@Override
public int getValue() {
return AreaShop.getInstance().getFileManager().getBuys().size();
}
});
// Language
metrics.addCustomChart(new Metrics.SimplePie("language") {
@Override
public String getValue() {
return AreaShop.getInstance().getConfig().getString("language");
}
});
// Pie with region states
metrics.addCustomChart(new Metrics.AdvancedPie("region_state") {
@Override
public HashMap<String, Integer> getValues(HashMap<String, Integer> result) {
RegionStateStats stats = getStateStats();
result.put("For Rent", stats.forrent);
result.put("Rented", stats.rented);
result.put("For Sale", stats.forsale);
result.put("Sold", stats.sold);
result.put("Reselling", stats.reselling);
return result;
}
});
// Time series of each region state
metrics.addCustomChart(new Metrics.SingleLineChart("forrent_region_count") {
@Override
public int getValue() {
return getStateStats().forrent;
}
});
metrics.addCustomChart(new Metrics.SingleLineChart("rented_region_count") {
@Override
public int getValue() {
return getStateStats().rented;
}
});
metrics.addCustomChart(new Metrics.SingleLineChart("forsale_region_count") {
@Override
public int getValue() {
return getStateStats().forsale;
}
});
metrics.addCustomChart(new Metrics.SingleLineChart("sold_region_count") {
@Override
public int getValue() {
return getStateStats().sold;
}
});
metrics.addCustomChart(new Metrics.SingleLineChart("reselling_region_count") {
@Override
public int getValue() {
return getStateStats().reselling;
}
});
// TODO track rent/buy/unrent/sell/resell actions (so that it can be reported per collection interval)
AreaShop.debug("Started bstats.org statistics service");
} catch(Exception e) {
AreaShop.debug("Could not start bstats.org statistics service");
}
}
private static class RegionStateStats {
int forrent = 0;
int forsale = 0;
int rented = 0;
int sold = 0;
int reselling = 0;
}
private static RegionStateStats getStateStats() {
RegionStateStats result = new RegionStateStats();
for(GeneralRegion region : AreaShop.getInstance().getFileManager().getRegions()) {
if(region instanceof RentRegion) {
RentRegion rent = (RentRegion)region;
if(rent.isAvailable()) {
result.forrent++;
} else {
result.rented++;
}
} else if(region instanceof BuyRegion) {
BuyRegion buy = (BuyRegion)region;
if(buy.isAvailable()) {
result.forsale++;
} else if(buy.isInResellingMode()) {
result.reselling++;
} else {
result.sold++;
}
}
}
return result;
}
}
@@ -0,0 +1,251 @@
package me.wiefferink.areashop.tools;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Arrays;
import java.util.logging.Logger;
public class GithubUpdateCheck {
public static final String API_HOST = "https://api.github.com/repos";
public static final String API_LATEST_RELEASE = "releases/latest";
public static final String USER_AGENT = "GithubUpdateCheck by NLThijs48";
public static final boolean DEBUG = false;
private final String author;
private final String repository;
private final Plugin plugin;
private final Logger logger;
private URL url;
private VersionComparator versionComparator;
// Status
private boolean checking;
private boolean error;
private boolean hasUpdate;
private String latestVersion;
private final String currentVersion;
/**
* Create a new GithubUpdateCheck with the required information.
* @param plugin The plugin to create it for (used for logging and checking version)
* @param author The author of the plugin as used on Github
* @param repository The repository name of the plugin on Github
*/
public GithubUpdateCheck(Plugin plugin, String author, String repository) {
this.plugin = plugin;
this.logger = plugin.getLogger();
this.author = author;
this.repository = repository;
this.currentVersion = plugin.getDescription().getVersion();
this.versionComparator = (latestVersion, currentVersion) ->
!latestVersion.equalsIgnoreCase(currentVersion);
this.checking = false;
this.error = false;
this.hasUpdate = false;
}
/**
* Change the version comparator.
* @param versionComparator VersionComparator to use for checking if one version is newer than the other
* @return this
*/
public GithubUpdateCheck withVersionComparator(VersionComparator versionComparator) {
this.versionComparator = versionComparator;
return this;
}
/**
* Check if an update is available.
*/
public void checkUpdate() {
checkUpdate(null);
}
/**
* Check if an update is available.
* @param callback Callback to execute when the update check is done
* @return GithubUpdateCheck containing the status of the check
*/
public GithubUpdateCheck checkUpdate(UpdateCallback callback) {
checking = true;
final GithubUpdateCheck self = this;
// Check for update on asyn thread
new BukkitRunnable() {
@Override
public void run() {
try {
try {
String rawUrl = API_HOST + "/" + author + "/" + repository + "/" + API_LATEST_RELEASE;
url = new URL(rawUrl);
} catch(MalformedURLException e) {
logger.severe("Invalid url: '" + url + "', are the author '" + author + "' and repository '" + repository + "' correct?");
error = true;
return;
}
try {
URLConnection conn = url.openConnection();
// Give up after 15 seconds
conn.setConnectTimeout(15000);
// Identify ourselves
conn.addRequestProperty("User-Agent", USER_AGENT);
// Make sure we access the correct api version
conn.addRequestProperty("Accept", "application/vnd.github.v3+json");
// We want to read the result
conn.setDoOutput(true);
// Open connection
try(BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String response = reader.readLine();
debug("Response:", response);
JSONObject latestRelease = (JSONObject)JSONValue.parse(response);
if(latestRelease.isEmpty()) {
logger.warning("Failed to get api response from " + url);
error = true;
return;
}
debug("json: " + latestRelease.toJSONString());
// Latest version
latestVersion = (String)latestRelease.get("tag_name");
debug("Tag name:", latestVersion);
// Current version
debug("Plugin version:", currentVersion);
// Compare version
hasUpdate = versionComparator.isNewer(latestVersion, currentVersion);
}
} catch(IOException e) {
logger.severe("Failed to get latest release:" + ExceptionUtils.getStackTrace(e));
error = true;
} catch(ClassCastException e) {
logger.info("Unexpected structure of the result, failed to parse it");
error = true;
}
} finally {
checking = false;
debug("result:", self);
if(callback != null) {
// Switch back to main thread and call the callback
new BukkitRunnable() {
@Override
public void run() {
callback.run(self);
}
}.runTask(plugin);
}
}
}
}.runTaskAsynchronously(plugin);
return this;
}
/**
* Check if an update check is running.
* @return true if an update check is running
*/
public boolean isChecking() {
return checking;
}
/**
* Check if the update check failed.
* @return true if the update check failed (an error message has been logged)
*/
public boolean hasFailed() {
return error;
}
/**
* Check if an update has been found.
* @return true if an update has been found
*/
public boolean hasUpdate() {
return hasUpdate;
}
/**
* Get the repository that this update checker is checking.
* @return Used repository
*/
public String getRepository() {
return repository;
}
/**
* Get the author that this update checker is checking.
* @return Used author
*/
public String getAuthor() {
return author;
}
/**
* Get the current version.
* @return Current version of the plugin
*/
public String getCurrentVersion() {
return currentVersion;
}
/**
* Get the latest version.
* @return Latest version of the plugin (if checking is complete)
*/
public String getLatestVersion() {
return latestVersion;
}
public interface VersionComparator {
/**
* Check if a version should be considered 'newer' than another.
* @param latestVersion Version that is available on Github
* @param currentVersion Version of the current plugin
* @return true if the latestVersion is newer than the localVersion, otherwise false
*/
boolean isNewer(String latestVersion, String currentVersion);
}
public interface UpdateCallback {
void run(GithubUpdateCheck result);
}
/**
* Print a debug message if DEBUG is enabled.
* @param message Message to print
*/
private void debug(Object... message) {
if(DEBUG) {
logger.info("[" + this.getClass().getSimpleName() + "] [DEBUG] " + StringUtils.join(message, " "));
}
}
@Override
public String toString() {
return "GithubUpdateCheck(" + StringUtils.join(Arrays.asList(
"author=" + author,
"repository=" + repository,
"plugin=" + plugin.getName(),
"checking=" + checking,
"hasUpdate=" + hasUpdate,
"error=" + error,
"currentVersion=" + currentVersion,
"latestVersion=" + latestVersion
), ", ") + ")";
}
}
@@ -0,0 +1,848 @@
package me.wiefferink.areashop.tools;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.interfaces.WorldEditSelection;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import me.wiefferink.interactivemessenger.Log;
import me.wiefferink.interactivemessenger.processing.Message;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Location;
import org.bukkit.Server;
import org.bukkit.World;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.Configuration;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class Utils {
// Not used
private Utils() {
}
private static YamlConfiguration config;
private static Set<String> identifiers;
private static Set<String> seconds;
private static Set<String> minutes;
private static Set<String> hours;
private static Set<String> days;
private static Set<String> weeks;
private static Set<String> months;
private static Set<String> years;
private static ScriptEngine scriptEngine;
private static Map<Double, String> suffixes;
/**
* Initialize the utilities class with constants.
* @param pluginConfig The config of the plugin
*/
public static void initialize(YamlConfiguration pluginConfig) {
config = pluginConfig;
// Setup individual identifiers
seconds = getSetAndDefaults("seconds");
minutes = getSetAndDefaults("minutes");
hours = getSetAndDefaults("hours");
days = getSetAndDefaults("days");
weeks = getSetAndDefaults("weeks");
months = getSetAndDefaults("months");
years = getSetAndDefaults("years");
// Setup all time identifiers
identifiers = new HashSet<>();
identifiers.addAll(seconds);
identifiers.addAll(minutes);
identifiers.addAll(hours);
identifiers.addAll(days);
identifiers.addAll(weeks);
identifiers.addAll(months);
identifiers.addAll(years);
suffixes = new HashMap<>();
// This stuff should not be necessary, but it is, getConfigurationSection() does not do proper fallback to defaults!
// TODO: Create a custom configuration that fixes this behavior
ConfigurationSection suffixesSection = null;
if(config.isSet("metricSymbols")) {
suffixesSection = config.getConfigurationSection("metricSymbols");
} else {
Configuration defaults = config.getDefaults();
if(defaults != null) {
suffixesSection = defaults.getConfigurationSection("metricSymbols");
}
}
if(suffixesSection != null) {
for(String key : suffixesSection.getKeys(false)) {
try {
suffixes.put(Double.parseDouble(key), suffixesSection.getString(key));
} catch(NumberFormatException e) {
Log.warn("Key '" + key + "' in the metricSymbols section of config.yml is not a number!");
}
}
}
}
/**
* Get a string list from the config, combined with the entries specified in the default config.
* @param path The path to read the lists from
* @return List with all values defined in the config and the default config combined
*/
private static Set<String> getSetAndDefaults(String path) {
Set<String> result = new HashSet<>(config.getStringList(path));
ConfigurationSection defaults = config.getDefaults();
if(defaults != null) {
result.addAll(defaults.getStringList(path));
}
return result;
}
/**
* Create a message with a list of parts.
* @param replacements The parts to use
* @param messagePart The message to use for the parts
* @return A Message object containing the parts combined into one message
*/
public static Message combinedMessage(Collection<?> replacements, String messagePart) {
return combinedMessage(replacements, messagePart, ", ");
}
/**
* Create a message with a list of parts.
* @param replacements The parts to use
* @param messagePart The message to use for the parts
* @param combiner The string to use as combiner
* @return A Message object containing the parts combined into one message
*/
public static Message combinedMessage(Collection<?> replacements, String messagePart, String combiner) {
Message result = Message.empty();
boolean first = true;
for(Object part : replacements) {
if(first) {
first = false;
} else {
result.append(combiner);
}
result.append(Message.fromKey(messagePart).replacements(part));
}
return result;
}
/**
* Gets the online players.
* Provides backwards compatibility for 1.7- where it returns an array
* @return Online players
*/
@SuppressWarnings("unchecked")
public static Collection<? extends Player> getOnlinePlayers() {
try {
Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers");
if(onlinePlayerMethod.getReturnType().equals(Collection.class)) {
return ((Collection<? extends Player>)onlinePlayerMethod.invoke(Bukkit.getServer()));
} else {
return Arrays.asList((Player[])onlinePlayerMethod.invoke(Bukkit.getServer()));
}
} catch(Exception ex) {
AreaShop.debug("getOnlinePlayers error: " + ex.getMessage());
}
return new HashSet<>();
}
/**
* Create a map from a location, to save it in the config.
* @param location The location to transform
* @param setPitchYaw true to save the pitch and yaw, otherwise false
* @return The map with the location values
*/
public static ConfigurationSection locationToConfig(Location location, boolean setPitchYaw) {
if(location == null) {
return null;
}
ConfigurationSection result = new YamlConfiguration();
result.set("world", location.getWorld().getName());
result.set("x", location.getX());
result.set("y", location.getY());
result.set("z", location.getZ());
if(setPitchYaw) {
result.set("yaw", Float.toString(location.getYaw()));
result.set("pitch", Float.toString(location.getPitch()));
}
return result;
}
/**
* Create a map from a location, to save it in the config (without pitch and yaw).
* @param location The location to transform
* @return The map with the location values
*/
public static ConfigurationSection locationToConfig(Location location) {
return locationToConfig(location, false);
}
/**
* Create a location from a map, reconstruction from the config values.
* @param config The config section to reconstruct from
* @return The location
*/
public static Location configToLocation(ConfigurationSection config) {
if(config == null
|| !config.isString("world")
|| !config.isDouble("x")
|| !config.isDouble("y")
|| !config.isDouble("z")
|| Bukkit.getWorld(config.getString("world")) == null) {
return null;
}
Location result = new Location(
Bukkit.getWorld(config.getString("world")),
config.getDouble("x"),
config.getDouble("y"),
config.getDouble("z"));
if(config.isString("yaw") && config.isString("pitch")) {
result.setPitch(Float.parseFloat(config.getString("pitch")));
result.setYaw(Float.parseFloat(config.getString("yaw")));
}
return result;
}
/**
* Create a comma-separated list.
* @param input Collection of object which should be concatenated with comma's in between (skipping null values)
* @return Innput object concatenated with comma's in between
*/
public static String createCommaSeparatedList(Collection<?> input) {
StringBuilder result = new StringBuilder();
boolean first = true;
for(Object object : input) {
if(object != null) {
if(first) {
first = false;
result.append(object.toString());
} else {
result.append(", ").append(object.toString());
}
}
}
return result.toString();
}
/**
* Convert milliseconds to ticks.
* @param milliseconds Milliseconds to convert
* @return milliseconds divided by 50 (20 ticks per second)
*/
public static long millisToTicks(long milliseconds) {
return milliseconds / 50;
}
/**
* Convert milliseconds to a human readable format.
* @param milliseconds The amount of milliseconds to convert
* @return A formatted string based on the language file
*/
public static String millisToHumanFormat(long milliseconds) {
long timeLeft = milliseconds + 500;
// To seconds
timeLeft = timeLeft / 1000;
if(timeLeft <= 0) {
return Message.fromKey("timeleft-ended").getPlain();
} else if(timeLeft == 1) {
return Message.fromKey("timeleft-second").replacements(timeLeft).getPlain();
} else if(timeLeft <= 120) {
return Message.fromKey("timeleft-seconds").replacements(timeLeft).getPlain();
}
// To minutes
timeLeft = timeLeft / 60;
if(timeLeft <= 120) {
return Message.fromKey("timeleft-minutes").replacements(timeLeft).getPlain();
}
// To hours
timeLeft = timeLeft / 60;
if(timeLeft <= 48) {
return Message.fromKey("timeleft-hours").replacements(timeLeft).getPlain();
}
// To days
timeLeft = timeLeft / 24;
if(timeLeft <= 60) {
return Message.fromKey("timeleft-days").replacements(timeLeft).getPlain();
}
// To months
timeLeft = timeLeft / 30;
if(timeLeft <= 24) {
return Message.fromKey("timeleft-months").replacements(timeLeft).getPlain();
}
// To years
timeLeft = timeLeft / 12;
return Message.fromKey("timeleft-years").replacements(timeLeft).getPlain();
}
private static final BlockFace[] facings = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST};
/**
* Get the facing direction based on the yaw.
* @param yaw The horizontal angle that for example the player is looking
* @return The Block Face of the angle
*/
public static BlockFace yawToFacing(float yaw) {
return facings[Math.round(yaw / 45f) & 0x7];
}
// ======================================================================
// Methods to get WorldGuard or AreaShop regions by location or selection
// ======================================================================
/**
* Get all AreaShop regions intersecting with a WorldEdit selection.
* @param selection The selection to check
* @return A list with all the AreaShop regions intersecting with the selection
*/
public static List<GeneralRegion> getRegionsInSelection(WorldEditSelection selection) {
ArrayList<GeneralRegion> result = new ArrayList<>();
for(ProtectedRegion region : getWorldEditRegionsInSelection(selection)) {
GeneralRegion asRegion = AreaShop.getInstance().getFileManager().getRegion(region.getId());
if(asRegion != null) {
result.add(asRegion);
}
}
return result;
}
/**
* Get all AreaShop regions containing a location.
* @param location The location to check
* @return A list with all the AreaShop regions that contain the location
*/
public static List<GeneralRegion> getRegions(Location location) {
return getRegionsInSelection(new WorldEditSelection(location.getWorld(), location, location));
}
/**
* Get all WorldGuard regions intersecting with a WorldEdit selection.
* @param selection The selection to check
* @return A list with all the WorldGuard regions intersecting with the selection
*/
public static List<ProtectedRegion> getWorldEditRegionsInSelection(WorldEditSelection selection) {
// Get all regions inside or intersecting with the WorldEdit selection of the player
World world = selection.getWorld();
RegionManager regionManager = AreaShop.getInstance().getRegionManager(world);
ArrayList<ProtectedRegion> result = new ArrayList<>();
Location selectionMin = selection.getMinimumLocation();
Location selectionMax = selection.getMaximumLocation();
for(ProtectedRegion region : regionManager.getRegions().values()) {
BlockVector regionMin = region.getMinimumPoint();
BlockVector regionMax = region.getMaximumPoint();
if(
( // x part, resolves to true if the selection and region overlap anywhere on the x-axis
(regionMin.getBlockX() <= selectionMax.getBlockX() && regionMin.getBlockX() >= selectionMin.getBlockX())
|| (regionMax.getBlockX() <= selectionMax.getBlockX() && regionMax.getBlockX() >= selectionMin.getBlockX())
|| (selectionMin.getBlockX() >= regionMin.getBlockX() && selectionMin.getBlockX() <= regionMax.getBlockX())
|| (selectionMax.getBlockX() >= regionMin.getBlockX() && selectionMax.getBlockX() <= regionMax.getBlockX())
) && ( // Y part, resolves to true if the selection and region overlap anywhere on the y-axis
(regionMin.getBlockY() <= selectionMax.getBlockY() && regionMin.getBlockY() >= selectionMin.getBlockY())
|| (regionMax.getBlockY() <= selectionMax.getBlockY() && regionMax.getBlockY() >= selectionMin.getBlockY())
|| (selectionMin.getBlockY() >= regionMin.getBlockY() && selectionMin.getBlockY() <= regionMax.getBlockY())
|| (selectionMax.getBlockY() >= regionMin.getBlockY() && selectionMax.getBlockY() <= regionMax.getBlockY())
) && ( // Z part, resolves to true if the selection and region overlap anywhere on the z-axis
(regionMin.getBlockZ() <= selectionMax.getBlockZ() && regionMin.getBlockZ() >= selectionMin.getBlockZ())
|| (regionMax.getBlockZ() <= selectionMax.getBlockZ() && regionMax.getBlockZ() >= selectionMin.getBlockZ())
|| (selectionMin.getBlockZ() >= regionMin.getBlockZ() && selectionMin.getBlockZ() <= regionMax.getBlockZ())
|| (selectionMax.getBlockZ() >= regionMin.getBlockZ() && selectionMax.getBlockZ() <= regionMax.getBlockZ())
)
) {
result.add(region);
}
}
return result;
}
/**
* Get a list of regions around a location.
* - Returns highest priority, child instead of parent regions
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<ProtectedRegion> getImportantWorldEditRegions(Location location) {
List<ProtectedRegion> result = new ArrayList<>();
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
if(regions != null) {
boolean first = true;
for(ProtectedRegion pr : regions) {
if(first) {
result.add(pr);
first = false;
} else {
if(pr.getPriority() > result.get(0).getPriority()) {
result.clear();
result.add(pr);
} else if(pr.getParent() != null && pr.getParent().equals(result.get(0))) {
result.clear();
result.add(pr);
} else {
result.add(pr);
}
}
}
}
return result;
}
/**
* Get the most important rental AreaShop regions.
* - Returns highest priority, child instead of parent regions.
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<RentRegion> getImportantRentRegions(Location location) {
List<RentRegion> result = new ArrayList<>();
for(GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.RENT)) {
result.add((RentRegion)region);
}
return result;
}
/**
* Get the most important buy AreaShop regions.
* - Returns highest priority, child instead of parent regions.
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<BuyRegion> getImportantBuyRegions(Location location) {
List<BuyRegion> result = new ArrayList<>();
for(GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.BUY)) {
result.add((BuyRegion)region);
}
return result;
}
/**
* Get the most important AreaShop regions.
* - Returns highest priority, child instead of parent regions.
* @param location The location to check for regions
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<GeneralRegion> getImportantRegions(Location location) {
return getImportantRegions(location, null);
}
/**
* Get the most important AreaShop regions.
* - Returns highest priority, child instead of parent regions.
* @param location The location to check for regions
* @param type The type of regions to look for, null for all
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
*/
public static List<GeneralRegion> getImportantRegions(Location location, GeneralRegion.RegionType type) {
List<GeneralRegion> result = new ArrayList<>();
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
if(regions != null) {
List<GeneralRegion> candidates = new ArrayList<>();
for(ProtectedRegion pr : regions) {
GeneralRegion region = AreaShop.getInstance().getFileManager().getRegion(pr.getId());
if(region != null && (
(type == GeneralRegion.RegionType.RENT && region instanceof RentRegion)
|| (type == GeneralRegion.RegionType.BUY && region instanceof BuyRegion)
|| type == null)) {
candidates.add(region);
}
}
boolean first = true;
for(GeneralRegion region : candidates) {
if(region == null) {
AreaShop.debug("skipped null region");
continue;
}
if(first) {
result.add(region);
first = false;
} else {
if(region.getRegion().getPriority() > result.get(0).getRegion().getPriority()) {
result.clear();
result.add(region);
} else if(region.getRegion().getParent() != null && region.getRegion().getParent().equals(result.get(0).getRegion())) {
result.clear();
result.add(region);
} else {
result.add(region);
}
}
}
}
return new ArrayList<>(result);
}
/**
* Convert color and formatting codes to bukkit values.
* @param input Start string with color and formatting codes in it
* @return String with the color and formatting codes in the bukkit format
*/
public static String applyColors(String input) {
String result = null;
if(input != null) {
result = ChatColor.translateAlternateColorCodes('&', input);
}
return result;
}
/**
* Format the currency amount with the characters before and after.
* @param amount Amount of money to format
* @return Currency character format string
*/
public static String formatCurrency(double amount) {
String before = config.getString("moneyCharacter");
before = before.replace(AreaShop.currencyEuro, "€");
String after = config.getString("moneyCharacterAfter");
after = after.replace(AreaShop.currencyEuro, "€");
String result;
// Check for infinite and NaN
if(Double.isInfinite(amount)) {
result = "\u221E"; // Infinite symbol
} else if(Double.isNaN(amount)) {
result = "NaN";
} else {
BigDecimal bigDecimal = BigDecimal.valueOf(amount);
boolean stripTrailingZeros = false;
int fractionalNumber = config.getInt("fractionalNumbers");
// Add metric suffix if necessary
if(config.getDouble("metricSuffixesAbove") != -1) {
String suffix = null;
double divider = 1;
for(Double number : suffixes.keySet()) {
if(amount >= number && number > divider) {
divider = number;
suffix = suffixes.get(number);
}
}
if(suffix != null) {
bigDecimal = BigDecimal.valueOf(amount / divider);
after = suffix + after;
fractionalNumber = config.getInt("fractionalNumbersShort");
stripTrailingZeros = true;
}
}
// Round if necessary
if(fractionalNumber >= 0) {
bigDecimal = bigDecimal.setScale(fractionalNumber, RoundingMode.HALF_UP);
}
result = bigDecimal.toString();
if(config.getBoolean("hideEmptyFractionalPart")) {
// Strip zero fractional: 12.00 -> 12
if(bigDecimal.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0 && result.contains(".")) {
result = result.substring(0, result.indexOf('.'));
}
// Strip zeros from suffixed numbers: 1.20M -> 1.2M
if(stripTrailingZeros && result.contains(".")) {
result = result.replaceAll("0+$", "");
}
}
}
result = result.replace(".", config.getString("decimalMark"));
Message resultMessage = Message.fromString(result);
resultMessage.prepend(before);
resultMessage.append(after);
return resultMessage.getSingle();
}
/**
* Checks if the string is a correct time period.
* @param time String that has to be checked
* @return true if format is correct, false if not
*/
public static boolean checkTimeFormat(String time) {
// Check if the string is not empty and check the length
if(time == null || time.length() <= 1 || time.indexOf(' ') == -1 || time.indexOf(' ') >= (time.length() - 1)) {
return false;
}
// Check if the suffix is one of these values
String suffix = time.substring(time.indexOf(' ') + 1);
if(!identifiers.contains(suffix)) {
return false;
}
// check if the part before the space is a number
String prefix = time.substring(0, (time.indexOf(' ')));
return prefix.matches("\\d+");
}
/**
* Methode to tranlate a duration string to a millisecond value.
* @param duration The duration string
* @return The duration in milliseconds translated from the durationstring, or if it is invalid then 0
*/
public static long durationStringToLong(String duration) {
if(duration == null) {
return 0;
} else if(duration.equalsIgnoreCase("disabled") || duration.equalsIgnoreCase("unlimited") || duration.length() == 0) {
return -1;
} else if(duration.indexOf(' ') == -1) {
return 0;
}
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(0);
String durationString = duration.substring(duration.indexOf(' ') + 1);
int durationInt = 0;
try {
durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' ')));
} catch(NumberFormatException exception) {
// No Number found, add zero
}
if(seconds.contains(durationString)) {
calendar.add(Calendar.SECOND, durationInt);
} else if(minutes.contains(durationString)) {
calendar.add(Calendar.MINUTE, durationInt);
} else if(hours.contains(durationString)) {
calendar.add(Calendar.HOUR, durationInt);
} else if(days.contains(durationString)) {
calendar.add(Calendar.DAY_OF_MONTH, durationInt);
} else if(weeks.contains(durationString)) {
calendar.add(Calendar.DAY_OF_MONTH, durationInt * 7);
} else if(months.contains(durationString)) {
calendar.add(Calendar.MONTH, durationInt);
} else if(years.contains(durationString)) {
calendar.add(Calendar.YEAR, durationInt);
} else {
AreaShop.warn("Unknown duration indicator:", durationString, "check if config.yml has the correct time indicators");
}
return calendar.getTimeInMillis();
}
// LEGACY TIME INPUT CONVERSION
/**
* Get setting from config that could be only a number indicating seconds.
* or a string indicating a duration string
* @param path Path of the setting to read
* @return milliseconds that the setting indicates
*/
public static long getDurationFromSecondsOrString(String path) {
if(config.isLong(path) || config.isInt(path)) {
long setting = config.getLong(path);
if(setting != -1) {
setting = setting * 1000;
}
return setting;
} else {
return durationStringToLong(config.getString(path));
}
}
/**
* Get setting from config that could be only a number indicating minutes.
* or a string indicating a duration string.
* @param path Path of the setting to read
* @return milliseconds that the setting indicates
*/
public static long getDurationFromMinutesOrString(String path) {
if(config.isLong(path) || config.isInt(path)) {
long setting = config.getLong(path);
if(setting != -1) {
setting = setting * 60 * 1000;
}
return setting;
} else {
return durationStringToLong(config.getString(path));
}
}
/**
* Parse a time setting that could be minutes or a duration string.
* @param input The string to parse
* @return milliseconds that the string indicates
*/
public static long getDurationFromMinutesOrStringInput(String input) {
long number;
try {
number = Long.parseLong(input);
if(number != -1) {
number = number * 60 * 1000;
}
return number;
} catch(NumberFormatException e) {
return durationStringToLong(input);
}
}
/**
* Parse a time setting that could be seconds or a duration string.
* @param input The string to parse
* @return seconds that the string indicates
*/
public static long getDurationFromSecondsOrStringInput(String input) {
long number;
try {
number = Long.parseLong(input);
if(number != -1) {
number = number * 1000;
}
return number;
} catch(NumberFormatException e) {
return durationStringToLong(input);
}
}
/**
* Check if an input is numeric.
* @param input The input to check
* @return true if the input is numeric, otherwise false
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
public static boolean isNumeric(String input) {
try {
Integer.parseInt(input);
return true;
} catch(NumberFormatException ignored) {
return false;
}
}
/**
* Check if a string is a double.
* @param input The input
* @return true if the input is a double, otherwise false
*/
@SuppressWarnings("ResultOfMethodCallIgnored")
public static boolean isDouble(String input) {
try {
Double.parseDouble(input);
return true;
} catch(NumberFormatException e) {
return false;
}
}
/**
* Evaluate string input to a number.
* Uses JavaScript for expressions.
* @param input The input string
* @param region The region to apply replacements for and use for logging
* @return double evaluated from the input or a very high default in case of a script exception
*/
public static double evaluateToDouble(String input, GeneralRegion region) {
// Replace variables
input = Message.fromString(input).replacements(region).getSingle();
// Check for simple number
if(isDouble(input)) {
return Double.parseDouble(input);
}
// Lazy init scriptEngine
if(scriptEngine == null) {
scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
}
// Evaluate expression
Object result;
try {
result = scriptEngine.eval(input);
} catch(ScriptException e) {
AreaShop.warn("Price of region", region.getName(), "is set with an invalid expression: '" + input + "', exception:", ExceptionUtils.getStackTrace(e));
return 99999999999.0; // High fallback for safety
}
// Handle the result
if(Utils.isDouble(result.toString())) {
return Double.parseDouble(result.toString());
} else {
AreaShop.warn("Price of region", region.getName(), "is set with the expression '" + input + "' that returns a result that is not a number:", result);
return 99999999999.0; // High fallback for safety
}
}
// NAME <-> UUID CONVERSION
/**
* Conversion to name by uuid.
* @param uuid The uuid in string format
* @return the name of the player
*/
public static String toName(String uuid) {
String result = "";
if(uuid != null) {
try {
UUID parsed = UUID.fromString(uuid);
result = toName(parsed);
} catch(IllegalArgumentException e) {
// Incorrect UUID
}
}
return result;
}
/**
* Conversion to name by uuid object.
* @param uuid The uuid in string format
* @return the name of the player
*/
public static String toName(UUID uuid) {
if(uuid == null) {
return "";
} else {
String name = Bukkit.getOfflinePlayer(uuid).getName();
if(name != null) {
return name;
}
return "";
}
}
/**
* Conversion from name to uuid.
* @param name The name of the player
* @return The uuid of the player
*/
@SuppressWarnings("deprecation") // Fake deprecation by Bukkit to inform developers, method will stay
public static String toUniqueId(String name) {
if(name == null) {
return null;
} else {
return Bukkit.getOfflinePlayer(name).getUniqueId().toString();
}
}
}
@@ -0,0 +1,30 @@
package me.wiefferink.areashop.tools;
public class Value<T> {
private T value;
/**
* Create a container with a default value.
* @param value The value to set
*/
public Value(T value) {
this.value = value;
}
/**
* Get the stored value.
* @return The stored value
*/
public T get() {
return value;
}
/**
* Set the value.
* @param value The new value
*/
public void set(T value) {
this.value = value;
}
}
+181
View File
@@ -0,0 +1,181 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ config.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop. ║
# ║ This file contains options to change the working of the plugin, the profiles defined here can be used in default.yml. ║
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Options that influence the global state of the plugin │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# 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.
language: EN
# The tags that need to be written on the first line of a sign to add it to AreaShop.
signTags:
# Add a rental region.
rent: '[asrent]'
# Add a buy region.
buy: '[asbuy]'
# Add a sign to an existing region.
add: '[as]'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ ECONOMY: Options to change the display of prices. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
# The characters displayed before a price.
moneyCharacter: '$'
# The characters displayed after a price.
moneyCharacterAfter: ''
# The character(s) to use as decimal mark.
decimalMark: '.'
# How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
fractionalNumbers: 2
# How many numbers behind the dot should be shown when using a metric symbol suffix.
fractionalNumbersShort: 3
# 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 a suffix if the price is above a certain number (use 1.00M instead of 1000000.00 etc.)
metricSymbols:
#1000: "k"
1000000: "M"
1000000000: "G"
1000000000000: "T"
1000000000000000: "P"
1000000000000000000: "E"
1000000000000000000000: "Z"
1000000000000000000000000: "Y"
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ 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.
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.
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
# 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]
days: [d, day, days]
weeks: [w, week, weeks]
months: [M, month, months]
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.
limitGroups:
default:
total: 1
rents: 1
buys: 1
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ 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:
- '__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'.
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.
sendStats: true
# 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.
useColorsInConsole: false
# Use tellraw style messages, which can be interacted with by players
useFancyMessages: true
# 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.
debug: false
# Version of the config, do not change!
version: ${project.version}
# 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.
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).
# %volume% The number of blocks in a region (accounting for polygon shaped regions).
# %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.
# %timesExtended% The number of times the region has been extended (zero when first rented)
# %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|%'
+249
View File
@@ -0,0 +1,249 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ default.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop.║
# ║ All settings below are default settings and can be overridden by group settings or individual region settings. ║
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Settings that apply to all regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
general:
# 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).
teleportIntoRegion: true
# Same as above, but then for when you teleport to the sign of a region instead of the region itself.
teleportToSignIntoRegion: false
# Allow teleporting to the region from another world with `/as tp`
teleportCrossWorld: true
# When teleporting to a sign, the number of blocks the player should get teleported away from the sign
teleportSignDistance: 1
# Should '/as find' find this region while the player is in another world? (prevents cross-world teleport if turned off)
findCrossWorld: true
# 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 buying and renting of regions to the world of the region.
restrictedToWorld: false
# 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').
landlord: ''
# Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead.
landlordName: ''
# Disable to prevent counting this region towards limits set by 'limitGroups' in config.yml.
countForLimits: true
##### 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
owners: ''
members: ''
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
use: 'deny g:non_members'
build: 'deny g:non_members'
block-break: 'deny g:non_members'
block-place: '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%'
resell:
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: Settings that apply to rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
rent:
# The default price of a rental region (variables, mathematical expressions and JavaScript can be used).
price: 1000
# The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
duration: '1 day'
# Automatically extend the rental when it is running out (if the player meets the criteria)
autoExtend: false
# The percentage of the rent price you get back if you unrent the region (only the time that is unused is given back).
# (variables, mathematical expressions and JavaScript can be used)
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).
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.
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.
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.
warningOnLoginTime: '1 day'
# 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: Settings that apply to buy regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
buy:
# The default price of a buy region (variables, mathematical expressions and JavaScript can be used).
price: 1000
# The percentage of the price you get back if you sell the region (variables, mathematical expressions and JavaScript can be used)
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.
inactiveTimeUntilSell: 'disabled'
# Selling is disabled for the region owner (players with areashop.sellown without areashop.sell)
sellDisabled: false
# Reselling is disabled for the region owner (players with areashop.resell without areashop.resellall)
resellDisabled: false
@@ -0,0 +1,58 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ hiddenConfig.yml file of the AreaShop plugin created by NLThijs48. ║
# ║ Options in this file are available in config.yml, but are not shown by default there. ║
# ║ The options in these file are either very advanced, or not useful for the majority of users. ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ 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.
# Timings for saving files that need saving.
saving:
delay: '11 minutes'
regionsPerTick: 1
# Timings for rent expiration checking.
expiration:
delay: '14 seconds'
regionsPerTick: 5
# Timings for expiration warning to online players.
expireWarning:
delay: '11 seconds'
regionsPerTick: 5
# Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
update:
regionsPerTick: 10
# Time between checking if any regions need to be unrented because the player was not online for the specified time period.
inactive:
delay: '17 minutes'
regionsPerTick: 5
# Timings for the periodic updating of signs (for timeleft tags etc).
signs:
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).
nameupdate:
regionsPerTick: 10
# Timings for adding regions to AreaShop ('/as stack').
adding:
regionsPerTick: 2
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ 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
# 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:
+521
View File
@@ -0,0 +1,521 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ German language file, plugin version 2.5.0, 396/428 messages are translated (93%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Benutze %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Benutze %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Spieler %0%"
- " hover: %lang:action|Regionen von %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Vermieter %landlord%"
- " hover: %lang:action|Regionen von %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Du kannst nicht mehr als %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')."
"confirm-yes": " [gray]Klicken um %lang:command|den Command zu bestätigen|1%0%|%[gray] oder zu wiederholen."
"general-notReady": "AreaShop ist noch nicht vollständig geladen, bitte warten."
"general-noWorld": "Du kannst das nicht machen, die Welt von %lang:region% ist derzeit nicht verfügbar (Welt '%world%')."
"general-noRegion": "Du kannst das nicht machen, die WorldGuard Region ist derzeit nicht verfügbar (region %lang:region%)."
"general-noEconomy": "AreaShop kann kein (korrekt) installiertes Economy-Plugin finden, bitte informiere den Serverinhaber darüber."
"general-cancelled": "%0%"
"cmd-notValid": "Der Befehl ist ungültig, nutze '/as help' für weitere Informationen."
"cmd-onlyByPlayer": "Dieser Befehl kann nur von einem Spieler benutzt werden."
"cmd-weOnlyByPlayer": "Eine WorldEdit-Selektion kann nur von einem Spieler gewählt werden, gib die Region als extra Argument an."
"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 Region '%0%' ist in AreaShop nicht verfügbar."
"cmd-noRegion": "'%0%' ist keine gültige WorldGuard Region."
"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."
"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-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."
"help-unrent": "%lang:helpCommand|/as unrent|% Breche eine Miete für eine Region ab."
"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 den Preis einer Region."
"help-setduration": "%lang:helpCommand|/as setduration|% Ändere die Dauer einer gemieteten 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."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Lösche eine Region von einer Gruppe."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Liste alle Gruppen auf, welche derzeit Registriert sind."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Zeigt Informationen über eine Gruppe an."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Löst ein Schematic Event für eine Region aus."
"help-add": "%lang:helpCommand|/as add|% Registriere eine Region zum mieten oder kaufen."
"help-del": "%lang:helpCommand|/as del|% Lösche eine registrierte Region von AreaShop"
"help-addsign": "%lang:helpCommand|/as addsign|% Füge ein Schild zu einer existierenden Region hinzu."
"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 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."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Benutze Massenschild Verlinkungs Modus."
"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], 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% 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%)."
"rent-lowMoneyRent": "Du hast nicht genug Geld um die Region %lang:region% zu mieten. (Du hast %0% und benötigst %price%)."
"rent-someoneElse": "Die Region %lang:region% ist bereits vermietet."
"rent-notRentable": "Region '%0%' ist nicht vorhanden (Nicht registiert in Areashop oder nur zu verkaufen)."
"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 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-expiringSoon": "Deine Region %lang:tRegion|%0%|% hat noch %1% übrig. Verlängere sie, wenn du sie behalten möchtest."
"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], 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."
"buy-notBuyable": "Region '1%0%' ist nicht zum Kauf verfügbar (nicht registriert in AreaShop oder es ist eine mietbare Region)"
"buy-maximum": "Du kannst nicht mehr als %0% Region(en) erwerben (Du hast bereits %1% in Gruppe '%2%')."
"buy-payError": "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
"buy-succes": "Du hast %lang:region% erfolgreich gekauft."
"buy-successResale": "Du hast %lang:region% erfolgreich von %lang:tPlayer|%0%|% gekauft."
"buy-successSeller": "Deine Region %lang:region% wurde an %lang:player% für %0% verkauft."
"buy-lowMoney": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %price%)."
"buy-lowMoneyResell": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %resellprice%)."
"buy-yours": "Du besitzt die Region %lang:region% bereits."
"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], 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."
"unrent-notRented": "Die Region kann nicht entmietet werden, weil sie nicht gemietet ist."
"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], 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."
"sell-noPermission": "Du bist nicht berechtigt, diese Region zu verkaufen."
"sell-noPermissionOther": "Du bist nicht berechtigt, eine Region zu verkaufen."
"sell-disabled": "Das verkaufen dieser Region wurde deaktiviert."
"reload-reloading": "Alle Konfigurationsdateien und Region-Dateien wurden neu geladen."
"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|%[break]"
- " %lang:command|rented|/as info rented|% [Gruppe] [Seite][break]"
- " %lang:command|forrent|/as info forrent|% [Gruppe] [Seite][break]"
- " %lang:command|sold|/as info sold|% [Gruppe] [Seite][break]"
- " %lang:command|forsale|/as info forsale|% [Gruppe] [Seite][break]"
- " %lang:command|reselling|/as info reselling|% [Gruppe] [Seite][break]"
- " %lang:command|nogroup|/as info nogroup [Seite]|%[break]"
- " %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%:"
"info-forrentHeader": "Mietbare Regionen%0%:"
"info-forsaleHeader": "Kaufbare Regionen%0%:"
"info-soldHeader": "Verkaufte Regionen%0%:"
"info-resellingHeader": "Weiterverkaufbare Regionen%0%:"
"info-nogroupHeader": "Regionen ohne Gruppe%0%:"
"info-limitedToGroup": " (begrenzt auf Gruppe %0%)"
"info-nogroupNone": "Es gibt keine Regionen ohne Gruppe."
"info-noFiltergroup": "Gruppe '%0%' existiert nicht und kann deshalb nicht genutzt werden um die Ergebnisse zu limitieren."
"info-noRegions": "Es wurden keine Regionen gefunden."
"info-wrongPage": "%0% ist keine korrekte Seitenzahl."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zur Vermietung für %price% je %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vermietet an %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zum Verkauf für %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player% (Weiterverkauf)."
"info-pageStatus": "[gold]Seite %0%/%1%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Vorherige[/bold] "
- " hover: Das ist bereits die erste Seite."
"info-pageNoNext":
- " [darkgray][bold]Nächste►[/bold]"
- " hover: Das ist bereits die letzte Seite."
"info-playerHelp": "/as info player <Spielername>."
"info-playerRents": "Gemietete Regionen von %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% hat bisher keine Region(en) gemietet."
"info-playerBuys": "Gekaufte Regionen von %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% hat bisher keine Region(en) gekauft."
"info-regionHelp": "/as info region [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
"info-regionHeaderRent": "[darkgreen]Informationen über %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informationen über %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Gemietet von %lang:player% bis: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Gekauft von %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Gekauft von %lang:player%, derzeit Weiterverkauf."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Verlängern für[/bold]"
- " hover: Miete verlängern für %region%"
- " hover: mit %duration% für %price%"
- " hover: %lang:action|Mieter Verlängern für %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% für %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Mieten für[/bold]"
- " hover: Miete %region% für %price% für %duration%"
- " hover: %lang:action|Miete %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% für %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Kaufen für[/bold]"
- " hover: Kaufe %region% für %price%"
- " hover: %lang:action|Kaufe %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Weiterverkaufspreis: [gray]%resellprice% (Du kannst es von %lang:player% kaufen)."
"info-regionFriends": "[darkgreen][bold]►[reset] Hinzugefügte Freunde: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Lösche %0% als Freund|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkaufpreis: [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Verkaufsrückzahlung[/bold]"
- " hover: Verkaufe %region% und bekomme %moneyback% zurück"
- " hover: %lang:action|Verkaufe %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Rückzahlung bei Mietkündigung: [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Mietrückzahlung[/bold]"
- " 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 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% ."
"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|Teleport to %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Setze den Teleport Punkt[/bold]"
- " hover: %region%"
- " 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]"
"info-regionGroups": "[darkgreen][bold]►[reset] Zugewiesene Gruppen: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische Mietkündigung nach: [gray]%inactivetime% Inaktivität des Spielers."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatischer Verkauf nach: [gray]%inactivetime% Inaktivität des Spielers."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie mieten zu können."
"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] Wiederherstellung ist aktiviert [gray](Region wird bei Mietkündigung zurückgesetzt)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Wiederherstellung ist aktiviert. [gray](Region wird beim Verkauf zurückgesetzt)."
"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 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%'."
"setprice-noPermission": "Du bist nicht berechtigt, den Preis einer Region zu ändern."
"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%."
"setprice-successBuy": "Der Preis der Region %lang:region% wurde zu %price% geändert."
"setprice-successRemoved": "Der Preis der Region %lang:region% wurde entfernt, ab jetzt wird der Preis einer Gruppe oder der default.yml-Datei benutzt. Neuer Preis: %price%."
"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], ä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."
"setduration-success": "Dauer von Region %lang:region% zu '%duration%' geändert."
"setduration-noLandlord": "Du hast keine Rechte um die Dauer der Miete zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
"setduration-successRemoved": "Die Mietdauer der Region %lang:region% wurde entfernt, es wird nun die Dauer von einer Gruppe oder der default.yml Datei benutzt. Neue Mietdauer: %duration%."
"setup-noRegion": "Du hast in der zweiten Zeile keine Region angegeben."
"setup-alreadyRentSign": "Die angegebene Region ist bereits in AreaShop als eine Miet-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
"setup-alreadyOtherWorld": "Die Region, die angegeben wurde, wurde bereits in einer anderen Welt hinzugefügt, Regionen aus verschiedenen Welten benötigen dennoch andere Namen."
"setup-alreadyBuySign": "Die angegebene Region ist bereits in AreaShop als eine Kauf-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
"setup-noDuration": "Du hast nicht angegeben, wie lange eine Region mietbar ist. Bitte trage dies in die dritte Zeile ein."
"setup-wrongDuration": "Die angegebene Zeit liegt nicht in einem korrekten Format vor. Beispiel: 1 Tag."
"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 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 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."
"teleport-help": "/as tp <Region> [Schild]."
"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 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-noPermissionAvailable": "Du hast keine Rechte um dich zu verfügbaren Regionen zu teleportieren."
"teleport-noPermissionAvailableSign": "Du hast keine Rechte um dich zum Schild von verfügbaren Regionen zu teleportieren."
"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%)."
"teleport-blocked": "Du kannst dich nicht teleportieren, weil sich die Position außerhalb der Region befindet und du dich nur in die Region teleportieren kannst."
"teleport-changedToSign": "Du hast nur Rechte um zum Schild der Region zu teleportieren und nicht um in die Region zu teleportieren. Teleportiere zum Schild."
"teleport-changedToNoSign": "Es ist kein Schild zum teleportieren verfügbar, versuche stattdessen in die Region zu teleportieren."
"setteleport-help": "/as settp [Region] [reset], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
"setteleport-noPermission": "Du bist nicht berechtigt, einen Teleport-Punkt zu setzen."
"setteleport-noPermissionOther": "Dir fehlt die Berechtigung die Teleportposition für eine Region, du du nicht besitzt, festzulegen."
"setteleport-noRentOrBuy": "Die angegebene Region ist nicht registriert: %0%."
"setteleport-success": "Teleport-Punkt von %lang:region% erfolgreich gesetzt."
"setteleport-notInside": "Der Teleportpunkt muss sich innerhalb einer Region befinden."
"setteleport-reset": "Teleport-Punkt von %lang:region% erfolgreich zurückgesetzt."
"find-help": "/as find <buy|rent> [maximaler Preis] [Gruppe]."
"find-noPermission": "Du hast keine Berechtigungen nach Regionen zu suchen und zu ihnen zu teleporten."
"find-success": "%0% Region gefunden: %lang:region%, bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
"find-successMax": "%0% Region gefunden: %lang:region%,, bei Suche nach max. Preis in Höhe von %1%%2%."
"find-wrongMaxPrice": "Der angegebene Maximal-Preis ist kein korrekter Betrag: %0%."
"find-wrongGroup": "Die angegebene Gruppe existiert nicht: %0%."
"find-noneFound": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
"find-noneFoundMax": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe von %1%%2%."
"find-onlyInGroup": ", nur nach Regionen in der Gruppe %0% suchen."
"groupadd-help": "/as groupadd <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
"groupadd-noPermission": "Du bist nicht berechtigt Regionen zu Gruppen hinzuzufügen."
"groupadd-success": "Region %lang:region% wurde zur Gruppe '%0%' hinzugefügt. Diese Gruppe hat nun %1% Mitglied(er)."
"groupadd-failed": "Region %lang:region% ist bereits Mitglied der Gruppe '%0%';."
"groupadd-weSuccess": "Zu Gruppe %0% hinzugefügt: [gray]%1%."
"groupadd-weFailed": "Ist bereits in Gruppe %0%: [gray]%1%."
"groupdel-help": "/as groupdel <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
"groupdel-noPermission": "Du bist nicht berechtigt, Regionen aus Gruppen zu entfernen."
"groupdel-success": "Region %lang:region% ist aus Gruppe '%0%' entfernt worden. Diese Gruppe hat nun %1% Mitglied(er)."
"groupdel-failed": "Region %lang:region% gehört nicht zur Gruppe '%0%'."
"groupdel-weSuccess": "Entfernt aus Gruppe %0%: [gray]%1%."
"groupdel-weFailed": "Ist nicht länger in Gruppe %0%: [gray]%1%."
"grouplist-noPermission": "Du bist nicht berechtigt, die eingetragenen Gruppen abzurufen."
"grouplist-noGroups": "Momentan sind keine Gruppen vorhanden."
"grouplist-success": "Folgende Gruppen sind vorhanden: [gray]%0%."
"groupinfo-help": "/as groupinfo <Gruppe>."
"groupinfo-noPermission": "Du bist nicht berechtigt, Informationen über eine Gruppe abzurufen."
"groupinfo-noGroup": "Es ist keine Gruppe mit dem Namen '%0%' vorhanden, bitte benutze zum Anzeigen der verfügbaren Gruppen /as grouplist."
"groupinfo-members": "Die folgenden Regionen gehören zur Gruppe %0%: [gray]%1%."
"groupinfo-noMembers": "Gruppe %0% hat keine Mitglieder."
"schemevent-help": "/as schemevent <Region> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Das angegebene Event '%0%' existiert nicht, bitte benutze eines der folgenden: [gray]%1%."
"schemevent-success": "'%0%'-Event wurde erfolgreich für Region %lang:region% ausgelöst."
"schemevent-noPermission": "Du bist nicht berechtigt, Schematic-Events auszuführen."
"add-help": "/as add <rent|buy> [Region] [Welt]."
"add-noPermission": "Du bist nicht berechtigt, eine Region in AreaShop hinzuzufügen."
"add-success": "Hinzugefügt als %0%: [gray]%1%."
"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-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."
"del-noPermission": "Du bist nicht berechtigt, Regionen zu entfernen."
"del-success": "Entfernte Region(en): [gray]%0%."
"del-failed": "Keine Berechtigung zum Entfernen oder nicht eingetragen: [gray]%0%."
"addsign-help": "/as addsign [Region] [Profil]."
"addsign-noSign": "Du schaust gerade nicht auf ein Schild."
"addsign-noRegions": "Keine Region(en) um das Schild herum gefunden."
"addsign-couldNotDetect": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region als Argument angeben (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region in die zweite Zeile eintragen (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Das eingetragene Profil existiert nicht. Bitte benutze eines der folgenden (überprüfe config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Schildprofil %0%"
- " 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."
"addsign-alreadyRegistered": "Dieses Schild ist bereits für die Region %lang:region% registriert."
"addsign-noPermission": "Du bist nicht berechtigt, ein Schild hinzuzufügen."
"delsign-noSign": "Du schaust gerade nicht auf ein Schild."
"delsign-noPermission": "Du bist nicht berechtigt, ein Schild zu entfernen."
"delsign-noRegion": "Dieses Schild gehört zu keiner in AreaShop eingetragenen Region."
"delsign-success": "Das Schild wurde von der Region %lang:region% entfernt."
"me-noPermission": "Dir fehlt die Berechtigung einzusehen, welche Regionen du besitzt."
"me-header": "Regionen von %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Du bist kein Spieler, darum können dir keine Regionen gehören."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% übrig"
- " hover: bis %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "Im Besitz von %lang:player%"
- " hover: Du wurdest als Freund hinzugefügt"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% hat keine gemieteten oder gekaufen Regionen und wurde nicht als Freund zu einem hinzugefügt."
"me-noPlayer": "%0% konnte nicht gefunden werden, möglicherweise war er nie auf diesem Server."
"me-clickHint": "[gray][italic]Klicke auf eine Region, um weitere Details zu erhalten."
"setowner-help": "/as setowner <Spieler> [Region], wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
"setowner-noPermission": "Dir fehlt die Berechtigung den Besitzer einer Region festzulegen."
"setowner-noPermissionRent": "Dir fehlt die Berechtigung den Mieter einer Region festzulegen."
"setowner-noPermissionBuy": "Dir fehlt die Berechtigung den Eigentümer einer Region festzulegen."
"setowner-notRegistered": "Die angegebene Region ist nicht registriert, Besitzer kann nicht festgelegt werden."
"setowner-noPlayer": "Die UUID des Spielers %0% konnte nicht gefunden werden."
"setowner-succesRent": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%, gemietet bis %until% (%timeleft% verbleibend)."
"setowner-succesRentExtend": "%lang:player% ist bereits Besitzer, Miete verlängert um '%duration%', nun gemietet bis %until% (%timeleft% verbleibend)."
"setowner-succesBuy": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%."
"resell-help": "/as resell <Preis> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"resell-wrongPrice": "'%0%' ist keine gültige Preisangabe."
"resell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"resell-notBought": "Du kannst %lang:region% nicht weiterverkaufen, weil sie noch nicht erworben wurde."
"resell-success": "Weiterverkauf für %lang:region% erfolgreich aktiviert. Preis: %resellprice%."
"resell-noPermission": "Du hast keine Berechtigung, deine Region weiterzuverkaufen."
"resell-noPermissionOther": "Du hast keine Berechtigung, den Weiterverkauf von Regionen zu aktivieren."
"resell-disabled": "Der Weiterverkauf wurde für diese Region deaktiviert."
"stopresell-help": "/as stopresell [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"stopresell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
"stopresell-notResell": "Du kannst den Weiterverkauf von %lang:region% nicht stoppen, weil sie bisher nicht weiterverkauft werden soll."
"stopresell-success": "Weiterverkauf von %lang:region% wurde erfolgreich gestoppt."
"stopresell-noPermission": "Du hast keine Berechtigung, den Weiterverkauf deiner Region zu stoppen."
"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 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."
"addfriend-self": "Den Besitzer der Region als Freund hinzuzufügen wäre sinnlos."
"addfriend-noOwner": "Du kannst keine Freunde zu einer Region ohne Besitzer hinzufügen."
"addfriend-notVisited": "Du kannst %0% nicht hinzufügen, weil dieser Spieler noch nie auf dem Server war."
"delfriend-help": "/as delfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
"delfriend-noPermissionOther": "Du hast keine Berechtigung, Freunde von Regionen zu entfernen, die dir nicht gehören."
"delfriend-noPermission": "Du hast keine Berechtigung, Freunde von deinen Regionen zu entfernen."
"delfriend-successOther": "%lang:tPlayer|%0%|% wurde als Freund der Region %lang:region% entfernt."
"delfriend-success": "%lang:tPlayer|%0%|% wurde als Freund Deiner Region %lang:region% entfernt."
"delfriend-notAdded": "%lang:tPlayer|%0%|% wurde nicht als Freund zur Region %lang:region% hinzugefügt."
"delfriend-noOwner": "Du kannst keine Freunde von einer Region ohne Besitzer entfernen."
"linksigns-multipleRegions": "Mehrere Regionen gefunden: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Bitte klicke nochmal oder benutze '/as linksigns', um aufzuhören."
"linksigns-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, 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."
"linksigns-first": "Du bist nun im Schilderverbindungsmodus."
"linksigns-next": "[gray]Linksklicke um ein Schild zu wählen, Rechtsklicke um eine Region zu wählen. Benutze /as linksigns um aufzuhören."
"linksigns-noPermission": "Du hast keine Berechtigungen um den Schilder-Massenverbindungsmodus zu benutzen."
"linksigns-stopped": "Schilder-Verbindungsmodus verlassen."
"stack-help":
- "/as stack <Menge> <Abstand> <Name> <rent|buy> [Gruppe]."
- "[gray]<Menge> Nummer der Regionen, die erstellt werden."
- "[gray]<Abstand> Block-Abstand zwischen den Regionen."
- "[gray]<Name> Namen der Regionen (Nummer wird dahinter sein)."
- "[gray]<rent|buy> Macht die Regionen zu kauf- oder Mietregionen"
- "[gray][Gruppe] Eine Gruppe, die zu den erstellten Regionen hinzugefügt wird."
- "Die Regionen werden in deiner Blickrichtung erstellt."
"stack-accepted": "Erstelle %0% %1% Regionen mit %2% Blöcken Abstand, Namen beginnend mit %3% und einer Zahl dahinter. %4%"
"stack-addToGroup": "Gruppe '%0%' wird zu den erstellten Regionen hinzugefügt."
"stack-noPermission": "Du hast keine Berechtigungen um Regionen massenweise in AreaShop zu erstellen und hinzuzufügen."
"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]%0% Regionen%1% hinzugefügt."
"stack-tooHigh": ", %0% Regionen übersprungen, da sie sich über Y=256 befinden."
"stack-tooLow": ", %0% Regionen übersprungen, da sie sich unter Y=0 befinden."
"stack-unclearDirection": "Bitte gucke ganz klar nach Norden, Osten, Süden, Westen, nach oben oder unten. 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."
"setlandlord-success": "%lang:landlord% wurde erfolgreich als Vermieter der Region %lang:region% gesetzt."
"message-help": "/as message <Spieler> <Nachricht...>"
"message-noPermission": "Du hast keine Berechtigung AreaShop Nachrichten zu senden."
"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%|%"
- "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|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%|%"
- "hover: %lang:action|Mietvertrag auslösen %0%|%"
- "command: /areashop unrent %0%"
"confirm-buy":
- "%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 von %0%|%"
- " hover: %lang:action|Verkaufe %0%|%"
- " command: /areashop sell %0% "
"timeleft-years": "%0% Jahre"
"timeleft-months": "%0% Monate"
"timeleft-days": "%0% Tage"
"timeleft-hours": "%0% Stunden"
"timeleft-minutes": "%0% Minuten"
"timeleft-second": "%0% Sekunde"
"timeleft-seconds": "%0% Sekunden"
"timeleft-ended": "abgelaufen"
"greeting-forrent": "%region% kann gemietet werden für %price% je %duration%."
"greeting-rented": "%region% ist vermietet an %player% bis %until%."
"greeting-forsale": "%region% kann gekauft werden für %price%."
"greeting-bought": "%region% ist Eigentum von %player%."
"greeting-resale": "%region% kann für %resellprice% von 1%player% gekauft werden."
+621
View File
@@ -0,0 +1,621 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ English language file, plugin version 2.5.0
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Use %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Use %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Player %0%"
- " hover: %lang:action|Regions of %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Landlord %landlord%"
- " hover: %lang:action|Regions of %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "You can't rent and buy more than %0% region(s) in total (you already have %1% in group '%2%')."
confirm-yes: " [gray]Click to %lang:command|Confirm|%0%|%[gray], or repeat the command."
general-notReady: "AreaShop has not fully loaded yet, please wait."
general-noWorld: "You cannot do that, the world of %lang:region% is currently unavailable (world '%world%')."
general-noRegion: "You cannot do that, the WorldGuard region is currently unavailable (region %lang:region%)."
general-noEconomy: "There is no Economy plugin installed or it is not setup correctly, notify the server owner about this."
general-cancelled: "%0%"
cmd-notValid: "That command is not valid, use '/as help' for info."
cmd-onlyByPlayer: "This command can only be run by a player."
cmd-weOnlyByPlayer: "Using a WorldEdit selection is only possible as a player, specify the region name as extra argument."
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: "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."
help-header: "Help page, commands that you can execute."
help-noPermission: "You do not have permission to view the help page."
help-alias: "Command aliases: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Shows this help page."
help-info: "%lang:helpCommand|/as info|% Get info about current regions."
help-rent: "%lang:helpCommand|/as rent|% Rent a region or extend your current rent."
help-buy: "%lang:helpCommand|/as buy|% Buy a region."
help-unrent: "%lang:helpCommand|/as unrent|% Unrent a region."
help-sell: "%lang:helpCommand|/as sell|% Sell a region."
help-reload: "%lang:helpCommand|/as reload|% Reload all files and update the regions."
help-setrestore: "%lang:helpCommand|/as setrestore|% Set restoring on/off and choose profile."
help-setprice: "%lang:helpCommand|/as setprice|% Change the price of a region."
help-setduration: "%lang:helpCommand|/as setduration|% Change the duration of a rent region."
help-teleport: "%lang:helpCommand|/as tp|% Teleport to a rent/buy region."
help-setteleport: "%lang:helpCommand|/as settp|% Set teleport position for a region."
help-find: "%lang:helpCommand|/as find|% Find an empty buy or rent."
help-groupadd: "%lang:helpCommand|/as groupadd|% Add a region to a group."
help-groupdel: "%lang:helpCommand|/as groupdel|% Delete a region from a group."
help-grouplist: "%lang:helpCommand|/as grouplist|% Display all groups currently registered."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Display information about a group."
help-schemevent: "%lang:helpCommand|/as schemevent|% Trigger a schematic event for a region."
help-add: "%lang:helpCommand|/as add|% Register a region as rent or buy."
help-del: "%lang:helpCommand|/as del|% Delete a registered region from AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Add a sign to an existing region."
help-delsign: "%lang:helpCommand|/as delsign|% Delete the sign you are looking at."
help-me: "%lang:helpCommand|/as me|% Check which regions you have (+expiration)."
help-setowner: "%lang:helpCommand|/as setowner|% Set region owner or extend the rent."
help-resell: "%lang:helpCommand|/as resell|% Put a region into resell mode."
help-stopResell: "%lang:helpCommand|/as stopresell|% Put a region back into sold mode."
help-addFriend: "%lang:helpCommand|/as addfriend|% Add a friend to a region."
help-delFriend: "%lang:helpCommand|/as delfriend|% Delete a friend from a region."
help-linksigns: "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
help-stack: "%lang:helpCommand|/as stack|% Create multiple regions and add them."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Set the landlord of a region."
help-import: "%lang:helpCommand|/as import|% Import region from RegionForSale."
rent-help: "/as rent [region], the region you stand in will be used if not specified."
rent-noPermission: "You don't have permission to rent a region."
rent-maximum: "You can't rent more than %0% region(s) (you already have %1% in group '%2%')."
rent-maximumExtend: "You can't extend this rent because you have more than %0% region(s) (you already have %1% in group '%2%')."
rent-payError: "Something went wrong with paying, try again later."
rent-rented: "You rented %lang:region% until %until%, you can extend your rent by rightclicking the sign again or using /as rent."
rent-extended: "You extended your rent of %lang:region% until %until%."
rent-extendedToMax: "You extended your rent of %lang:region% until %until% (which is the maximum rental time of %maxrenttime%)."
rent-lowMoneyExtend: "You don't have enough money to extend the rent (you have %0% and you need %price%)."
rent-lowMoneyRent: "You don't have enough money to rent %lang:region% (you have %0% and you need %price%)."
rent-someoneElse: "Someone else already rented %lang:region%."
rent-notRentable: "Region '%0%' is not available for renting (not registered in AreaShop or it is a buy region)."
rent-maxExtends: "You cannot extend this rent anymore (the maximum is %maxextends% times), however after the rent is over you can rent %lang:region% again."
rent-maxRentTime: "You cannot rent %lang:region% more time in advance, the maximum time is %maxrenttime% and you have currently rented it for %timeleft%."
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."
buy-noPermission: "You don't have permission to buy a region."
buy-noPermissionResell: "You don't have permission to buy a region in resell mode."
buy-noPermissionNoResell: "You don't have permission to buy a region that is not in resell mode."
buy-notBuyable: "Region '%0%' is not available for buying (not registered in AreaShop or it is a rental region)."
buy-maximum: "You can't buy more than %0% region(s) (you already have %1% in group '%2%')."
buy-payError: "Something went wrong with paying, try again later."
buy-succes: "You successfully bought %lang:region%."
buy-successResale: "You successfully bought %lang:region% from %lang:tPlayer|%0%|%."
buy-successSeller: "Your region %lang:region% has been sold to %lang:player% for %0%."
buy-lowMoney: "You don't have enough money to buy %lang:region% (you have %0% and you need %price%)."
buy-lowMoneyResell: "You don't have enough money to buy %lang:region% (you have %0% and you need %resellprice%)."
buy-yours: "You already own %lang:region%."
buy-someoneElse: "Someone else already bought %lang:region%."
buy-restrictedToWorld: "You need to be in the '%world%' world to buy %lang:region% (you are in '%0%')."
buy-restrictedToRegion: "You need to be inside %lang:region% to buy it."
unrent-help: "/as unrent [region], the region you stand in will be used if not specified."
unrent-noPermission: "You don't have permission to unrent a region."
unrent-noPermissionOther: "You don't have permission to unrent another region."
unrent-notRegistered: "The region can't be unrented because it is not registered for renting."
unrent-notRented: "The region can't be unrented because it is not rented."
unrent-unrented: "%lang:region% of %lang:player% has been unrented."
unrent-expired: "Your rent of %lang:region% has expired."
sell-help: "/as sell [region], the region you stand in will be used if not specified."
sell-notRegistered: "The region can't be sold because it is not registered for buying."
sell-notBought: "The region can't be sold because it is not someone's property."
sell-sold: "%lang:region% of %lang:player% has been sold."
sell-noPermission: "You don't have permission to sell a region."
sell-noPermissionOther: "You don't have permission to sell another region."
sell-disabled: "Selling has been disabled for this region."
reload-reloading: "Reloaded all configuration and region files."
reload-updateStart: ""
reload-updateComplete: ""
reload-noPermission: "You don't have permission to reload the config files."
reload-updateCommandChanged: "'/as updaterents' and '/as updatebuys' have been removed, '/as reload' will also update the regions now so use that command instead."
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]|%[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%:"
info-forrentHeader: "For rent regions%0%:"
info-forsaleHeader: "For sale regions%0%:"
info-soldHeader: "Sold regions%0%:"
info-resellingHeader: "Reselling regions%0%:"
info-nogroupHeader: "Regions without group%0%:"
info-limitedToGroup: " (limited to group %0%)"
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%: [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:
- "[gold]Page %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Previous[/bold] "
- " hover: %lang:action|Show previous page|%"
- " command: /areashop %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Previous[/bold] "
- " hover: This is already the first page"
info-pageNext:
- " [gold][bold]Next►[/bold]"
- " hover: %lang:action|Show next page|%"
- " command: /areashop %0%"
info-pageNoNext:
- " [darkgray][bold]Next►[/bold]"
- " hover: This is already the last page"
info-playerHelp: "/as info player <name>."
info-playerRents: "Regions rented by %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% has not rented a region."
info-playerBuys: "Regions bought by %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% has not bought a region."
info-regionHelp: "/as info region [name], the region you stand in will be used if not specified."
info-regionHeaderRent: "[darkgreen]Information about %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Information about %lang:region%:"
info-regionFooterRent: ""
info-regionFooterBuy: ""
info-regionRented: "[darkgreen][bold]►[reset] Rented by %lang:player% until: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Bought by %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Bought by %lang:player%, currently reselling."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Extend for[/bold]"
- " hover: Extend rent of %region%"
- " hover: with %duration% for %price%"
- " hover: %lang:action|Extend rent of %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Rent for[/bold]"
- " hover: Rent %region% for %price% per %duration%"
- " hover: %lang:action|Rent %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Buy for[/bold]"
- " hover: Buy %region% for %price%"
- " hover: %lang:action|Buy %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Resell price: [gray]%resellprice% (you can buy it from %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Added friends: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Remove %0% as friend|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy:
- "[darkgreen][bold]►[reset] Selling payback: [gray]%moneyback% (%moneybackpercent%% of the price)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Selling payback[/bold]"
- " hover: Sell %region% and get back %moneyback%"
- " hover: %lang:action|Sell %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% of the price)."
info-regionMoneyBackRent:
- "[darkgreen][bold]►[reset] Unrenting payback: [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Unrenting payback[/bold]"
- " hover: Unrent %region% and get back %moneyback%"
- " hover: %lang:action|Unrent %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximum number of extensions: [gray]%maxextends% time(s)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Rent cannot be extended."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Extensions left: [gray]%extendsleft% time(s) out of %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] In advance renting: [gray]%maxrenttime% at maximum."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Go to the region[/bold]"
- " hover: %lang:action|Teleport to %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]set teleport location[/bold]"
- " hover: %region%"
- " hover: %lang:action|Set teleport location|%"
- " 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] Assigned groups: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Auto unrent after: [gray]%inactivetime% of inactivity by the player."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Auto sell after: [gray]%inactivetime% of inactivity by the player."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] You must be inside %lang:region% to rent it."
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)."
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%."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
setrestore-noPermission: "You don't have permission to change the restore settings."
setrestore-notRegistered: "The specified region is not registered: %0%."
setrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general."
setrestore-success: "Successfully set the restore setting of %lang:region% to '%0%'."
setrestore-successProfile: "Successfully set the restore setting of %lang:region% to '%0%' and the profile to '%1%'."
setprice-noPermission: "You don't have permission to change the price of a region."
setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified."
setprice-notRegistered: "The specified region is not registered: %0%."
setprice-wrongPrice: "'%0%' is not a valid price."
setprice-successRent: "Price of region %lang:region% changed to %price% per %duration%."
setprice-successBuy: "Price of region %lang:region% changed to %price%."
setprice-successRemoved: "Price of %lang:region% has been removed, it will now use the price from a group or the default.yml file, new price: %price%."
setprice-noLandlord: "You don't have permission to change the price because you are not the landlord of %lang:region%."
setduration-noPermission: "You don't have permission to change the duration of a rent."
setduration-help: "/as setduration <amount> <identifier> [region], the region you stand in will be used if not specified."
setduration-notRegistered: "%0% is not registered for renting."
setduration-wrongAmount: "'%0%' is not a valid amount, use a whole number."
setduration-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit."
setduration-success: "Duration of region %lang:region% changed to '%duration%'."
setduration-noLandlord: "You don't have permission to change the duration because you are not the landlord of %lang:region%."
setduration-successRemoved: "Duration of %lang:region% has been removed, it will now use the duration from a group or the default.yml file, new duration: %duration%."
setup-noRegion: "You did not specify a region on the second line."
setup-alreadyRentSign: "The region you specified is already added to AreaShop as a rent region, add signs with [as] on the first line or '/as addsign'."
setup-alreadyOtherWorld: "The region you specified is already added to AreaShop in another world, regions from different worlds still need different names."
setup-alreadyBuySign: "The region you specified is already added to AreaShop as a buy region, add signs with [as] on the first line or '/as addsign'."
setup-noDuration: "You did not specify how long the region can be rented, do this on the third line."
setup-wrongDuration: "The time specified is not in the correct format, example: 1 day."
setup-noPrice: "You did not specify the price on the fourth line."
setup-wrongPrice: "You did not specify the price correctly, use numbers only."
setup-rentSuccess: "Renting of region %lang:region% is setup correctly."
setup-buySuccess: "Buying of region %lang:region% is setup correctly."
setup-noPermissionRent: "You don't have permission for setting up rental regions."
setup-noPermissionBuy: "You don't have permission for setting up buy regions."
setup-couldNotDetect: "Found multiple regions with the same priority and/or parent/child relation, specify one on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% is on the blacklist and cannot be added to AreaShop."
setup-noPermission: "You cannot add the region '%0%', you are not an owner/member or don't have the permission for it."
destroy-noPermissionRent: "You don't have permission for deregistering a rental region."
destroy-noPermissionBuy: "You don't have permission for deregistering a buy region."
destroy-successRent: "%lang:region% successfully deregistered as rental region."
destroy-successBuy: "%lang:region% successfully deregistered as buy region."
teleport-help: "/as tp <region> [sign]."
teleport-noRentOrBuy: "The specified region is not registered: %0%."
teleport-noPermission: "You don't have permission to teleport to your region."
teleport-noPermissionOther: "You don't have permission to teleport to regions you do not own."
teleport-noPermissionSign: "You don't have permission to teleport to the sign of your region."
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%)."
teleport-blocked: "You can't teleport because the position is outside the region, and you are forced to teleport inside."
teleport-changedToSign: "You only have permission to teleport to the sign and not inside the region, teleporting to sign."
teleport-changedToNoSign: "No sign available to teleport to, trying to teleport inside the region instead."
teleport-wrongWorld: "You need to be in world '%world%' to teleport to %lang:region%, but you are in world '%0%'."
setteleport-help: "/as settp [region] [reset], the region you stand in will be used if not specified."
setteleport-noPermission: "You don't have permission to set the teleport location."
setteleport-noPermissionOther: "You don't have permission to set the teleport location for a region you do not own."
setteleport-noRentOrBuy: "The specified region is not registered: %0%."
setteleport-success: "Teleport location of %lang:region% set."
setteleport-notInside: "The location has to be inside the region."
setteleport-reset: "Teleport location of %lang:region% has been reset."
find-help: "/as find <buy|rent> [maxprice] [group]."
find-noPermission: "You don't have permission to search regions and teleport to them."
find-success: "Found a %0% region: %lang:region%, while searching with a max price of your balance: %1%%2%."
find-successMax: "Found a %0% region: %lang:region%, while searching with a max price of %1%%2%."
find-wrongMaxPrice: "The specified maximum price is not a correct number: %0%."
find-wrongGroup: "The specified group does not exist: %0%."
find-noneFound: "No %0% region found while searching with a max price of your balance: %1%%2%."
find-noneFoundMax: "No %0% region found while searching with a max price of %1%%2%."
find-onlyInGroup: ", only searched for regions in group: %0%."
groupadd-help: "/as groupadd <group> [region], if no region specified all regions from your WorldEdit selection are used."
groupadd-noPermission: "You don't have permission to add regions to groups."
groupadd-success: "Region %lang:region% has been added to group '%0%', this group now has %1% member(s)."
groupadd-failed: "Region %lang:region% is already a member of group '%0%'."
groupadd-weSuccess: "Added to group %0%: [gray]%1%."
groupadd-weFailed: "Were already in group %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [region], if no region specified all regions from your WorldEdit selection are used."
groupdel-noPermission: "You don't have permission to remove regions from groups."
groupdel-wrongGroup: "Group %0% not found, check '/as grouplist' for registered groups."
groupdel-success: "Region %lang:region% has been removed from group '%0%', this group now has %1% member(s)."
groupdel-failed: "Region %lang:region% is not a member of group '%0%'."
groupdel-weSuccess: "Removed from group %0%: [gray]%1%."
groupdel-weFailed: "Were not in group %0% anyway: [gray]%1%."
grouplist-noPermission: "You don't have permission to display the registered groups."
grouplist-noGroups: "There are currently no groups registered."
grouplist-success: "The following groups are registered: [gray]%0%."
groupinfo-help: "/as groupinfo <group>."
groupinfo-noPermission: "You don't have permission to display information about a group."
groupinfo-noGroup: "There is no group registered with the name '%0%', use /as grouplist to check groups."
groupinfo-members: "The following regions are member of group %0%: [gray]%1%."
groupinfo-noMembers: "Group %0% does not have any members."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "The specified event '%0%' does not exist, use one of the following: [gray]%1%."
schemevent-success: "Event '%0%' has successfully been triggered for region %lang:region%."
schemevent-noPermission: "You don't have permission to trigger schematic events."
add-help: "/as add <rent|buy> [region] [world]."
add-noPermission: "You don't have permission to add a region to AreaShop."
add-success: "Added as %0%: [gray]%1%."
add-failed: "Already registered: [gray]%0%."
add-failedOtherWorld: "Already registered from another world: [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-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."
del-noPermission: "You don't have permission to remove regions."
del-success: "Removed regions: [gray]%0%."
del-failed: "No permission to remove or not registered: [gray]%0%."
addsign-help: "/as addsign [region] [profile]."
addsign-noSign: "You are not looking at a sign."
addsign-noRegions: "No region found around the sign position."
addSign-notRegistered: "The specified region is not registered in AreaShop: %0% (it first needs to be added to AreaShop before a sign can be added)."
addsign-couldNotDetect: "Found multiple regions around the sign, specify region as extra argument (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Found multiple regions around the sign, specify region on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
addsign-wrongProfile: "The specified profile does not exist, use one of the following (check config): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Signprofile %0%"
- " hover: %lang:action|Use this profile|%"
- " command: /areashop linksigns %0%"
addsign-success: "The sign has been added to %lang:region%."
addsign-successProfile: "The sign has been added to %lang:region% with profile %0%."
addsign-alreadyRegistered: "That sign is already registered for region %lang:region%."
addsign-noPermission: "You don't have permission to add a sign."
delsign-noSign: "You are not looking at a sign."
delsign-noPermission: "You don't have permission to delete a sign."
delsign-noRegion: "That sign does not belong to an AreaShop region."
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]("
- "%timeleft% left"
- " hover: until %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
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."
setowner-noPermissionRent: "You don't have permission to set the owner of rent regions."
setowner-noPermissionBuy: "You don't have permission to set the owner of buy regions."
setowner-notRegistered: "The specified region is not registered, owner cannot be set."
setowner-noPlayer: "Could not get the UUID of the specified player: %0%."
setowner-succesRent: "Owner of %lang:region% successfully changed to %lang:player%, rented until %until% (%timeleft% left)."
setowner-succesRentExtend: "Owner was already %lang:player%, rent extended with '%duration%', now rented until %until% (%timeleft% left)."
setowner-succesBuy: "Owner of %lang:region% successfully changed to %lang:player%."
resell-help: "/as resell <price> [region], the region you stand in will be used if not specified."
resell-wrongPrice: "'%0%' is not a valid price."
resell-notRegistered: "The specified region is not registered: %0%."
resell-notBought: "You can't resell %lang:region% because it is not sold yet."
resell-success: "%lang:region% is successfully put into reselling mode for %resellprice%."
resell-noPermission: "You don't have permission to set your region in reselling mode."
resell-noPermissionOther: "You don't have permission to set regions in reselling mode."
resell-disabled: "Reselling has been disabled for this region."
stopresell-help: "/as stopresell [region], the region you stand in will be used if not specified."
stopresell-notRegistered: "The specified region is not registered: %0%."
stopresell-notResell: "You can't stop reselling %lang:region% because it is not in resell mode."
stopresell-success: "%lang:region% is successfully put back into sold mode."
stopresell-noPermission: "You don't have permission to set your region back to sold mode."
stopresell-noPermissionOther: "You don't have permission to set regions back to sold mode."
addfriend-help: "/as addfriend <player> [region], the region you stand in will be used if not specified."
addfriend-noPermissionOther: "You don't have permission to add friends to regions that are not yours."
addfriend-noPermission: "You don't have permission to add friends to your region."
addfriend-successOther: "%lang:tPlayer|%0%|% has been added as friend to region %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% has been added as friend to your region %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% is already added as friend to %lang:region%."
addfriend-self: "Adding the owner of the region as friend would be pointless."
addfriend-noOwner: "You cannot add friends to a region without owner."
addfriend-notVisited: "You cannot add %0% because he did not visit the server yet."
delfriend-help: "/as delfriend <player> [region], the region you stand in will be used if not specified."
delfriend-noPermissionOther: "You don't have permission to delete friends from regions that are not yours."
delfriend-noPermission: "You don't have permission to delete friends from your region."
delfriend-successOther: "%lang:tPlayer|%0%|% has been deleted as friend from region %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% has been deleted as friend from your region %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% is not added as friend to %lang:region%."
delfriend-noOwner: "You cannot remove friends from a region without owner."
linksigns-multipleRegions: "Found multiple regions: [gray]%0%."
linksigns-multipleRegionsAdvice: "Click another time to try again or use '/as linksigns' to stop."
linksigns-noRegions: "No AreaShop regions found in the direction of your cursor, make sure the region is added to AreaShop [gray](maximum range 100 blocks)."
linksigns-regionFound: "Region %lang:region% has been found, now point to a sign and leftclick to link it."
linksigns-signFound: "Found a sign at (%0%, %1%, %2%), now point towards a region and rightclick to link it"
linksigns-noSign: "No sign found in the direction of your cursor, make sure you have a direct sight to a sign and click again [gray](maximum range 100 blocks)."
linksigns-alreadyRegistered: "That sign is already registered for region %lang:region%, click again to select another sign."
linksigns-first: "You have entered sign linking mode."
linksigns-next: "[gray]Leftclick to select a sign, rightclick to select a region, use /as linksigns to stop."
linksigns-noPermission: "You don't have permission to enter bulk sign linking mode."
linksigns-stopped: "Exited sign linking mode."
stack-help:
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Number of regions that will be created.[break]"
- " [gray]<gap> Blocks distance between the regions.[break]"
- " [gray]<name> Name of the regions (number will be behind it).[break]"
- " [gray]<rent|buy> Make then rent or buy regions.[break]"
- " [gray][group] A group to add the created regions to.[break]"
- " [gray]The regions will be created in the direction you are facing."
stack-accepted: "Starting to create %0% %1% regions with %2% blocks in between, names start with %3% and have a number behind them.%4%"
stack-addToGroup: " Created regions will be added to the group '%0%'."
stack-noPermission: "You don't have permission to create and add regions to AreaShop in bulk."
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]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."
setlandlord-success: "%lang:landlord% has successfully been set as landlord of %lang:region%."
message-help: "/as message <player> <message...>"
message-noPermission: "You do not have permission to send AreaShop messages."
message-notOnline: "%0% is not online."
import-help: "/as import RegionForSale"
import-wrongSource: "Specify from where you want to import data, options: RegionForSale."
import-noPluginFolder: "Could not find the %0% folder, are you sure you are importing from the correct source?"
import-noWorldsFolder: "There is no 'plugins/RegionForSale/worlds' folder, therefore nothing could be imported."
import-confirm: "Are you sure you want to import all regions from RegionForSale?"
import-start: "Starting import of RegionForSale data:"
import-doWorld: "[darkgreen][bold]► World %0%:"
import-noBukkitWorld: "[red]Could not find world in Bukkit."
import-noRegionManager: "[red]Could not get RegionManager from WorldGuard, are regions enabled in this world?"
import-noRegions: "[red]No regions.yml file found."
import-loadRegionsFailed: "[red]Could not load regions.yml at: %0%"
import-invalidRegionSection: "[red]Invalid section in regions.yml: %0%."
import-noWorldGuardRegion: "[red]WorldGuard region not found: %0%."
import-noWorldGuardRegionParent: "[red]WorldGuard region for parent region not found: %0%."
import-buyAndRent: "[gold]%0% can be bought and rented, only adding as buy in AreaShop (cannot be both)."
import-noBuyAndNoRent: "[red]%0% cannot be bought and cannot be rented, skipping import."
import-imported: "[green]%lang:tRegion|%0%|% imported."
import-loadWorldConfigFailed: "[red]Loading world-specific config.yml failed: %0%."
import-improperParentRegion: "[red]Parent region %0% does not have readable settings."
import-alreadyAdded: "[red]Region '%0%' has already been added."
import-alreadyAddedOtherWorld: "[red]Region '%0%' has already been added in world %1%, regions in different worlds cannot have the same name in AreaShop."
import-invalidSignLocation: "[red]Failed to import a sign of region '%0%', invalid location: '%1%'."
import-signAlreadyAdded: "[red]Skipped adding sign at location '%1%' to region '%0%', it is already added to region '%2%'."
import-moneyBackFailed: "[red]Failed to parse buy price '%0%' and sell price '%1%' to set the money back percentage."
confirm-rent:
- "%lang:prefix%Are you sure you want to rent %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to rent %0%|%"
- " hover: %lang:action|Rent %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Are you sure you want to extend %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to extend %0%|%"
- " hover: %lang:action|Extend %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Are you sure you want to stop renting %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to stop renting %0%|%"
- " hover: %lang:action|Stop renting %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Are you sure you want to buy %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Are you sure you want to sell %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% years"
timeleft-months: "%0% months"
timeleft-days: "%0% days"
timeleft-hours: "%0% hours"
timeleft-minutes: "%0% minutes"
timeleft-second: "%0% second"
timeleft-seconds: "%0% seconds"
timeleft-ended: "Expired"
greeting-forrent: "%region% can be rented for %price% per %duration%."
greeting-rented: "%region% is rented by %player% until %until%."
greeting-forsale: "%region% can be bought for %price%."
greeting-bought: "%region% is bought by %player%."
greeting-resale: "%region% can be bought for %resellprice% from %player%."
update-playerNotify:
- "[darkgreen]Update from AreaShop V%0% to AreaShop V%1% available, get the latest version at "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Go to the Spigot AreaShop page|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (and leave a review)."
+555
View File
@@ -0,0 +1,555 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Spanish language file, plugin version 2.5.0, 424/428 messages are translated (99%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Use %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Use %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region information|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Player %0%"
- " hover: %lang:action|Regions of %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Landlord %landlord%"
- " hover: %lang:action|Regions of %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "No puedes alquilar o comprar %0% region(es) en total (ya tienes %1% en el grupo '%2%')."
"confirm-yes": " [gray]Haz click en %lang:command|Confirm||%[gray], o reenvía el comando."
"general-notReady": "AreaShop no se ha cargado todavía. Espera un poco."
"general-noWorld": "No puedes hacer esto, el mundo de la región %lang:region% no está disponible (mundo '%world%')."
"general-noRegion": "No puedes hacer esto, la región de WorldGuard no está disponible (region %lang:region%)."
"general-noEconomy": "No hemos detectado un plugin de Economía o no está bien configurado. Habla con un staff para solucionar esto."
"general-cancelled": "%0%"
"cmd-notValid": "Este comando no es válido, usa '/as help' para mas informacion."
"cmd-onlyByPlayer": "Este comando solo puede ser ejecutado por un jugador."
"cmd-weOnlyByPlayer": "Se puede usar la selección de WorldEdit, especifica un nombre de región como argumento extra."
"cmd-noSelection": "No has hecho una selección de WorldEdit."
"cmd-noRegionsFound": "La región en la que te encuentras no está registrada en AreaShop."
"cmd-noWERegionsFound": "No se han encontrado regiones en medio de tu selección de WorldEdit."
"cmd-notRegistered": "La region '%0%' no está disponible en AreaShop."
"cmd-noRegion": "'%0%' no es una región de WorldGuard válida."
"cmd-noRegionsAtLocation": "No se han encontrado regiones en tu localización, especifica el nombre como un argumento extra."
"cmd-moreRegionsAtLocation": "Se han encontrado varias regiones en tu localización, especifica el nombre como argumento extra."
"cmd-automaticRegionOnlyByPlayer": "Solo se permite determinar regiones a los jugadores, especifica la región como argumento extra."
"help-header": "Página de Ayuda - Comandos que puedes ejecutar."
"help-noPermission": "No tienes permiso para ver la página de ayuda."
"help-alias": "Alias de comandos: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Muestra esta página de ayuda."
"help-info": "%lang:helpCommand|/as info|% Ver la información de las regiones."
"help-rent": "%lang:helpCommand|/as rent|% Alquilar una región o extender su alquiler."
"help-buy": "%lang:helpCommand|/as buy|% Comprar una región."
"help-unrent": "%lang:helpCommand|/as unrent|% Desalquilar una región."
"help-sell": "%lang:helpCommand|/as sell|% Vender una región."
"help-reload": "%lang:helpCommand|/as reload|% Recargar los archivos y actualizar las regiones."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Configurar el reseteo en on/off y elegir el perfil."
"help-setprice": "%lang:helpCommand|/as setprice|% Cambiar el precio de una región."
"help-setduration": "%lang:helpCommand|/as setduration|% Cambiar el tiempo de alquiler de una región."
"help-teleport": "%lang:helpCommand|/as tp|% Teletransportarse a una región de venta/alquiler."
"help-setteleport": "%lang:helpCommand|/as settp|% Configurar el punto de teletransporte de una región."
"help-find": "%lang:helpCommand|/as find|% Encontrar una región en venta o alquiler."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Agregar una región a un grupo."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Borrar una región de un grupo."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Ver todos los grupos registrados."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Mostrar información sobre un grupo."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Ejecutar un evento de schematic para la región."
"help-add": "%lang:helpCommand|/as add|% Registrar una región como compra/alquiler."
"help-del": "%lang:helpCommand|/as del|% Borrar una región de AreaShop."
"help-addsign": "%lang:helpCommand|/as addsign|% Agregar un cartel a una región."
"help-delsign": "%lang:helpCommand|/as delsign|% Borrar el cartel que estás mirando."
"help-me": "%lang:helpCommand|/as me|% Ver las regiones que posees (+expiración)."
"help-setowner": "%lang:helpCommand|/as setowner|% Configurar el propietario de la región o extender su alquiler."
"help-resell": "%lang:helpCommand|/as resell|% Configurar una región en el modo reventa."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Configurar una región como vendida."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Agregar un amigo a la región."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Borrar a un amigo de la región."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Empezar el enlace de carteles - regiones."
"help-stack": "%lang:helpCommand|/as stack|% Crear regiones múltiples y agregarlas."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Configurar el propietario de una región."
"help-import": "%lang:helpCommand|/as import|% Importar región desde RegionForSale."
"rent-help": "/as rent [region], la región en la que estás será usada si no se especifican nombres."
"rent-noPermission": "No tienes permiso para alquilar una región."
"rent-maximum": "No puedes alquilar más de %0% region(es) (ya tienes %1% en el grupo '%2%')."
"rent-maximumExtend": "No puedes extender el alquiler porque tienes más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
"rent-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
"rent-rented": "Has alquilado la región %lang:region% hasta %until%, puedes extender el alquiler haciendo click derecho en el cartel o usando /as rent."
"rent-extended": "El alquiler de la región %lang:region% se ha extendido hasta %until%."
"rent-extendedToMax": "Has extendido el alquiler de %lang:region% hasta %until% (Tiempo de alquiler máximo de %maxrenttime%)."
"rent-lowMoneyExtend": "No tienes dinero suficiente para extender el alquiler (tienes %0% y necesitas %price%)."
"rent-lowMoneyRent": "No tienes dinero suficiente para alquilar la región %lang:region% (tienes %0% y necesitas %price%)."
"rent-someoneElse": "Otra persona ha alquilado antes la región %lang:region%."
"rent-notRentable": "Esta región no está disponible para alquilar."
"rent-maxExtends": "No puedes extender más el alquiler (el máximo de veces es %maxextends%), pero cuando acabe el alquiler podrás alquilar la región de nuevo."
"rent-maxRentTime": "No puedes alquilar la región %lang:region% más tiempo por adelantado, el tiempo máximo es de %maxrenttime% y ya la has alquilado por %timeleft%."
"rent-restrictedToWorld": "Necesitas estar en el mundo '%world%' para alquilar la región %lang:region% (estás en '%0%')."
"rent-restrictedToRegion": "Tienes que estar dentro de %lang:region% para alquilarla."
"rent-expireWarning": "Tu región %lang:region% está a punto de caducar (%timeleft% restantes), extiéndela si quieres seguir usándola."
"rent-expiringSoon": "Tu región %lang:tRegion|%0%|% está a punto de caducar (%1% restantes), extiéndela si quieres seguir usándola."
"rent-alreadyAtFull": "%lang:region% ha alcanzado su tiempo máximo de alquiler. Espera hasta que puedas alquilar más veces."
"buy-help": "/as buy [region], la región en la que estás será usada si no se especifican nombres."
"buy-noPermission": "No tienes permiso para comprar una región."
"buy-noPermissionResell": "No tienes permiso para comprar una región en modo reventa."
"buy-noPermissionNoResell": "No tienes permiso para comprar una región que no esté en modo reventa."
"buy-notBuyable": "La región %lang:region% no se puede comprar."
"buy-maximum": "No puedes comprar más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
"buy-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
"buy-succes": "Has comprado la región %lang:region%."
"buy-successResale": "Has comprado la región %lang:region%, provinente de %lang:tPlayer|%0%|%."
"buy-successSeller": "Tu región %lang:region% se ha vendido a %lang:player% por %0%."
"buy-lowMoney": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %price%)."
"buy-lowMoneyResell": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %resellprice%)."
"buy-yours": "Ya eres propietario de la %lang:region%."
"buy-someoneElse": "Alguien más ha comprado la %lang:region%."
"buy-restrictedToWorld": "Necesitas estar en el mundo '%world%' para comprar la región %lang:region% (estas en '%0%')."
"buy-restrictedToRegion": "Tienes que estar dentro de %lang:region% para comprarla."
"unrent-help": "/as unrent [region], la región en la que estás será usada si no se especifican nombres."
"unrent-noPermission": "No tienes permiso para desalquilar una región."
"unrent-noPermissionOther": "No tienes permiso para desalquilar una región ajena."
"unrent-notRegistered": "La región no se puede desalquilar porque no está registrada en el modo Alquiler."
"unrent-notRented": "La región no se puede desalquilar porque no está alquilada."
"unrent-unrented": "%lang:region%, de %lang:player%, ha sido desalquilada."
"unrent-expired": "El alquiler de tu región %lang:region% ha expirado."
"sell-help": "/as sell [region], la región en la que estás será usada si no se especifican nombres."
"sell-notRegistered": "La región no se puede vender porque no está registrada para comprar."
"sell-notBought": "La región no se puede vender porque no tiene propietario."
"sell-sold": "La región %lang:region%, de %lang:player%, ha sido vendida."
"sell-noPermission": "No tienes permiso para vender regiones."
"sell-noPermissionOther": "No tienes permiso para vender regiones ajenas."
"reload-reloading": "Todos los archivos han sido recargados, comprobando alquileres y actualizando regiones..."
"reload-noPermission": "No tienes permiso para recargar los archivos de configuración."
"reload-updateCommandChanged": "Los comandos '/as updaterents' y '/as updatebuys' han sido borrados, '/as reload' actualizará las regiones. Puedes usar este comando en vez de los 2 primeros."
"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]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "No tienes permiso para ver información sobre las regiones."
"info-allHeader": "Todas las regiones%0%:"
"info-rentedHeader": "Regiones alquiladas%0%:"
"info-forrentHeader": "Regiones en alquiler%0%:"
"info-forsaleHeader": "Regiones en venta%0%:"
"info-soldHeader": "Regiones vendidas%0%:"
"info-resellingHeader": "Regiones de reventa%0%:"
"info-nogroupHeader": "Regiones sin grupo%0%:"
"info-limitedToGroup": " (limitado al grupo %0%)"
"info-nogroupNone": "No hay regiones sin grupo."
"info-noFiltergroup": "El grupo '%0%' no existe, y por lo tanto no puede ser usado para limitar los resultados."
"info-noRegions": "No se han encontrado regiones."
"info-wrongPage": "%0% no es un número de página correcto."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]En alquiler por %price% durante %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Alquilada a %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]En venta por %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player% (reventa)."
"info-pageStatus": "[gold]Pagina %0%/%1%"
"info-pagePrevious":
- " [gold][bold]◄Anterior[/bold] "
- " hover: %lang:action|Mostrar la página anterior|%"
- " command: %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Anterior[/bold] "
- " hover: Esta es la primera página"
"info-pageNext":
- " [gold][bold]Siguiente►[/bold]"
- " hover: %lang:action|Mostrar la página siguiente|%"
- " command: %0%"
"info-pageNoNext":
- " [darkgray][bold]Next►[/bold]"
- " hover: Esta es la última pagina"
"info-playerHelp": "/as info player <nombre>."
"info-playerRents": "Regiones alquiladas por %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% no ha alquilado una región."
"info-playerBuys": "Regiones compradas por %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% no ha comprado una región."
"info-regionHelp": "/as info region [name], la región donde estás será utilizada si no se especifican nombres."
"info-regionHeaderRent": "[darkgreen]Información sobre %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Información sobre %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Alquilada por %lang:player% hasta: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Comprada por %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Comprada por %lang:player%, actualvente en reventa."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Extender por[/bold]"
- " hover: Extender el alquiler de %region%"
- " hover: con %duration% por %price%"
- " hover: %lang:action|Extender el alquiler de %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% por %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Alquilar por[/bold]"
- " hover: Alquilar %region% por %price% durante %duration%"
- " hover: %lang:action|Alquilar %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% por %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Comprar por[/bold]"
- " hover: Comprar %region% por %price%"
- " hover: %lang:action|Comprar %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Precio de reventa: [gray]%resellprice% (puedes comprarla de %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Jugadores agregados: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Borrar a %0% como amigo|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Paga de venta: [gray]%moneyback% (%moneybackpercent%% del precio)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Paga de venta[/bold]"
- " hover: Vender %region% y recuperar %moneyback%"
- " hover: %lang:action|Vender %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% del precio)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Paga por desalquilar: [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Paga por desalquilar[/bold]"
- " hover: Desalquilar %region% y recuperar %moneyback%"
- " hover: %lang:action|Desalquilar %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Numero de extensiones máximas: [gray]%maxextends% veces."
"info-regionNoExtending": "[darkgreen][bold]►[reset] No se puede extender el alquiler."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensiones restantes: [gray]%extendsleft% veces de %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Alquiler por adelantado: [gray]%maxrenttime% como máximo."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Ir a la region[/bold]"
- " hover: %lang:action|Teletransportarse a %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Configurar un punto de teletransporte[/bold]"
- " hover: %region%"
- " hover: %lang:action|Configurar un punto de teletransporte|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Carteles conectados: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Grupos asignados: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Desalquiler automático después de: [gray]%inactivetime% de inactividad por parte del jugador."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Venta automática después de: [gray]%inactivetime% de inactividad por parte del jugador."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para alquilarla."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para alquilar la %lang:region%."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para comprarla."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para comprar %lang:region%."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Restauración Activada [gray](la región se vaciará al desalquilarla)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Restauración Alquilada [gray](la región se vaciará al venderla)."
"info-regionLandlord": "[darkgreen][bold]►[reset] Propietario de la región: [gray]%lang:landlord% (recibe el dinero)."
"info-regionNotExisting": "La región especificada no está registrada: %0%."
"setrestore-help": "/as setrestore <región> <true|false|general> [perfil]."
"setrestore-noPermission": "No tienes permiso para cambiar la configuración de restauración."
"setrestore-notRegistered": "La región especificada no está registrada: %0%."
"setrestore-invalidSetting": "'%0%' no es un estado válido. Debe ser true, false o general."
"setrestore-success": "Se ha configurado la opción de restauración de %lang:region% a '%0%'."
"setrestore-successProfile": "Se ha configurado la opción de restauración de %lang:region% a '%0%' y el perfil a '%1%'."
"setprice-noPermission": "No tienes permiso para cambiar el precio de una región."
"setprice-help": "/as setprice <precio> [región], la región en la que estás será utilizada si no se especifican nombres."
"setprice-notRegistered": "La región especificada no está registrada: %0%."
"setprice-wrongPrice": "'%0%' no es un precio válido."
"setprice-successRent": "El precio de la región %lang:region% se ha cambiado a %price% por %duration%."
"setprice-successBuy": "El precio de la región %lang:region% se ha cambiado a %price%."
"setprice-successRemoved": "El precio de la región %lang:region% ha sido borrado, ahora se utilizará el precio por defecto. Nuevo Precio: %price%."
"setprice-noLandlord": "No puedes cambiar el precio de la región %lang:region% porque no eres su propietario."
"setduration-noPermission": "No tienes permiso para editar la duración de un alquiler."
"setduration-help": "/as setduration <cantidad> <identificador> [región], la región en la que estás será utilizada si no se especifican nombres."
"setduration-notRegistered": "%0% no está registrada para alquilar."
"setduration-wrongAmount": "'%0%' no es una cantidad válida, especifica un número entero."
"setduration-wrongFormat": "'%0%' no es un formato de tiempo válido, comprueba la documentación en Bukkit."
"setduration-success": "La duración de la región %lang:region% se ha cambiado a '%duration%'."
"setduration-noLandlord": "No tienes permiso para cambiar la duración porque no eres propietario de la región %lang:region%."
"setduration-successRemoved": "La duración de la %lang:region% ha sido borrada, ahora se utilizará la duración por defecto. Nueva Duración: %duration%."
"setup-noRegion": "No has especificado una región en la segunda línea."
"setup-alreadyRentSign": "La región que has especificado ya está registrada en AreaShop como región de Alquiler, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
"setup-alreadyBuySign": "La región que has especificado ya está registrada en AreaShop como región de Compra, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
"setup-noDuration": "No has especificado cuánto tiempo puede ser alquilada la región, haz esto en la tercera línea."
"setup-wrongDuration": "El tiempo especificado no está en el formato correcto, ejemplo: 1 día."
"setup-noPrice": "No has especificado el precio en la cuarta línea."
"setup-wrongPrice": "No has especificado el precio correctamente, hazlo usando números solamente."
"setup-rentSuccess": "El alquiler de la región %lang:region% se ha configurado correctamente."
"setup-buySuccess": "La venta de la región %lang:region% se ha configurado correctamente."
"setup-noPermissionRent": "No tienes permiso para crear regiones de alquiler."
"setup-noPermissionBuy": "No tienes permiso para crear regiones de venta."
"setup-couldNotDetect": "Se han encontrado regiones con la misma prioridad o con relación principal/secundaria, especifica una en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% está en la lista negra y no puede usarse en AreaShop."
"setup-noPermission": "No puedes agregar la región '%0%', no eres un propietario/miembro o no tienes permiso para esto."
"destroy-noPermissionRent": "No tienes permiso para eliminar el registro de una región de Alquiler."
"destroy-noPermissionBuy": "No tienes permiso para eliminar el registro de una región de Compra."
"destroy-successRent": "La region %lang:region% ha sido eliminada como región de Alquiler."
"destroy-successBuy": "La region %lang:region% ha sido eliminada como región de Compra."
"teleport-help": "/as tp <region> [cartel]."
"teleport-noRentOrBuy": "La región especificada no está registrada: %0%."
"teleport-noPermission": "No tienes permiso para teletransportarte a tu región."
"teleport-noPermissionOther": "No tienes permiso para teletransportarte a regiones que no te pertenecen."
"teleport-noPermissionSign": "No tienes permiso para teletransportarte al cartel de tu región."
"teleport-noPermissionOtherSign": "No tienes permiso para teletransportarte al cartel de regiones que no te pertenecen."
"teleport-noPermissionFriend": "No tienes permiso para teletransportarte a regiones a las que estas agregado como amigo."
"teleport-noPermissionFriendSign": "No tienes permiso para teletransportarte a los carteles de las regiones a las que estas agregado como amigo."
"teleport-noPermissionAvailable": "No tienes permiso para teletransportarte a las regiones disponibles."
"teleport-noPermissionAvailableSign": "No tienes permiso para teletransportarte a los carteles de las regiones disponibles."
"teleport-success": "Te has teletransportado a %lang:region%."
"teleport-successSign": "Te has teletransportado al cartel de %lang:region%."
"teleport-noSafe": "No se han encontrado posiciones seguras en %lang:region%, no quedan puntos en la región o se han excedido los intentos (%0%/%1%)."
"teleport-blocked": "No puedes teletransportarte porque la posición del teletransporte esta dentro de la región, y no tienes permiso para entrar en ella."
"teleport-changedToSign": "Tienes permiso para teletransportarte al cartel, pero no a la region. Teletransportando al cartel..."
"teleport-changedToNoSign": "No hay cartel al que puedas teletransportarte. Intentando teletransportarse dentro..."
"teleport-wrongWorld": "Necesitas estar en el mundo '%world%' para aparecer en %lang:region%, porque estas en el mundo '%0%'."
"setteleport-help": "/as settp [region] [reset], la región en la que estás será utilizada si no se especifican nombres."
"setteleport-noPermission": "No tienes permiso para configurar el punto de teletransporte."
"setteleport-noPermissionOther": "No tienes permiso para configurar el punto de teletransporte de regiones que no te pertenecen."
"setteleport-noRentOrBuy": "La region %0% no está registrada."
"setteleport-success": "El punto de teletransporte de %lang:region% ha sido configurado."
"setteleport-notInside": "La localización tiene que estar dentro de la region."
"setteleport-reset": "El punto de teletransporte de %lang:region% ha sido reseteado."
"find-help": "/as find <buy|rent> [preciomaximo] [grupo]."
"find-noPermission": "No tienes permiso para buscar regiones o teletransportarte a ellas."
"find-success": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
"find-successMax": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo de %1%%2%."
"find-wrongMaxPrice": "El precio máximo especificado no es un nímero válido: %0%."
"find-wrongGroup": "El grupo %0% no existe."
"find-noneFound": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
"find-noneFoundMax": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo de %1%%2%."
"find-onlyInGroup": ", solo se han buscado regiones en el grupo: %0%."
"groupadd-help": "/as groupadd <group> [region], si no se especifican regiones todas las regiones del WorldEdit serán usadas."
"groupadd-noPermission": "No tienes permiso para agregar regiones a grupos."
"groupadd-success": "La región %lang:region% ha sido agregada al grupo '%0%', este grupo ahora tiene %1% miembro(s)."
"groupadd-failed": "La región %lang:region% ya forma parte del grupo '%0%'."
"groupadd-weSuccess": "Agregada al grupo %0%: [gray]%1%."
"groupadd-weFailed": "Regiones que ya estaban en el grupo %0%: [gray]%1%."
"groupdel-help": "/as groupdel <group> [region], si no se especifican regiones todas las regiones del WorldEdit seran usadas"
"groupdel-noPermission": "No tienes permiso para eliminar regiones de los grupos."
"groupdel-wrongGroup": "No se ha encontrado el grupo %0%, comprueba los grupos registrado usando '/as grouplist'."
"groupdel-success": "La región %lang:region% ha sido borrada del grupo '%0%', este grupo ahora tiene %1% miembro(s)."
"groupdel-failed": "La región %lang:region% no forma parte del grupo '%0%'."
"groupdel-weSuccess": "Borradas del grupo %0%: [gray]%1%."
"groupdel-weFailed": "No estaban en el grupo %0: [gray]%1%."
"grouplist-noPermission": "No tienes permiso para mostrar los grupos registrados."
"grouplist-noGroups": "No hya grupos registrados ahora mismo."
"grouplist-success": "Grupos que están registrados: [gray]%0%."
"groupinfo-help": "/as groupinfo <grupo>."
"groupinfo-noPermission": "No tienes permiso para ver la información de los grupos."
"groupinfo-noGroup": "No hay ningún grup grupo llamado '%0%', usa /as grouplist para ver todos los grupos."
"groupinfo-members": "Las siguientes regiones forman parte del grupo %0%: [gray]%1%."
"groupinfo-noMembers": "El grupo %0% no tiene miembros."
"schemevent-help": "/as schemevent <región> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "El evento '%0%' no existe, usa uno de los siguientes: [gray]%1%."
"schemevent-success": "El evento '%0%' ha sido provocado para la región %lang:region%."
"schemevent-noPermission": "No tienes permiso para provocar eventos de schematic."
"add-help": "/as add <rent|buy> [región] [mundo]."
"add-noPermission": "No tienes permiso para agregar una región a AreaShop."
"add-success": "Agregado como %0%: [gray]%1%."
"add-failed": "Ya registrado: [gray]%0%."
"add-blacklisted": "En la lista negra: [gray]%0%."
"add-specifyWorld": "Especifica el mundo de la región (Consola)."
"add-incorrectWorld": "El mundo '%0%' no existe, inténtalo de nuevo (distingue entre mayúsculas y minúsculas)."
"add-noPermissionRegions": "No tienes permiso para agregar: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]No eres miembro/propietario de estas regiones o no tienes permiso para agregar tus regiones."
"del-noPermission": "No tienes permiso para borrar regiones."
"del-success": "Regiones Borradas: [gray]%0%."
"del-failed": "No tienes permiso para borrarlas o no están registradas: [gray]%0%."
"addsign-help": "/as addsign [región] [perfil]."
"addsign-noSign": "No estás mirando el cartel."
"addsign-noRegions": "No se han encontrado regiones alrededor del cartel."
"addSign-notRegistered": "La región especificada no está registrada en AreaShop: %0% (primero ha de agregarse a AreaShop antes de que se pueda agregar un cartel)."
"addsign-couldNotDetect": "Se han encontrado muchas regiones alrededor del cartel (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Se han encontrado muchas regiones alrededor del cartel, especifica la región en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "El perfil especificado no existe, usa uno de los siguientes (comprueba la config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Signprofile %0%"
- " hover: %lang:action|Usar este perfil|%"
- " command: /areashop linksigns %0%"
"addsign-success": "El cartel ha sido agregado a %lang:region%."
"addsign-successProfile": "El cartel ha sido agregado a %lang:region% con el perfil %0%."
"addsign-alreadyRegistered": "Este cartel ya está registrado para la región %lang:region%."
"addsign-noPermission": "No tienes permiso para agregar un cartel."
"delsign-noSign": "No estás mirando al cartel."
"delsign-noPermission": "No tienes permiso para borrar carteles."
"delsign-noRegion": "Este cartel no tiene que ver con ninguna región de AreaShop."
"delsign-success": "El cartel se ha desvinculado de la región %lang:region%."
"me-noPermission": "No tienes permiso para ver tus regiones."
"me-header": "Regiones de %lang:tPlayer|%0%|%:"
"me-notAPlayer": "No eres un jugador, y no puedes tener regiones."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% restante"
- " hover: hasta %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "de %lang:player%"
- " hover: Estás agregado como amigo"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% no ha comprado/alquilado regiones y no está agregado como amigo a ninguna."
"me-noPlayer": "%0% no existe. Comprueba si ha entrado al servidor."
"me-clickHint": "[gray][italic]Haz click en un nombre de región para ver los detalles."
"setowner-help": "/as setowner <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"setowner-noPermission": "No tienes permiso para cambiar el propietario de una región."
"setowner-noPermissionRent": "No tienes permiso para cambiar el propietario de una región de alquiler."
"setowner-noPermissionBuy": "No tienes permiso para cambiar el propietario de una región de compra."
"setowner-notRegistered": "No se puede cambiar el propietario de la región porque la región no existe."
"setowner-noPlayer": "No se pudo encontrar la UUID del jugador: %0%."
"setowner-succesRent": "El propietario de %lang:region% ahora es %lang:player%, y su región está alquilada hasta %until% (%timeleft% restante)."
"setowner-succesRentExtend": "El propietario de la región ya era %lang:player%, su alquiler se ha extendido '%duration%', y ahora caducará: %until% (%timeleft% restante)."
"setowner-succesBuy": "El propietario de la región %lang:region% ahora es %lang:player%."
"resell-help": "/as resell <precio> [región], la región en la que estás se usará si no se especifican nombres."
"resell-wrongPrice": "'%0%' no es un precio válido."
"resell-notRegistered": "La región especificada no es válida: %0%."
"resell-notBought": "No puedes revender %lang:region% porque no está vendida todavía."
"resell-success": "%lang:region% está en modo reventa por %resellprice%."
"resell-noPermission": "No tienes permiso para cambiar tu región a modo reventa."
"resell-noPermissionOther": "No tienes permiso para cambiar las regiones a modo reventa."
"stopresell-help": "/as stopresell [región], la región en la que estás se usará si no se especifican nombres."
"stopresell-notRegistered": "La región especificada no es válida: %0%."
"stopresell-notResell": "No puedes parar la reventa de %lang:region% porque no está en modo reventa."
"stopresell-success": "%lang:region% ahora está vendida."
"stopresell-noPermission": "No tienes permiso para cambiar tu región al modo vendido."
"stopresell-noPermissionOther": "No tienes permiso para cambiar las regiones al modo vendido."
"addfriend-help": "/as addfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"addfriend-noPermissionOther": "No tienes permiso para agregar amigos en regiones que no te pertenecen."
"addfriend-noPermission": "No tienes permiso para agregar amigos a tu región."
"addfriend-successOther": "%lang:tPlayer|%0%|% ha sido agregado como amigo en la región %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% ha sido agregado como amigo en tu región %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% ya está agregado como amigo en la región %lang:region%."
"addfriend-self": "Es inútil agregar al propietario de la región como amigo."
"addfriend-noOwner": "No puedes agregar amigos a regiones sin propietario."
"addfriend-notVisited": "No puedes agregar a %0% a la región porque nunca ha visitado el servidor."
"delfriend-help": "/as delfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"delfriend-noPermissionOther": "No tienes permiso para borrar amigos en regiones que no te pertenecen."
"delfriend-noPermission": "No tienes permiso para borrar amigos en tu región."
"delfriend-successOther": "%lang:tPlayer|%0%|% ha sido borrado como amigo en la región %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% ha sido borrado como amigo en tu región %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% no está agregado como amigo en %lang:region%."
"delfriend-noOwner": "No puedes borrar amigos de regiones sin propietario."
"linksigns-multipleRegions": "Se han encontrado muchas regiones: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Haz lick otra vez para intentarlo de nuevo o usa '/as linksigns' para parar."
"linksigns-noRegions": "No se han encontrado regiones en esa dirección, comprueba que están añadidas a AreaShop [gray](rango máximo 100 bloques)."
"linksigns-regionFound": "Se ha encontrado la región %lang:region%, ahora haz lick izquierdo en un cartel para linkearlo."
"linksigns-signFound": "Se ha encontrado un cartel en (%0%, %1%, %2%), ahora haz click derecho en una región para seleccionarla."
"linksigns-noSign": "No se ha encontrado ningún cartel, inténtalo de nuevo [gray](rango máximo 100 bloques)."
"linksigns-alreadyRegistered": "Este cartel ya está linkeado a la región %lang:region%, haz click otra vez para seleccionar otro cartel."
"linksigns-first": "Has entrado en el modo de linkeo de carteles."
"linksigns-next": "[gray]Click izquierdo para seleccionar un cartel, click derecho para seleccionar una región, /as linksigns para parar."
"linksigns-noPermission": "No tienes permiso para entrar en el modo de linkeo de carteles."
"linksigns-stopped": "Has salido del modo de linkeo de carteles."
"stack-help":
- "/as stack <cantidad> <espacio> <ombre> <rent|buy> [grupo].[break]"
- " [gray]<cantidad> Número de regiones que serán creadas.[break]"
- " [gray]<espacio> Bloques de distancia entre regiones.[break]"
- " [gray]<nombre> Nombre de las regiones (el número estará detrás).[break]"
- " [gray]<rent|buy> Hacer las regiones de compra o alquiler.[break]"
- " [gray][grupo] Un grupo para agregar las regiones.[break]"
- " [gray]Las regiones serán creadas en la dirección en que estás mirando."
"stack-accepted": "Empezando a crear %0% %1% regiones con %2% bloques en medio, los nombres empiezan con %3% y tienen un número detrás.%4%"
"stack-addToGroup": "Las regiones creadas serán añadidas al grupo '%0%'."
"stack-noPermission": "No tienes permiso para crear y agregar regiones."
"stack-wrongAmount": "'%0%' no es un número correcto de regiones."
"stack-wrongGap": "'%0%' no es un número correcto para el espacio entre las regiones."
"stack-noSelection": "No tienes una selección que indique donde se creará la primera región."
"stack-addStart": "[gray]Agregando %0% regiones a %1% por segundo."
"stack-addComplete": "[gray]Agregadas %0% regiones%1%."
"stack-tooHigh": ", %0% regiones saltadas porque estaban por encima de Y=256"
"stack-tooLow": ", %0% regiones saltadas porque estaban por debajo de Y=0"
"stack-unclearDirection": "Mira hacia todas las direcciones, se han detectado: %0%."
"setlandlord-help": "/as setlandlord <jugador> [región], la región en la que estás se usará si no se especifican nombres."
"setlandlord-noPermission": "No tienes permiso para configurar el propietario de una región."
"setlandlord-success": "%lang:landlord% se ha hecho propietario de la región %lang:region%."
"message-help": "/as message <jugador> <mnsaje...>"
"message-noPermission": "No tienes permiso para enviar mensajes de AreaShop."
"message-notOnline": "%0% no está conectado."
"import-help": "/as import RegionForSale"
"import-wrongSource": "Especifica de donde quieres importar los datos, opciones: 'RegionForSale'"
"import-noPluginFolder": "No se pudo encontrar la carpeta %0%, ¿Seguro que lo está importando del lugar correcto?"
"import-noWorldsFolder": "No hay una carpeta 'plugins/RegionForSale/worlds', por lo tanto no se ha importado nada."
"import-confirm": "Estás seguro/a de que quieres importar todas las regiones desde RegionForSale?"
"import-start": "Empezando importanción de datos de RegionForSale:"
"import-doWorld": "[darkgreen][bold]► Mundo %0%:"
"import-noBukkitWorld": "[red]no se pudo encontrar el mundo en Bukkit"
"import-noRegionManager": "[red]No se encontró RegionManager de WorldGuard, Asegurese de que las regiones están activadas en este mundo."
"import-noRegions": "[red]No se encontró regions.yml"
"import-loadRegionsFailed": "[red]No se pudo cargar regions.yml en: %0%"
"import-invalidRegionSection": "[red]Sección invalida en regions.yml: %0%"
"import-noWorldGuardRegion": "[red]Región de WorldGuard no encontrada: %0%"
"import-noWorldGuardRegionParent": "[red]Región de WorldGuard para la región padre no encontrada: %0%."
"import-buyAndRent": "[gold]%0% puede ser comprada o vendida, solo añadiendo como compra en AreaShop (No puede ser ambos)."
"import-noBuyAndNoRent": "[red]%0% no puede ser comprada o alquilada, omitiendo importe."
"import-imported": "[green]%lang:tRegion|%0%|% importado."
"import-loadWorldConfigFailed": "[red]Carga de config.yml especifica del mundo fallida: %0%"
"import-improperParentRegion": "[red]La region padre %0% no tiene configuraciones legibles."
"import-alreadyAdded": "[red]La región '%0%' ya ha sido añadida"
"import-alreadyAddedOtherWorld": "[red]La región '%0%' ya ha sido añadida al mundo %1%, regiones en diferentes mundos no pueden tener el mismo nombre en AreaShop"
"import-invalidSignLocation": "[red]Fallo al importar un cartel de la región '%0%', ubicación invalida '%1%"
"import-signAlreadyAdded": "[red]Omitido cartel en la ubicación '%1%' a la región '%0%', ya que ya ha sido añadida a la región '%2%"
"import-moneyBackFailed": "[red]Fallo al analizar el precio de compra '%0%' y venta '%1%' para establecer en porcentaje de dinero devuelto"
"confirm-rent":
- "%lang:prefix%Quieres alquilar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Haz click para alquilarla %0%|%"
- " hover: %lang:action|Alquilar %0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Quieres extender el alquiler de la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para extender %0%|%"
- " hover: %lang:action|Extender %0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Quieres dejar de alquilar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para dejar de alquilar %0%|%"
- " hover: %lang:action|Dejar de alquilar %0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Quieres comprar la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click para comprar %0%|%"
- " hover: %lang:action|Comprar %0%|%"
- " command: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Quieres vender la %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% años"
"timeleft-months": "%0% meses"
"timeleft-days": "%0% días"
"timeleft-hours": "%0% horas"
"timeleft-minutes": "%0% minutos"
"timeleft-second": "%0% segundo"
"timeleft-seconds": "%0% segundos"
"timeleft-ended": "Expirado"
"greeting-forrent": "%region% puede ser alquilada por %price% cada %duration%."
"greeting-rented": "%region% está alquilada por %player% hasta %until%."
"greeting-forsale": "%region% puede ser comprada por %price%."
"greeting-bought": "%region% está comprada por %player%."
"greeting-resale": "%region% puede ser comprada por %resaleprice% al jugador %player%."
"update-playerNotify": "[darkgreen]Hay una actualización disponible para AreaShop (V%0% - %1%). Consigue la más reciente en https://github.com/NLthijs48/AreaShop/releases."
+532
View File
@@ -0,0 +1,532 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ French language file, plugin version 2.5.0, 399/428 messages are translated (93%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Utilisez %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Utilisez %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Région %0%"
- " hover: %lang:action|Information sur la région|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Joueur %0%"
- " hover: %lang:action|Régions de %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Bailleur %landlord%"
- " hover: %lang:action|Région de %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Vous ne pouvez pas louer ou acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
"confirm-yes": " [gray]Clique ici %lang:command|Confirm%0% |%[gray], ou refait la commande."
"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 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."
"cmd-onlyByPlayer": "Cette commande ne peut être utilisée que par un joueur."
"cmd-weOnlyByPlayer": "Utiliser une sélection WorldEdit n'est possible qu'en tant que joueur. Spécifiez le nom de la région en argument supplémentaire."
"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 '%0%' n'est pas disponible dans AreaShop."
"cmd-noRegion": "'%0%' n'est pas une région WorldGuard valide."
"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 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 n'avez pas la permission de voir la page d'aide."
"help-alias": "Alias des commandes : /areashop, /as"
"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|% Recharge tous les fichiers et met à jour les régions."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Active/Désactive la restauration et choix du profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Changer le prix d'une région."
"help-setduration": "%lang:helpCommand|/as setduration|% Changer le temps de location d'une région."
"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|% Afficher tout les groupes."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Afficher des informations sur un groupe."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Déclenche un événement schématique d'une région."
"help-add": "%lang:helpCommand|/as add|% Enregistrer une région à la vente ou à la location."
"help-del": "%lang:helpCommand|/as del|% Supprimer une région enregistrée 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 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."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Supprimer un ami de votre région."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Utilisez le mode de liaison de panneau."
"help-stack": "%lang:helpCommand|/as stack|% Créez plusieurs régions et ajoutez les."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Définir le bailleur d'une région"
"help-import": "%lang:helpCommand|/as import|% Importe les régions des régions à vendre."
"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 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 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 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": "La région '%0%' n'est pas disponible à la location (région en vente ou non enregistrée) ."
"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 restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
"rent-expiringSoon": "Votre région %lang:tRegion|%0%|% n'a plus que %1% 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 [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."
"buy-notBuyable": "La région '%0%' n'est pas disponible à l'achat (région en location ou non enregistrée)."
"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 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 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 [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é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 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."
"sell-disabled": "La vente a été désactivé dans cette région."
"reload-reloading": "Fichiers de configurations et des régions rechargés."
"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]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"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%:"
"info-forrentHeader": "Les régions à louer%0%:"
"info-forsaleHeader": "Les régions à vendre%0%:"
"info-soldHeader": "Les régions vendues%0%:"
"info-resellingHeader": "Les régions en revente%0%:"
"info-nogroupHeader": "Les régions sans groupe%0%:"
"info-limitedToGroup": " (limité au groupe %0%)"
"info-nogroupNone": "Il n'y a pas de région sans groupe."
"info-noFiltergroup": "Le groupe '%0%' n'existe pas ou ne peut donc pas être utilisé pour limiter les résultats."
"info-noRegions": "Aucune région trouvée."
"info-wrongPage": "%0% n'est pas un numéro de page correct."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]A louer pour %price% par %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Loué à %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]A vendre pour %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player% (revente)."
"info-pageStatus": "[gold]Page %0%/%1%"
"info-pagePrevious":
- "[gold][bold]◄Précédent[/bold] "
- "hover: %lang:action|Montrer la page précédente |%"
- "command: /areashop %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Précédent[/bold] "
- " hover: C'est déjà la premier page"
"info-pageNoNext":
- " [darkgray][bold]Suivaznt►[/bold]"
- " hover: C'est déjà la dernière page"
"info-playerHelp": "/as info player <name>"
"info-playerRents": "Régions louée par %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% n'a de régions louées."
"info-playerBuys": "Régions achetées par %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoBuys": "%lang:tPlayer|%0%|% n'a pas acheté de régions."
"info-regionHelp": "/as info region [name], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"info-regionHeaderRent": "[darkgreen]Informations à propos de %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informations à propos de %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Louée par %lang:player% jusqu'à: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Achetée par %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Achetée par %lang:player%, actuellement en revente."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Etendre pour[/bold]"
- " hover: Etendre votre location de %region%"
- " hover: pour %duration% coutant %price%"
- " hover: %lang:action|Etendre votre location de %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% pour %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Louer pour[/bold]"
- " hover: Louer %region% pour %price% pour %duration%"
- " hover: %lang:action|Rent %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% pour %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Prix d'achat[/bold]"
- " hover: Acheter%region% pour %price%"
- " hover: %lang:action|Acheter %region%|%"
- " 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] Ami(s) ajouté(s) : [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Région %region%"
- " hover: %lang:action|retirer %0% comme ami|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Prix de revente : [gray]%moneyback% (%moneybackpercent%% du prix)"
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Retour sur investissement de la vente[/bold]"
- " hover: Vendez %region% et recupérer %moneyback% de retour sur investissement"
- " hover: %lang:action|Vendre %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% du prix)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Remboursement de location : [gray]%moneyback% (%moneybackpercent%% du temps restant)"
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Prorata du loyer remboursé[/bold]"
- " hover: Cesser la location %region% et récupérer %moneyback%"
- " hover: %lang:action|Cesser la location%region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% du temps restant)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Nombre maximum de région : [gray]%maxextends% fois."
"info-regionNoExtending": "[darkgreen][bold]►[reset] La location ne peut être allongée."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensions restantes : [gray]%extendsleft% fois sur %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Location à l'avance : [gray]%maxrenttime% au maximum"
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Aller à la région[/bold]"
- " hover: %lang:action|Se téleporter à %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Définir la position de téléportation[/bold]"
- " hover: %region%"
- " hover: %lang:action|Définir la position de téléportation|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Pancartes connectées: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Assigné aux groupes: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Fin de le location automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Revente automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour la louer."
"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 à la vente)%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%."
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]"
"setrestore-noPermission": "Vous n'avez pas la permission de restaurer les paramètres."
"setrestore-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
"setrestore-invalidSetting": "'%0%' est invalide. Doit être true, false ou general."
"setrestore-success": "Paramètre de restauration défini de %lang:region% à '%0%' avec succès."
"setrestore-successProfile": "Paramètre de restauration défini de %lang:region% à %0% et le profil à '%1%' avec succès."
"setprice-noPermission": "Vous n'avez pas la permission de changer le prix d'une région."
"setprice-help": "/as setprice <price> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"setprice-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
"setprice-wrongPrice": "'%0%' n'est pas un prix valide."
"setprice-successRent": "Le prix de la région %lang:region% à changé pour %price% par %duration%."
"setprice-successBuy": "Le prix de la région %lang:region% a changé pour %price%"
"setprice-successRemoved": "Le prix de la %lang:region% a été supprimé, maintenant celle-ci utilisera le prix du group ou du fichier default.yml, nouveau prix: %price%."
"setprice-noLandlord": "Vous n'avez pas la permission de changer le prix car vous n'êtes pas le bailleur de la région %lang:region%."
"setduration-noPermission": "Vous n'avez pas la permission de changer le temps d'une location."
"setduration-help": "/as setduration <amount> <identifier> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne précisez pas quelle région doit être utilisée."
"setduration-notRegistered": "%0% n'est pas enregistrée dans les régions à louer."
"setduration-wrongAmount": "'%0%' n'est pas un montant valide, utilisez un nombre entier."
"setduration-wrongFormat": "'%0%' n'est pas un format de temps valide, regardez la documentation de Bukkit."
"setduration-success": "Durée de location de la région %lang:region% changé à %duration%."
"setduration-noLandlord": "Vous n'avez pas la permission de changer la durée car vous n'êtes pas le bailleur de la région %lang:region%."
"setduration-successRemoved": "La durée de location de %lang:region% a été supprimé, maintenant celle-ci utilisera le durée de location du group ou du fichier default.yml, nouvelle durée de location : %duration%."
"setup-noRegion": "Vous n'avez pas spécifié de région à la seconde ligne."
"setup-alreadyRentSign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région louable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
"setup-alreadyBuySign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région achetable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
"setup-noDuration": "A la troisième ligne, vous n'avez pas spécifié la durée de location de la région."
"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 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%|%)."
"setup-blacklisted": "%0% est sur la blacklist et ne peut pas être ajouté à AreaShop."
"setup-noPermission": "Vous ne pouvez pas ajouter la région '%0%', vous n'êtes pas un propriétaire / membre ou n'avez pas permission pour celle-ci."
"destroy-noPermissionRent": "Vous n'avez pas la permission de dés-enregistrer des régions louables. "
"destroy-noPermissionBuy": "Vous n'avez pas la permission de dés-enregistrer des régions achetables."
"destroy-successRent": "%lang:region% a bien été dés-enregistrée des régions louables."
"destroy-successBuy": "%lang:region% a bien été dés-enregistrée des régions achetables."
"teleport-help": "/as tp <region> [sign]"
"teleport-noRentOrBuy": "La région spécifiée n'est pas enregistrée : %0%."
"teleport-noPermission": "Vous n'avez pas la permission de vous téléporter à votre région."
"teleport-noPermissionOther": "Vous n'avez pas la permission de vous téléporter à une région qui ne vous appartient pas."
"teleport-noPermissionSign": "Vous n'avez pas la permission de vous téléporter à la pancarte de votre région."
"teleport-noPermissionOtherSign": "Vous n'avez pas la permission de vous téléporter aux pancartes des régions que vous ne possédez pas."
"teleport-noPermissionFriend": "Vous n'avez pas la permission de vous téléporter vers les régions sur lesquelles vous êtes ajoutés en tant qu'ami."
"teleport-noPermissionFriendSign": "Vous n'avez pas la permission de vous téléporter vers le panneau des régions sur lesquelles vous êtes ajoutés en tant qu'ami."
"teleport-noPermissionAvailable": "Vous n'avez pas la permission de vous téléporter vers les régions disponibles."
"teleport-noPermissionAvailableSign": "Vous n'avez pas la permission de vous téléporter vers les panneaux des régions disponibles."
"teleport-success": "Vous avez été téléporté vers %lang:region%"
"teleport-successSign": "Vous avez été téléporté vers le panneau de %lang:region%"
"teleport-noSafe": "Aucune position sécurisée trouvée dans la région '%lang:region%'. Pas de point restant, ou tentatives maximales dépassées (%0%/%1%)."
"teleport-blocked": "Vous ne pouvez pas vous téléporter car la position est en dehors de la région, et vous êtes obligés de vous téléporter à l'intérieur."
"teleport-changedToSign": "Vous n'avez seulement la permission de vous téléporter à la pancarte et non dans la région, téléportation vers la pancarte."
"teleport-changedToNoSign": "Aucune pancarte disponible pour être téléporter. Essayer de vous téléporter dans la région."
"teleport-wrongWorld": "Vous avez besoin d'être dans le monde '%world%' pour vous téléporter à la région %lang:region%. Vous êtes dans le monde '%0%'."
"setteleport-help": "/as settp [region] [reset], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"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% 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% 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."
"find-success": "Une région %0% trouvée : %lang:region%, en recherchant avec un prix maximum de: %1%%2%."
"find-successMax": "%0% region trouvé : %lang:region%, tout en recherchant avec un prix maximum de %1%%2%."
"find-wrongMaxPrice": "Le prix maximum n'est pas un nombre valide : %0%."
"find-wrongGroup": "Le groupe spécifié n'existe pas : %0%."
"find-noneFound": "Aucune région %0% trouvée ayant pour un prix maximum : %1%%2%."
"find-noneFoundMax": "Aucune région %0% trouvée en cherchant à un prix maximum de %1%%2%."
"find-onlyInGroup": ", recherche de régions uniquement dans le groupe: %0%."
"groupadd-help": "/as groupadd <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"groupadd-noPermission": "Vous n'avez pas la permission d'ajouter des régions aux groupes."
"groupadd-success": "La région %lang:region% a été ajoutée au groupe '%0%'. Ce groupe a maintenant %1% membre(s)."
"groupadd-failed": "La région %lang:region% est déjà membre du groupe '%0%'."
"groupadd-weSuccess": "Ajouté au groupe %0% : [gray]%1%."
"groupadd-weFailed": "Nous étions déjà dans le groupe %0% : [gray]%1%."
"groupdel-help": "/as groupdel <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
"groupdel-noPermission": "Vous n'avez pas la permission de supprimer des régions depuis les groupes."
"groupdel-wrongGroup": "Le groupe %0% n’existe pas, faire '/as grouplist' pour afficher les groupes enregistrés."
"groupdel-success": "La région %lang:region% a été supprimée du groupe '%0%', ce groupe a maintenant %1% membre(s)."
"groupdel-failed": "La région %lang:region% n'est pas membre du groupe '%0%'."
"groupdel-weSuccess": "Supprimée du groupe %0% : [gray]%1%."
"groupdel-weFailed": "Nous ne sommes de toute façon pas dans le groupe %0% : [gray]%1%."
"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 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."
"groupinfo-noGroup": "Il n'y a pas de groupe enregistré sous le nom '%0%', utilisez /as grouplist pour vérifier les groupes."
"groupinfo-members": "Les régions suivantes sont membres du groupe %0% : [gray]%1%."
"groupinfo-noMembers": "Le groupe %0% ne possède aucun membre."
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
"schemevent-wrongEvent": "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: [gray]%1%."
"schemevent-success": "L’événement '%0%' a été activé dans la région %lang:region%."
"schemevent-noPermission": "Vous n'avez pas la permission de déclencher des événements schématiques."
"add-help": "/as add <rent|buy> [region] [world]"
"add-noPermission": "Vous n'avez pas la permission d'ajouter une région à AreaShop."
"add-success": "Ajoutée comme %0% : [gray]%1%."
"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-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": "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."
"addsign-noRegions": "Aucune région trouvée autour du panneau."
"addsign-couldNotDetect": "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région en argument supplémentaire (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région à la deuxième ligne (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Le profil spécifié n'existe pas, utilisez l'un de la liste suivante (Vérifiez la config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Connexion profil %0%"
- " hover: %lang:action|Utiliser ce profil|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Le panneau a été ajouté à %lang:region%."
"addsign-successProfile": "Le panneau a été ajouté à %lang:region%. avec le profile %0%."
"addsign-alreadyRegistered": "Ce panneau est déjà enregistré pour la région %lang:region%."
"addsign-noPermission": "Vous n'avez pas la permission d'ajouter un panneau."
"delsign-noSign": "Vous ne regardez pas un panneau."
"delsign-noPermission": "Vous n'avez pas la permission de supprimer un panneau."
"delsign-noRegion": "Ce signe n'appartient pas à une région AreaShop."
"delsign-success": "Le panneau à été retiré de la région %lang:region%."
"me-noPermission": "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
"me-header": "Régions de %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% restant"
- "⇥hover: depuis %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "propriétaire: %lang:player%"
- "⇥hover: Vous avez ajouté comme ami"
- ")."
"me-nothing": "%lang:tPlayer|%0%|% n'a pas loué ou acheté de régions et n'a pas été ajouté comme ami dans l'un entre eux."
"me-noPlayer": "%0% n'a pas été trouvé, il ne s'est peut être jamais connecté sur le serveur."
"me-clickHint": "[gray][italic]Cliquez sur le nom d'une région pour voir les détails."
"setowner-help": "/as setowner <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
"setowner-noPermission": "Vous n'avez pas la permission de définir le propriétaire d'une région."
"setowner-noPermissionRent": "Vous n'avez pas la permission de définir le propriétaire de régions à louer."
"setowner-noPermissionBuy": "Vous n'avez pas la permission de définir le propriétaire de régions à acheter."
"setowner-notRegistered": "La région n'est pas enregistrée, le propriétaire ne peut être défini."
"setowner-noPlayer": "UUID du joueur introuvable : %0%."
"setowner-succesRent": "Propriétaire de la région %lang:region% modifié avec succès. Elle appartient maintenant à %lang:player% et est louée jusqu'au %until% (%timeleft% restant)."
"setowner-succesRentExtend": "Le propriétaire était déjà %lang:player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)."
"setowner-succesBuy": "Propriétaire de la région %lang:region% changé avec succès. Elle appartient maintenant à %lang:player%."
"resell-help": "/as resell <prix> <région>, la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
"resell-wrongPrice": "'%0%' n'est pas un prix valide."
"resell-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
"resell-notBought": "Vous ne pouvez pas revendre %lang:region% car elle n'est pas achetée pour le moment."
"resell-success": "%lang:region% a été mise en revente avec succès pour un prix de %resellprice%."
"resell-noPermission": "Vous n'avez pas la permission de mettre votre région en revente."
"resell-noPermissionOther": "Vous n'avez pas la permission de mettre des régions en revente."
"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% 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."
"addfriend-help": "/as addfriend <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
"addfriend-noPermissionOther": "Vous n'avez pas la permission d'ajouter des gens en amis dans une région qui n'est pas la vôtre."
"addfriend-noPermission": "Vous n'avez pas la permission d'ajouter en amis des gens à votre région."
"addfriend-successOther": "%lang:tPlayer|%0%|% a été ajouté comme ami sur la région %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% a été ajouté comme ami sur votre région %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% est déjà ajouté comme ami avec %lang:region%."
"addfriend-self": "Ajouter le propriétaire de la région en ami n'aurait aucune utilité."
"addfriend-noOwner": "Vous ne pouvez pas ajouter d'amis à une région sans propriétaire."
"addfriend-notVisited": "Vous ne pouvez pas ajouter %0% car il n'est jamais venu sur le serveur."
"delfriend-help": "/as delfriend <joueur> [région], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
"delfriend-noPermissionOther": "Vous n'avez pas la permission de supprimer des amis à une région n'étant pas la vôtre."
"delfriend-noPermission": "Vous n'avez pas la permission de supprimer des amis de votre région."
"delfriend-successOther": "%lang:tPlayer|%0%|% a été supprimé comme ami de la région %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% a été supprimé comme ami de votre région %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% n'est pas dans les amis de %lang:region%."
"delfriend-noOwner": "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
"linksigns-multipleRegions": "Plusieurs régions trouvées : [gray]%0%."
"linksigns-multipleRegionsAdvice": "Cliquez plus tard pour réessayer ou utilisez '/as linksigns' pour arrêter."
"linksigns-noRegions": "Aucune région AreaShop trouvée dans la direction de votre curseur, soyez sûr que la région est bien ajoutée à AreaShop [gray](portée maximale de 100 blocs)."
"linksigns-regionFound": "La région %lang:region% a été trouvée, maintenant montrer un panneau et faites un clic gauche sur celui-ci."
"linksigns-signFound": "Un panneau a été trouvé à (%0%, %1%, %2%), maintenant montrez une région et faites un clic droit pour la lier."
"linksigns-noSign": "Aucune panneau trouvé dans la direction de votre curseur, soyez sûr que vous regardez directement la panneau et re-cliquez[gray](portée maximale de 100 blocs)."
"linksigns-alreadyRegistered": "Ce panneau est déjà enregistré avec la région %lang:region%, cliquez encore pour sélectionner un autre panneau."
"linksigns-first": "Vous êtes entré dans le mode de liaison d'un panneau."
"linksigns-next": "[gray]Faites un clic gauche pour sélectionner un panneau, un clic droit pour sélectionner une région et utilisez /as linksigns pour arrêter le mode."
"linksigns-noPermission": "Vous n'avez pas la permission de rentrer dans le mode de liaison d'un panneau."
"linksigns-stopped": "Vous êtes sorti du mode de liaison d'un panneau."
"stack-help":
- "/as stack <montant> <écart> <nom> <rent|buy> [groupe].[break]"
- "⇥[gray<montant> Nombre de régions qui sera créé.[break]"
- "⇥[gray]<écart> Distance en blocs entre les régions.[break]"
- "⇥[gray]<nom> Nom des régions (un nombre sera ajouté à la fin[break]"
- "⇥[gray]<rent|buy> Définir comme location (rent) ou achat (but).[break]"
- "⇥[gray][groupe] Un groupe pour ajouter les régions créées..[break]"
- "⇥[gray]Les régions seront créés dans la direction que vous faites face."
"stack-accepted": "Commence à créer %0% %1% régions avec %2% blocs entre chacune, dont les noms commencent avec %3% et ont un chiffre derrière. %4%"
"stack-addToGroup": "Les régions créées ont été ajoutées au groupe '%0%'."
"stack-noPermission": "Vous n'avez pas la permission de créer et d'ajouter des régions à AreaShop en vrac."
"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 la région %0% %1%."
"stack-tooHigh": ", %0% regions annulées car ils sont au dessus de Y=256"
"stack-tooLow": ", %0% regions annulées car ils sont au dessous de Y=0"
"stack-unclearDirection": "Merci de regarder clairement le Nord, l'Est, le Sud, l'Ouest, le haut ou le bas, 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."
"setlandlord-success": "%lang:landlord% a bien été défini comme bailleur de %lang:region%.."
"message-help": "/as message <joueur> <message...>"
"message-noPermission": "Vous n'avez pas la permission d'envoyer des messages AreaShop."
"message-notOnline": "%0% n'est pas connecté."
"confirm-rent":
- "%lang:prefix%Êtes-vous sur de vouloir louer %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour louer %0%|%"
- " hover: %lang:action|Louer%0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Êtes-vous sur de vouloir prolonger la location %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour prolonger la location%0%|%"
- " hover: %lang:action|Prolonger la location%0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Êtes-vous sur de vouloir arrêter la location %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour arrêter la location%0%|%"
- " hover: %lang:action|Arrêter la location%0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Êtes-vous sur de vouloir acheter %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour acheter %0%|%"
- " hover: %lang:action|Acheter%0%|%"
- " command: /areashop buy%0%"
"confirm-sell":
- "%lang:prefix%Êtes-vous sur de vouloir vendre %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour vendre %0%|%"
- " hover: %lang:action|Vendre%0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% années"
"timeleft-months": "%0% mois"
"timeleft-days": "%0% jours"
"timeleft-hours": "%0% heures"
"timeleft-minutes": "%0% minutes"
"timeleft-second": "%0% seconde"
"timeleft-seconds": "%0% secondes"
"timeleft-ended": "Expirée"
"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": "%region% peut être acheté pour %resellprice%. Offre par %player%."
"update-playerNotify":
- "[darkgreen]Mise à jours de AreaShop V%0% à AreaShop V%1% disponible, récupérez la nouvelle version sur "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Aller à la page Spigot de AreaShop|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- "(et laissez un avis)."
+564
View File
@@ -0,0 +1,564 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Dutch language file, plugin version 2.5.0, 428/428 messages are 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Gebruik %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Gebruik %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Gebied %0%"
- " hover: %lang:action|Gebied informatie|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Speler %0%"
- " hover: %lang:action|Gebieden van %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Landeigenaar %landlord%"
- " hover: %lang:action|Gebieden van %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Je kunt niet meer dan %0% gebied(en) kopen en huren in totaal (je hebt er al %1% in groep '%2%')."
"confirm-yes": " [gray]Klik om te %lang:command|bevestigen|%0%|%[gray], of herhaal het commando."
"general-notReady": "AreaShop is nog niet volledig geladen, even geduld."
"general-noWorld": "Je kunt deze actie niet uitvoeren, de wereld van %lang:region% is niet beschikbaar (wereld '%0%')."
"general-noRegion": "Je kunt deze actie niet uitvoeren, het WorldGuard gebied is niet beschikbaar (gebied %lang:region%)."
"general-noEconomy": "Er is geen Economy plugin geïnstalleerd of deze is incorrect opgezet, stel de server eigenaar hiervan op de hoogte."
"general-cancelled": "%0%"
"cmd-notValid": "Dat commando is niet geldig , gebruik '/as help' voor informatie."
"cmd-onlyByPlayer": "Dit commando kan alleen door een speler uitgevoert worden."
"cmd-weOnlyByPlayer": "Gebruikmaken van een WorldEdit selectie is alleen mogelijk als speler, geef de naam van het gebied mee als extra argument."
"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": "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."
"help-header": "Help pagina, commando's die jij kunt uitvoeren."
"help-noPermission": "Je hebt geen toestemming om de help pagina te bekijken."
"help-alias": "Commando aliassen: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Laat deze help pagina zien."
"help-info": "%lang:helpCommand|/as info|% Vraag informatie over gebieden op."
"help-rent": "%lang:helpCommand|/as rent|% Huur een gebied of verleng de huur."
"help-buy": "%lang:helpCommand|/as buy|% Koop een gebied."
"help-unrent": "%lang:helpCommand|/as unrent|% Stop de huur van een gebied."
"help-sell": "%lang:helpCommand|/as sell|% Verkoop een gebied."
"help-reload": "%lang:helpCommand|/as reload|% Herlaad bestanden en update gebieden."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Schakel herstellen in/uit en kies het profiel."
"help-setprice": "%lang:helpCommand|/as setprice|% Verander de prijs van een gebied."
"help-setduration": "%lang:helpCommand|/as setduration|% Verander de huurtijd van een region."
"help-teleport": "%lang:helpCommand|/as tp|% Teleporteer naar koop/huur gebieden."
"help-setteleport": "%lang:helpCommand|/as settp|% Stel een teleporteer plek in."
"help-find": "%lang:helpCommand|/as find|% Zoek een leeg huur of koop gebied."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Voeg een gebied toe aan een groep."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Verwijder een gebied uit een groep."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Laat een lijst met groepen zien."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Laat informatie over een groep zien."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Voer een schematic gebeurtenis uit."
"help-add": "%lang:helpCommand|/as add|% Registreer een huur of koop gebied."
"help-del": "%lang:helpCommand|/as del|% Verwijder een geregistreerd gebied."
"help-addsign": "%lang:helpCommand|/as addsign|% Voeg een bordje toe aan een bestaand gebied."
"help-delsign": "%lang:helpCommand|/as delsign|% Verwijder het bord waar je naar kijkt."
"help-me": "%lang:helpCommand|/as me|% Bekijk welke gebieden je hebt (+aflooptijd)."
"help-setowner": "%lang:helpCommand|/as setowner|% Stel gebied eigenaar in of verleng de huur."
"help-resell": "%lang:helpCommand|/as resell|% Zet een gebied in doorverkoop modus."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Stop het herverkopen van een gebied."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Voeg een vriend toe aan een gebied."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Verwijder een vriend van een gebied."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Gebruik massa bord koppelen mode."
"help-stack": "%lang:helpCommand|/as stack|% Creer meerdere gebieden en voeg ze toe."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Creer meerdere gebieden en voeg ze toe."
"help-import": "%lang:helpCommand|/as import|% Importeer gebieden van RegionForSale."
"rent-help": "/as rent [region], het gebied waarin je staat zal worden gebruikt als je het niet aangeeft."
"rent-noPermission": "Je hebt geen toestemming om een gebied te huren."
"rent-maximum": "Je kunt niet meer dan %0% gebied(en) huren (je hebt er al %1% in groep '%2%')."
"rent-maximumExtend": "Je kunt dit gebied niet meer verlengen omdat je meer dan %0% gebied(en) bezit (je hebt er al %1% in groep '%2%')."
"rent-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
"rent-rented": "Je hebt %lang:region% gehuurd tot %until%, je kunt de huur verlengen door het rechtsklikken van het bord of /as rent."
"rent-extended": "Je hebt de huur van %lang:region% verlengt tot %until%."
"rent-extendedToMax": "Je hebt de huur van %lang:region% verlengt tot %until% (dit is de maximale huurtijd van %maxrenttime%)."
"rent-lowMoneyExtend": "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %price%)."
"rent-lowMoneyRent": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
"rent-someoneElse": "Iemand anders heeft %lang:region% al gehuurd."
"rent-notRentable": "Gebied '%0%' is niet beschikbaar om te huren (niet geregistreerd in AreaShop of een koop gebied)."
"rent-maxExtends": "Je kunt de huur niet meer verlengen (het maximum is %maxextends% keer), je kunt echter wel %lang:region% opnieuw huren als het afgelopen is."
"rent-maxRentTime": "Je kunt %lang:region% niet meer tijd van tevoren huren, de maximum tijd is %maxrenttime% en je hebt het al voor %timeleft% gehuurt."
"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."
"buy-noPermission": "Je hebt geen toestemming om een gebied te kopen."
"buy-noPermissionResell": "Je hebt geen toestemming om een koop gebied in doorverkoop mode te kopen."
"buy-noPermissionNoResell": "Je hebt geen toestemming om een koop gebied die niet in doorverkoop mode staat te kopen."
"buy-notBuyable": "Gebied '%0%' is niet beschikbaar om te kopen (niet geregistreerd in AreaShop of een koop gebied)."
"buy-maximum": "Je kunt niet meer dan %0% gebied(en) kopen (je hebt er al %1% in de groep '%2%')."
"buy-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
"buy-succes": "Je hebt %lang:region% succesvol gekocht."
"buy-successResale": "Je hebt %lang:region% succesvol gekocht van %lang:tPlayer|%0%|%."
"buy-successSeller": "Je gebied %lang:region% is verkocht aan %lang:player% voor %0%."
"buy-lowMoney": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
"buy-lowMoneyResell": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %resellprice%)."
"buy-yours": "Je bent al in bezit van %lang:region%."
"buy-someoneElse": "Iemand anders is al in bezit van %lang:region%."
"buy-restrictedToWorld": "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
"buy-restrictedToRegion": "Je moet in %lang:region% staan om hem te kopen."
"unrent-help": "/as unrent [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"unrent-noPermission": "Je hebt geen toestemming om te stoppen met huren."
"unrent-noPermissionOther": "Je hebt geen toestemming om iemand anders huur te stoppen."
"unrent-notRegistered": "De huur kan niet gestopt worden want het gebied is niet geregistreerd om te huren."
"unrent-notRented": "De huur kan niet gestopt worden want het gebied is niet gehuurd."
"unrent-unrented": "De huur van %lang:region% van %lang:player% is gestopt."
"unrent-expired": "Je huur van %lang:region% is afgelopen."
"sell-help": "/as sell [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"sell-notRegistered": "Het gebied kan niet verkocht worden want het staat niet geregistreerd om te kopen."
"sell-notBought": "Het gebied kan niet verkocht worden want het is niet gekocht."
"sell-sold": "%lang:region% is verkocht voor %lang:player%."
"sell-noPermission": "Je hebt geen toestemming om een gebied te verkopen."
"sell-noPermissionOther": "Je hebt geen toestemming om een gebied van iemand anders te verkopen."
"sell-disabled": "Verkopen is uitgeschakeld voor dit gebied."
"reload-reloading": "Alle configuratie en gebied bestanden zijn herladen."
"reload-noPermission": "Je hebt geen toestemming om configuratiebestanden te herladen."
"reload-updateCommandChanged": "'/as updaterents' en '/as updatebuys' zijn verwijderd, '/as reload' updated nu ook de gebieden, gebruik dus dat commando."
"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]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "Je hebt geen toestemming om informatie over gebieden te bekijken."
"info-allHeader": "Alle gebieden%0%:"
"info-rentedHeader": "Verhuurde gebieden%0%:"
"info-forrentHeader": "Gebieden te huur%0%:"
"info-forsaleHeader": "Gebieden te koop%0%:"
"info-soldHeader": "Verkochte gebieden%0%:"
"info-resellingHeader": "Gebieden aan het doorverkopen%0%:"
"info-nogroupHeader": "Gebieden zonder groep%0%:"
"info-limitedToGroup": "(beperkt tot groep %0%)"
"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%: [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":
- " [gold][bold]◄Vorige[/bold] "
- " hover: %lang:action|Laat de vorige pagina zien|%"
- " command: /areashop %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Vorige[/bold] "
- " hover: Dit is al de eerste pagina"
"info-pageNext":
- " [gold][bold]Volgende►[/bold]"
- " hover: %lang:action|Laat de volgende pagina zien|%"
- " command: /areashop %0%"
"info-pageNoNext":
- " [darkgray][bold]Volgende►[/bold]"
- " hover: Dit is al de laatste pagina"
"info-playerHelp": "/as info player <naam>."
"info-playerRents": "Gebieden gehuurd door %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoRents": "%lang:tPlayer|%0%|% heeft geen gebieden gehuurd."
"info-playerBuys": "Gebieden gekocht door %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% heeft geen gebieden gekocht."
"info-regionHelp": "/as info region <naam>."
"info-regionHeaderRent": "[darkgreen]Informatie over %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informatie over %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Gehuurd door %lang:player% tot: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Gekocht door %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Gekocht door %lang:player%, aan het doorverkopen."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Verleng voor[/bold]"
- " hover: Verleng huur van %region%"
- " hover: met %duration% voor %price%"
- " hover: %lang:action|Verleng de huur van %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Huur voor[/bold]"
- " hover: Huur %region% voor %price% per %duration%"
- " hover: %lang:action|Huur %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Koop voor[/bold]"
- " hover: Koop %region% voor %price%"
- " hover: %lang:action|Koop %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Doorverkoop prijs: [gray]%resellprice% (je kunt het kopen van %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Toegevoegde vrienden: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Gebied %region%"
- " hover: %lang:action|Verwijder %0% as friend|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkoop terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de prijs)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Verkoop terugbetaling[/bold]"
- " hover: Verkoop %region% en krijg %moneyback% terug"
- " hover: %lang:action|Verkoop %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% van de prijs)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Stop met huren terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Stop met huren terugbetaling[/bold]"
- " hover: Stop met huren van %region% en krijg %moneyback% terug"
- " hover: %lang:action|Stop met huren van %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximaal keer verlengen: [gray]%maxextends% keer."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Huur kan niet verlengt worden."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Verlengingen over: [gray]%extendsleft% keer van de %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Huurtijd: [gray]maximaal %maxrenttime%."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Ga naar het gebied[/bold]"
- " hover: %lang:action|Ga naar %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]stel teleporteer locatie in[/bold]"
- " hover: %region%"
- " hover: %lang:action|Stel teleporteer locatie in|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Verbonden borden: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Toegewezen groepen: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische huurstop na: [gray]Inactiviteit van %inactivetime% door de speler."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatische verkoop na: [gray]Inactiviteit van %inactivetime% door de spler."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te huren."
"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)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij verkoop)%0%."
"info-regionLandlord": "[darkgreen][bold]►[reset] Landeigenaar: [gray]%lang:landlord% (krijgt het geld)."
"info-regionNotExisting": "Het aangegeven gebied is niet geregistreerd: %0%."
"setrestore-help": "/as setrestore <gebied> <true|false|general> [profiel]."
"setrestore-noPermission": "Je hebt geen toestemming om de herstel opties te veranderen."
"setrestore-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"setrestore-invalidSetting": "'%0%' is geen geldige staat, gebruik true, false of general."
"setrestore-success": "Herstel optie van %lang:region% succesvol gezet naar '%0%'."
"setrestore-successProfile": "Herstel optie van %lang:region% succesvol gezet naar '%0%' en het profiel naar '%1%'."
"setprice-noPermission": "Je hebt geen toestemming om de prijs van een gebied te veranderen."
"setprice-help": "/as setprice <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"setprice-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"setprice-wrongPrice": "'%0%' is geen geldige prijs."
"setprice-successRent": "Prijs van gebied %lang:region% is veranderd naar %price% per %duration%."
"setprice-successBuy": "De prijs van het gebied %lang:region% is veranderd naar %price%."
"setprice-successRemoved": "Prijs van %lang:region% is verwijderd, hij zal nu de prijs van de groep of default.yml file gebruiken, nieuwe prijs: %price%."
"setprice-noLandlord": "Je hebt geen toestemming om de prijs te veranderen omdat je niet de landeigenaar bent van %lang:region%."
"setduration-noPermission": "Je hebt geen toestemming om de duur van het huur gebied aan te passen."
"setduration-help": "/as setduration <aantal> <identificator> [gebied], het gebied waarin je staat zal worden gebruikt als je niets aangeeft."
"setduration-notRegistered": "%0% is niet geregistreerd voor verhuur."
"setduration-wrongAmount": "'%0%' is geen geldig aantal, gebruik een geheel nummer."
"setduration-wrongFormat": "'%0%' is geen goed tijdsformaat, bekijk de documentatie op Bukkit."
"setduration-success": "Looptijd van gebeid %lang:region% veranderd naar '%duration%'."
"setduration-noLandlord": "Je hebt geen toestemming om de tijdsduur te veranderen omdat je niet de landeigenaar bent van %lang:region%."
"setduration-successRemoved": "Tijdsduur van %lang:region% is verwijderd, hij zal nu de tijdsduur van een group of default.yml gebruiken, nieuwe tijdsduur: %duration%."
"setup-noRegion": "Je hebt geen gebied aangegeven op de tweede regel."
"setup-alreadyRentSign": "Het aangegeven gebied is al toegevoegd als huur gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
"setup-alreadyOtherWorld": "Het aangegeven gebied is al toegevoegd aan AreaShop in een andere wereld, gebieden in verschillende werelden moeten verschillende namen hebben."
"setup-alreadyBuySign": "Het aangegeven gebied is al toegevoegd als koop gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
"setup-noDuration": "Je hebt geen tijdsduur voor het huren aangegeven, zet dit op de derde regel."
"setup-wrongDuration": "De aangegeven tijdsduur is niet in het correcte formaat, voorbeeld: 1 dag."
"setup-noPrice": "Je hebt geen prijs aangegeven op de vierde regel."
"setup-wrongPrice": "Je hebt de prijs niet goed aangegeven, gebruik alleen nummers."
"setup-rentSuccess": "Huren van gebied %lang:region% is goed opgezet."
"setup-buySuccess": "Kopen van gebied %lang:region% is goed opgezet."
"setup-noPermissionRent": "Je hebt geen toestemming om huur gebieden op te zetten."
"setup-noPermissionBuy": "Je hebt geen toestemming om koop gebieden op te zetten."
"setup-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% staat op de blacklist en kan niet toegevoegd worden aan AreaShop."
"setup-noPermission": "Je kunt de region '%0%' niet toevoegen, je bent geen owner/member of hebt geen toestemming."
"destroy-noPermissionRent": "Je hebt geen toestemming om huur gebieden te verwijderen."
"destroy-noPermissionBuy": "Je hebt geen toestemming om koop gebieden te verwijderen."
"destroy-successRent": "%lang:region% succesvol verwijderd als huur gebied."
"destroy-successBuy": "%lang:region% succesvol verwijderd als koop gebied."
"teleport-help": "/as tp <gebied> <aantal> <soort>."
"teleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
"teleport-noPermission": "Je hebt geen toestemming om naar je gebied te teleporteren."
"teleport-noPermissionOther": "Je hebt geen toestemming om te teleporteren naar een gebied dat niet van jou is."
"teleport-noPermissionSign": "Je hebt geen toestemming om naar het bordje van je gebied te teleporteren."
"teleport-noPermissionOtherSign": "Je hebt geen toestemming om naar bordjes te teleporteren van gebieden die niet van jou zijn."
"teleport-noPermissionFriend": "Je hebt geen toestemming om te teleporteren naar gebieden waar je als vriend bent toegevoegd."
"teleport-noPermissionFriendSign": "Je hebt geen toestemming om te teleporteren naar het bord van gebieden waar je als vriend bent toegevoegd."
"teleport-noPermissionAvailable": "Je hebt geen toestemming om naar beschikbare gebieden te teleporteren."
"teleport-noPermissionAvailableSign": "Je hebt geen toestemming om naar het bord van beschikbare gebieden te teleporteren."
"teleport-success": "Je bent geteleporteerd naar %lang:region%."
"teleport-successSign": "Je bent geteleporteerd naar het bord van %lang:region%."
"teleport-noSafe": "Geen veilige plek gevonden in gebied %lang:region%, geen blokken over in het gebied of het maximum aantal pogingen overschreden (%0%%1%)."
"teleport-blocked": "Je kunt niet teleporteren omdat de positie buiten het gebied ligt en je geforceerd word erbinnen te teleporteren."
"teleport-changedToSign": "Je hebt alleen toestemming om te teleporteren naar het bord en niet binnen de region, teleporteren naar het bord."
"teleport-changedToNoSign": "Er is geen bord beschikbaar om naar te teleporteren, proberen om naar het gebied te teleporteren."
"teleport-wrongWorld": "Je moet in wereld '%world%' zijn om te teleporteren naar %lang:region%, maar je bent in wereld '%0%'."
"setteleport-help": "/as settp [gebied] [reset], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"setteleport-noPermission": "Je hebt geen toestemming om de teleporteer lokatie in te stellen."
"setteleport-noPermissionOther": "Je hebt geen toestemming om de teleporteer lokatie in te stellen voor een gebied dat niet van jou is."
"setteleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
"setteleport-success": "Teleporteer lokatie van %lang:region% ingestelt."
"setteleport-notInside": "De lokatie moet zich binnen het gebied bevinden."
"setteleport-reset": "Teleporteer lokatie van %lang:region% is gereset."
"find-help": "/as find <buy|rent> [maxprijs] [groep]."
"find-noPermission": "Je hebt geen toestemming om te zoeken naar gebieden en naar deze te teleporteren."
"find-success": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
"find-successMax": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs van %1%%2%."
"find-wrongMaxPrice": "De aangegeven maximum prijs is geen correct nummer: %0%."
"find-wrongGroup": "De aangegeven groep bestaat niet: %0%."
"find-noneFound": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
"find-noneFoundMax": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs van %1%%2%."
"find-onlyInGroup": ", alleen gebieden gezocht in de groep: %0%."
"groupadd-help": "/as groupadd <groep> [gebied], als er geen gebied is aangegeven dan worden alle gebieden in je WorldEdit selectie gebruikt."
"groupadd-noPermission": "Je hebt geen toestemming om gebieden toe te voegen aan groepen."
"groupadd-success": "Gebied %lang:region% is toegevoegd aan groep '%0%', deze group heeft nu %1% leden."
"groupadd-failed": "Gebied %lang:region% is al toegevoegd aan groep '%0%'."
"groupadd-weSuccess": "Toegevoegd aan groep %0%: [gray]%1%."
"groupadd-weFailed": "Waren al toegevoegd aan groep %0%: [gray]%1%."
"groupdel-help": "/as groupdel <groep> [gebied], als er geen gebied is aangegeven worden alle gebieden in je WorldEdit selectie gebruikt."
"groupdel-noPermission": "Je hebt geen toestemming om gebieden van groepen te verwijderen."
"groupdel-wrongGroup": "Groep %0% niet gevonden, gebruik '/as grouplist' om de lijst van groepen te bekijken."
"groupdel-success": "Gebied %lang:region% is verwijderd van groep '%0%', deze groep heeft nu %1% leden."
"groupdel-failed": "Gebied %lang:region% is geen lid van groep '%0%'."
"groupdel-weSuccess": "Verwijderd van groep %0%: [gray]%1%."
"groupdel-weFailed": "Waren al niet in de groep %0%: [gray]%1%."
"grouplist-noPermission": "Je hebt geen toestemming om de geregistreerde groepen te bekijken."
"grouplist-noGroups": "Er zijn geen groepen aangemaakt."
"grouplist-success": "De volgende groepen zijn geregistreerd: [gray]%0%."
"groupinfo-help": "/as groupinfo <groep>."
"groupinfo-noPermission": "Je hebt geen toestemming voor het bekijken van informatie over een groep."
"groupinfo-noGroup": "Er is geen groep geregistreerd met de naam '%0%', gebruik /as grouplist om de lijst te bekijken."
"groupinfo-members": "De volgende gebieden zijn leden van de groep %0%: [gray]%1%."
"groupinfo-noMembers": "Groep %0% heeft geen leden."
"schemevent-help": "/as schemevent <gebied> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Het aangegeven event '%0%' bestaat niet, gebruik een van de volgende: [gray]%1%."
"schemevent-success": "Event '%0%' succesvol getriggerd voor gebied %lang:region%."
"schemevent-noPermission": "Je hebt geen toestemming om events te triggeren."
"add-help": "/as add <rent|buy> [gebied] [wereld]."
"add-noPermission": "Je hebt geen toestemming om een gebied toe te voegen aan AreaShop."
"add-success": "Toegevoegd als %0%: [gray]%1%."
"add-failed": "Al geregistreerd: [gray]%0%."
"add-failedOtherWorld": "Al geregistreerd in een andere wereld: [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-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."
"del-noPermission": "Je hebt geen toestemming om gebieden te verwijderen."
"del-success": "Verwijderde gebieden: [gray]%0%."
"del-failed": "Geen toestemming om te verwijderen of niet geregistreerd: [gray]%0%."
"addsign-help": "/as addsign [gebied] [profiel]."
"addsign-noSign": "Je kijkt niet naar een bord."
"addsign-noRegions": "Geen gebied gevonden op de lokatie van het bord."
"addSign-notRegistered": "Het aangegeven gebied is niet geregistreerd in AreaShop: %0% (het gebied moet eerst worden toegevoegd aan AreaShop voordat een bord kan worden toegevoegd)."
"addsign-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied mee als extra argument (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Het aangegeven profiel bestaat niet, gebruik een van de volgende (check de config): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Bord profiel %0%"
- " hover: %lang:action|Gebruik dit profiel|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Het bord is toegevoegd aan %lang:region%."
"addsign-successProfile": "Het bord is toegevoegd aan %lang:region% met profiel %0%."
"addsign-alreadyRegistered": "Dat bord is al geregistreerd voor gebied %lang:region%."
"addsign-noPermission": "Je hebt geen toestemming om een bord toe te voegen."
"delsign-noSign": "Je kijkt niet naar een bord."
"delsign-noPermission": "Je hebt geen toestemming om een bord te verwijderen."
"delsign-noRegion": "Dat bord hoort niet bij een AreaShop gebied."
"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]("
- "%timeleft% over"
- " hover: tot %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"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."
"setowner-noPermissionRent": "Je hebt geen toestemming om de eigenaar van huur gebieden in te stellen."
"setowner-noPermissionBuy": "Je hebt geen toestemming om de eigenaar van koop gebieden in te stellen."
"setowner-notRegistered": "Het aangegeven gebied is niet geregistreerd, eigenaar kan niet worden ingesteld."
"setowner-noPlayer": "De UUID van de aangegeven speler kon niet worden gevonden: %0%."
"setowner-succesRent": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%, gehuurt tot %until% (%timeleft% over)."
"setowner-succesRentExtend": "Eigenaar was al %lang:player%, huur verlengt met '%duration%', nu gehuurd tot %until% (%timeleft% over)."
"setowner-succesBuy": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%."
"resell-help": "/as resell <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"resell-wrongPrice": "'%0%' is geen geldige prijs."
"resell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"resell-notBought": "Je kunt %lang:region% niet doorverkopen want dit gebied is nog niet verkocht."
"resell-success": "%lang:region% is succesvol in doorverkoop mode gezet voor %resellprice%."
"resell-noPermission": "Je hebt geen toestemming om je gebied in doorverkoop mode te zetten."
"resell-noPermissionOther": "Je hebt geen toestemming om gebieden in doorverkoop mode te zetten."
"resell-disabled": "Doorverkopen is uitgeschakeld voor dit gebied."
"stopresell-help": "/as stopresell [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
"stopresell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
"stopresell-notResell": "Je kunt niet stoppen met doorverkopen van %lang:region% want hij staat niet in doorverkoop mode."
"stopresell-success": "%lang:region% is succesvol terug gezet in verkocht mode."
"stopresell-noPermission": "Je hebt geen toestemming om je gebied terug te zetten in verkocht mode."
"stopresell-noPermissionOther": "Je hebt geen toestemming om een gebied terug te zetten in verkocht mode."
"addfriend-help": "/as addfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"addfriend-noPermissionOther": "Je hebt geen toestemming om vrienden toe te voegen aan gebieden die niet van jou zijn."
"addfriend-noPermission": "Je hebt geen toestemming om vrienden toe te voegen aan je gebied."
"addfriend-successOther": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij gebied %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij je gebied %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% is al toegevoegd als vriend voor %lang:region%."
"addfriend-self": "Het toevoegen van de eigenaar van het gebied als vriend zou nutteloos zijn."
"addfriend-noOwner": "Je kunt geen vrienden toevoegen aan een gebied zonder eigenaar."
"addfriend-notVisited": "Je kunt %0% niet toevoegen omdat hij de server nog niet heeft bezocht."
"delfriend-help": "/as delfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
"delfriend-noPermissionOther": "Je hebt geen toestemming om vrienden te verwijderen van gebieden die niet van jou zijn."
"delfriend-noPermission": "Je hebt geen toestemming om vrienden te verwijderen van je gebied."
"delfriend-successOther": "%lang:tPlayer|%0%|% is verwijderd als vriend van %lang:region%."
"delfriend-success": "%lang:tPlayer|%0%|% is verwijderd als vriend van je gebied %lang:region%."
"delfriend-notAdded": "%lang:tPlayer|%0%|% is niet toegevoegd als vriend voor %lang:region%."
"delfriend-noOwner": "Je kunt geen vrienden verwijderen van een gebied zonder eigenaar."
"linksigns-multipleRegions": "Meerdere gebieden gevonden: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Klik nog een keer om het opnieuw te proberen of gebruik '/as linksigns' om te stoppen."
"linksigns-noRegions": "Geen AreaShop gebieden gevonden in de richting van je cursor, controleer of het gebied is toegevoegd aan AreaShop [gray](maximaal bereik 100 blokken)."
"linksigns-regionFound": "Gebied %lang:region% is gevonden, wijs nu naar een bord en linksklik om het te koppelen."
"linksigns-signFound": "Bord gevonden op (%0%, %1%, %2%), wijs nu naar een gebied en rechtsklik om het te koppelen."
"linksigns-noSign": "Geen bord gevonden in de richting van je cursor, controleer of je direct zicht hebt op een bord en klik opnieuw [gray](maximaal bereik 100 blokken)."
"linksigns-alreadyRegistered": "Dat bord is al gekoppelt aan gebied %lang:region%, klik opnieuw om een ander bord te selecteren."
"linksigns-first": "Je bent in bord-koppel modus gegaan."
"linksigns-next": "[gray]Linksklik om een bord te selecteren, rechtsklik om een gebied te selecteren, gebruik '/as linksigns' om te stoppen."
"linksigns-noPermission": "Je hebt geen toestemming om massa bord-koppel modus te gebruiken."
"linksigns-stopped": "Je bent gestopt met bord-koppel modus."
"stack-help":
- "/as stack <aantal> <afstand> <naam> <rent|buy> [groep].[break]"
- " [gray]<aantal> Het aantal gebieden dat word gemaakt.[break]"
- " [gray]<afstand> Blokken afstand tussen de gebieden.[break]"
- " [gray]<naam> Naam van de gebieden (komt een nummer achter).[break]"
- " [gray]<rent|buy> Maak ze huur of koop gebieden.[break]"
- " [gray][groep] Groep waaraan de gebieden worden toegevoegd.[break]"
- " [gray]De gebieden zullen worden gemaakt in de richting waarnaar je kijkt."
"stack-accepted": "Begonnen met %0% %1% gebieden maken met %2% blokken ruimte ertussen, namen beginnen met %3% en hebben een nummer erachter.%4%"
"stack-addToGroup": " Gemaakte gebieden zullen worden toegevoegd aan de groep '%0%'."
"stack-noPermission": "Je hebt geen toestemming om in grote aantallen gebieden toe te voegen aan AreaShop."
"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]%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."
"setlandlord-success": "%lang:landlord% is succesvol ingesteld als landeigenaar voor %lang:region%."
"message-help": "/as message <speler> <bericht...>"
"message-noPermission": "Je hebt geen toestemming om AreaShop berichten te sturen."
"message-notOnline": "%0% is niet online."
"import-help": "/as import RegionForSale"
"import-wrongSource": "Geef aan vanaf waar je data wilt importeren, opties: RegionForSale."
"import-noPluginFolder": "Kon de folder %0% niet vinden, weet je zeker dat je de data van de juiste bron importeert?"
"import-noWorldsFolder": "Er is geen 'plugins/RegionForSale/worlds' map, daarom kon niets geïmporteerd worden."
"import-confirm": "Weet je het zeker dat je alle gebieden van RegionForSale wilt importeren?"
"import-start": "Het importeren van de data van RegionForSale begint:"
"import-doWorld": "[darkgreen][bold]► Wereld %0%:"
"import-noBukkitWorld": "[red]Kon de wereld niet in Bukkit vinden."
"import-noRegionManager": "[red] Kon de RegionManager van WorldGuard niet vinden, zijn gebieden aangezet in deze wereld?"
"import-noRegions": "[red]Geen regions.yml bestand gevonden."
"import-loadRegionsFailed": "[red]Kon regions.yml niet laden van: %0%"
"import-invalidRegionSection": "[red]Ongeldige selectie in regions.yml: %0%"
"import-noWorldGuardRegion": "[red]WorldGuard gebied niet gevonden: %0%."
"import-noWorldGuardRegionParent": "[red]WorldGuard gebied voor ouder gebied niet gevonden: %0%."
"import-buyAndRent": "[gold]%0% kan gekocht en gehuurd worden, alleen als kopen aan het toevoegen in AreaShop (kan niet beide zijn)."
"import-noBuyAndNoRent": "[red]%0% kon niet gekocht en gehuurd worden, import overslaan."
"import-imported": "[green]%lang:tRegion%0%l% geïmporteerd."
"import-loadWorldConfigFailed": "[red]Het laden van Wereld-specifieke config.yml is mislukt: %0%."
"import-improperParentRegion": "[red]Ouder gebied %0% heeft geen leesbare instellingen."
"import-alreadyAdded": "[red]Gebied '%0%' is al een keer toegevoegd."
"import-alreadyAddedOtherWorld": "[red]Gebied '%0%' is al een keer toegevoegd in de %1% wereld, gebieden in verschillende werelden kunnen niet dezelfde naam hebben in AreaShop."
"import-invalidSignLocation": "[red]Het importeren van een bordje van gebied '%0%' is mislukt, ongeldige locatie: '%1%'."
"import-signAlreadyAdded": "[red]Het toevoegen van een bordje op locatie '%1%' aan gebied '%0%' is overgeslagen, het is al aan gebied '%2%' toegevoegd."
"import-moneyBackFailed": "[red]Het ontleden van de koop prijs '%0%' en de verkoop prijs '%1%' om het geld terug percentage in te voegen is mislukt."
"confirm-rent":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt huren?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te huren|%"
- " hover: %lang:action|Huur %0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt verlengen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verlengen|%"
- " hover: %lang:action|Verleng %0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt stoppen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Stop de huur van %0%|%"
- " hover: %lang:action|Stop de huur van %0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt kopen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te kopen|%"
- " hover: %lang:action|Koop %0%|%"
- " command: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt verkopen?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verkopen|%"
- " hover: %lang:action|Verkoop %0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% jaren"
"timeleft-months": "%0% maanden"
"timeleft-days": "%0% dagen"
"timeleft-hours": "%0% uren"
"timeleft-minutes": "%0% minuten"
"timeleft-second": "%0% seconde"
"timeleft-seconds": "%0% seconden"
"timeleft-ended": "Verlopen"
"greeting-forrent": "%region% kan worden gehuurd voor %price% per %duration%."
"greeting-rented": "%region% is gehuurd door %player% tot %until%."
"greeting-forsale": "%region% kan worden gekocht voor %price%."
"greeting-bought": "%region% is gekocht door %player%."
"greeting-resale": "%region% kan gekocht worden voor %resellprice% van %player%."
"update-playerNotify":
- "[darkgreen]Update van AreaShop V%0% naar AreaShop V%1% beschikbaar, download de laatste versie op "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Ga naar de Spigot AreaShop pagina|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (en schrijf een review)."
+474
View File
@@ -0,0 +1,474 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Norwegian language file, plugin version 2.5.0, 365/428 messages are translated (85%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
"button": "[bold]<%0%>[/bold]"
"command":
- "[bold]%0%[/bold]"
- " hover: %lang:action|Bruk %1%|%"
- " kommando: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Bruk %0%|%"
- " kommando: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Region %0%"
- " hover: %lang:action|Region informasjon|%"
- " kommando: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Spiller %0%"
- " hover: %lang:action|Regioner til %0%|%"
- " kommando: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Grunneier %landlord%"
- " hover: %lang:action|Regioner til %landlord%|%"
- " kommando: /areashop info player %landlord%"
"total-maximum": "Du kan ikke leie og kjøpe mer enn %0% region(er) totalt (du har allerede %1% i gruppe '%2%')."
"general-notReady": "AreaShop har ikke lastet ferdig ennå, vennligst vent."
"general-noWorld": "Du kan ikke gjøre det, verdenen %lang:region% er for øyeblikket utilgjengelig (world '%world%')."
"general-noRegion": "Du kan ikke gjøre det, WorldGuard regionen er for øyeblikket utilgjengelig. (region %lang:region%)."
"general-noEconomy": "Det er ikke noen økonomi plugin installert eller satt opp riktig, si ifra til server eieren om dette."
"general-cancelled": "%0%"
"cmd-notValid": "Den kommandoen er ikke gyldig, bruk '/as help' for informasjon."
"cmd-onlyByPlayer": "Denne kommandoen kan bare brukes av en spiller."
"cmd-weOnlyByPlayer": "Du kan bare bruke en WorldEdit markering som en spiller, spesifiser region navnet som et ekstra argument."
"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-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."
"help-header": "Informasjons side, kommandoer som du kan bruke."
"help-noPermission": "Du har ikke rettigheter til å vise siden med hjelp."
"help-alias": "Kommando aliaser: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Viser siden med hjelp."
"help-info": "%lang:helpCommand|/as info|% Få informasjon om gjeldende regioner."
"help-rent": "%lang:helpCommand|/as rent|% Lei en region eller utvid din gjeldende leie."
"help-buy": "%lang:helpCommand|/as buy|% Kjøp en region."
"help-unrent": "%lang:helpCommand|/as unrent|% Stopp leie av en region."
"help-sell": "%lang:helpCommand|/as sell|% Selg en region."
"help-reload": "%lang:helpCommand|/as reload|% Last inn filer på nytt og oppdater regionene."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Skru på gjenoppretting og velg en profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Endre prisen på en region."
"help-setduration": "%lang:helpCommand|/as setduration|% Endre leie tiden til en region."
"help-teleport": "%lang:helpCommand|/as tp|% Teleporter til en kjøpe/leie region."
"help-setteleport": "%lang:helpCommand|/as settp|% Sett teleporterings plass for en region."
"help-find": "%lang:helpCommand|/as find|% Finn en ledig kjøp eller leie region."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Legg til en region til en gruppe."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Fjern en region fra en gruppe."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Vis alle grupper som er registrert."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Vis informasjon om en gruppe."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Aktiver et schematic event for en region."
"help-add": "%lang:helpCommand|/as add|% Registrer en region som leie eller kjøpe."
"help-del": "%lang:helpCommand|/as del|% Fjern en registrert region fra AreaShop."
"help-addsign": "%lang:helpCommand|/as addsign|% Legg til et skilt for en eksisterende region."
"help-delsign": "%lang:helpCommand|/as delsign|% Fjern skiltet du ser på."
"help-me": "%lang:helpCommand|/as me|% Sjekk hvilke regioner du har (+utløpstid)."
"help-setowner": "%lang:helpCommand|/as setowner|% Sett noen som eier av regionen eller utvid leietiden."
"help-resell": "%lang:helpCommand|/as resell|% Sett en region i videresalgs modus."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Sett en region tilbake i solgt modus."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Legg til en venn i en region."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Fjern en venn fra en region."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
"help-stack": "%lang:helpCommand|/as stack|% Lag flere regioner og legg dem til."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Sett grunneier av en region."
"rent-help": "/as rent [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"rent-noPermission": "Du har ikke rettigheter til å leie en region."
"rent-maximum": "Du kan ikke leie mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
"rent-maximumExtend": "Du kan ikke utvide denne leien fordi du har mer enn %0% region(er) (Du har allerede %1% i gruppe '%2%')."
"rent-payError": "Noe gikk galt med din betaling, prøv igjen senere."
"rent-rented": "Du leide %lang:region% frem til %until%, du kan utvide din leie ved å høyreklikke på skiltet igjen eller bruke /as rent."
"rent-extended": "Du utvidet din leie av %lang:region% frem til %until%."
"rent-extendedToMax": "Du har utvidet din leie av %lang:region% frem til %until% (som er den maksimale leietiden av %maxrenttime%)."
"rent-lowMoneyExtend": "Du har ikke nok penger til å utvide leien (du har %0% og du trenger %price%)."
"rent-lowMoneyRent": "Du har ikke nok penger til å leie (du har %0% og du trenger %price%)."
"rent-someoneElse": "Noen har allerede leid %lang:region%."
"rent-maxExtends": "Du kan ikke utvide leien mer (maksimum er %maxextends% ganger) men, når leien er over kan du leie %lang:region% igjen."
"rent-maxRentTime": "Du kan ikke øke leietid av %lang:region% mer tid fremover, den maksimale tiden er %maxrenttime% og du har leid den for %timeleft%."
"rent-restrictedToWorld": "Du må være i '%world%' verden for å leie %lang:region% (du er i '%0%')."
"rent-restrictedToRegion": "Du må være på innsiden av %lang:region% for å leie den."
"rent-expireWarning": "Din region %lang:region% har %timeleft% igjen, husk å utvide leien om du vil beholde den."
"rent-alreadyAtFull": "%lang:region% er allerede ved eller over den maksimale leietiden, du kan ikke utvide mer ennå."
"buy-help": "/as buy [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"buy-noPermission": "Du har ikke rettigheter til å kjøpe en region."
"buy-noPermissionResell": "Du har ikke rettigheter til å kjøpe en region i videresalgs modus."
"buy-noPermissionNoResell": "Du har ikke rettigheter til å kjøpe en region som ikke er i videresalgs modus."
"buy-maximum": "Du kan ikke kjøpe mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
"buy-payError": "Noe gikk galt med din betaling, prøv igjen senere."
"buy-succes": "Du var vellykket i ditt kjøp av %lang:region%."
"buy-successResale": "Du var vellykket i ditt kjøp av %lang:region% fra %lang:tPlayer|%0%|%."
"buy-successSeller": "Din region %lang:region% har blitt solgt til %lang:player% for %0%."
"buy-lowMoney": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %price%)."
"buy-lowMoneyResell": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %resellprice%)."
"buy-yours": "Du eier allerede %lang:region%."
"buy-someoneElse": "Noen andre har kjøpt %lang:region%."
"buy-restrictedToWorld": "Du må være i '%world%' verden for å kjøpe %lang:region% (du er i '%0%')."
"buy-restrictedToRegion": "Du må være på innsiden av %lang:region% for å kjøpe den."
"unrent-help": "/as unrent [region], regionen du står i vil bli bruk om ikke spesifisert."
"unrent-noPermission": "Du har ikke rettigheter til å stoppe leie på en region."
"unrent-noPermissionOther": "Du har ikke rettigheter til å stoppe leie på en annen region."
"unrent-notRegistered": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke registrert for leie."
"unrent-notRented": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke leid."
"unrent-unrented": "%lang:region% sin leie av %lang:player% har blitt avsluttet."
"unrent-expired": "Din leie av %lang:region% har gått ut."
"sell-help": "/as sell [region], regionen du står i vil bli brukt hvis ikke spesifisert."
"sell-notRegistered": "Denne regionen kan ikke bli solgt fordi den er ikke registrert for salg."
"sell-notBought": "Denne regionen kan ikke bli solgt fordi den er ikke noen sin eiendom."
"sell-sold": "%lang:region% til %lang:player% har blitt solgt."
"sell-noPermission": "Du har ikke rettigheter til å selge en region."
"sell-noPermissionOther": "Du har ikke rettigheter til å selge en annen region."
"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-noPermission": "Du har ikke rettigheter til å få informasjon om regioner."
"info-allHeader": "Alle regioner%0%:"
"info-rentedHeader": "Leide regioner%0%:"
"info-forrentHeader": "Regioner til leie%0%:"
"info-forsaleHeader": "Regioner til salgs%0%:"
"info-soldHeader": "Solgte regioner%0%:"
"info-resellingHeader": "Regioner til videresalg%0%:"
"info-nogroupHeader": "Regioner uten gruppe%0%:"
"info-limitedToGroup": " (begrenset til gruppe %0%)"
"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-pageNoPrevious":
- " [darkgray][bold]◄Forrige[/bold] "
- " hover: Dette er første side"
"info-pageNoNext":
- " [darkgray][bold]Neste►[/bold]"
- " hover: Dette er siste side"
"info-playerHelp": "/as info player <navn>."
"info-playerRents": "Regioner leid av %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "%lang:tPlayer|%0%|% har ikke leid en region."
"info-playerBuys": "Regioner kjøpt av %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "%lang:tPlayer|%0%|% har ikke kjøpt en region."
"info-regionHelp": "/as info region [navn], den regionen du står i vil bli bruk om ikke spesifisert."
"info-regionHeaderRent": "[darkgreen]Informasjon om %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informasjon om %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Utleid til %lang:player% frem til: [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%, for øyeblikket videreselges."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Forleng for[/bold]"
- " hover: Forleng leie av %region%"
- " hover: med %duration% for %price%"
- " hover: %lang:action|Extend rent of %region%|%"
- " kommando: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Lei for[/bold]"
- " hover: Lei %region% for %price% per %duration%"
- " hover: %lang:action|Rent %region%|%"
- " kommando: /areashop rent %region%"
- ": [gray]%price% per %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Kjøp for[/bold]"
- " hover: Kjøp %region% for %price%"
- " hover: %lang:action|Buy %region%|%"
- " kommando: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Videresalgs pris: [gray]%resellprice% (du kan kjøpe den fra %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Venner lagt til: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Remove %0% as friend|%"
- " kommando: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Penger tilbake for salg: [gray]%moneyback% (%moneybackpercent%% av prisen)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Penger tilbake etter salg[/bold]"
- " hover: Selg %region% å få igjen %moneyback%"
- " hover: %lang:action|Sell %region%|%"
- " kommando: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av prisen)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Penger tilbake fra leie: [gray]%moneyback% (%moneybackpercent%% fra gjenstående tid)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Penger tilbake fra leie[/bold]"
- " hover: Stopp leie %region% å få tilbake %moneyback%"
- " hover: %lang:action|Unrent %region%|%"
- " kommando: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av gjenstående tid)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maks antall utvidelser: [gray]%maxextends% gang(er)."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Leien kan ikke utvides."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Utvidelser igjen: [gray]%extendsleft% gang(er) av %maxextends%."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Leie på forhånd: [gray]%maxrenttime% på maks."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Gå til region[/bold]"
- " hover: %lang:action|Teleporter to %region%|%"
- " kommando: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Sett teleporterings posisjon[/bold]"
- " hover: %region%"
- " hover: %lang:action|Sett teleporterings posisjon|%"
- " kommando: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Koblete skilt: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Fordelte grupper: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatisk stopp leie etter: [gray]%inactivetime% av inaktivitet fra spiller."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatisk selg etter: [gray]%inactivetime% av inaktivitet fra spiller."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du må stå på innsiden av %lang:region% for å leie den."
"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-regionLandlord": "[darkgreen][bold]►[reset] Grunneier: [gray]%lang:landlord% (mottar pengene)."
"info-regionNotExisting": "Den spesifiserte regionen er ikke registrert: %0%."
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
"setrestore-noPermission": "Du har ikke rettigheter til å endre gjenopprettelses instillingene."
"setrestore-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"setrestore-invalidSetting": "'%0%' er ikke gyldig uttrykk, skal være true, false eller general."
"setrestore-success": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%'."
"setrestore-successProfile": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%' og profilen til '%1%'."
"setprice-noPermission": "Du har ikke rettighetene til å endre prisen til en region."
"setprice-help": "/as setprice <pris> [region], den regionen du står i vil bli valgt om ikke spesifisert."
"setprice-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"setprice-wrongPrice": "'%0%' er ikke en gyldig pris."
"setprice-successRent": "Prisen til region %lang:region% er endret til %price% per %duration%."
"setprice-successBuy": "Prisen til region %lang:region% er endret til %price%."
"setprice-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
"setprice-noLandlord": "Du har ikke rettigheter til å endre prisen fordi du er ikke eieren av %lang:region%."
"setduration-noPermission": "Du har ikke rettigheter til å endre tidsrommet for en leie."
"setduration-help": "/as setduration <mengde> <identifisering> [region], regionen du står i vil bli brukt om ikke spesifisert."
"setduration-notRegistered": "%0% er ikke registrert for leie."
"setduration-wrongAmount": "'%0%' er ikke gyldig, bruk hele nummer."
"setduration-wrongFormat": "'%0%' er ikke et riktig tidsformat, sjekk dokumentasjonen på Bukkit."
"setduration-success": "Tiden til region %lang:region% er endret til '%duration%'."
"setduration-noLandlord": "Du har ikke rettigheter til å endre tiden fordi du er ikke eieren av %lang:region%."
"setduration-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
"setup-noRegion": "Du spesifiserte ikke en region på linje nummer to."
"setup-alreadyRentSign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en leie region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
"setup-alreadyBuySign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en kjøp region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
"setup-noDuration": "Du spesifiserte ikke hvor lenge den regionen kan bli leid, gjør dette på den tredje linjen."
"setup-wrongDuration": "Tiden du spesifiserte er ikke i korrekt format, eksempel: 1 dag."
"setup-noPrice": "Du spesifiserte ikke prisen på den fjerde linjen."
"setup-wrongPrice": "Du spesifiserte ikke prisen riktig, bare bruk nummer."
"setup-rentSuccess": "leie av region %lang:region% er satt opp riktig."
"setup-buySuccess": "Salg av region %lang:region% er satt opp riktig."
"setup-noPermissionRent": "Du har ikke rettigheter til å sette opp leie regioner."
"setup-noPermissionBuy": "Du har ikke rettigheter til å sette opp regioner til salgs."
"setup-couldNotDetect": "Fant flere regioner med samme prioritet og/eller foreldre/barn kobling, spesifiser en på den andre linjen (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% er på svartelisten og kan ikke bli lagt til i AreaShop."
"setup-noPermission": "Du kan ikke legge til regionen '%0%', du er ikke en eier/medlem eller har ikke rettigheter til det."
"destroy-noPermissionRent": "Du har ikke rettigheter til å avregistrere en leie region."
"destroy-noPermissionBuy": "Du har ikke rettigheter til å avregistrere en kjøpe region."
"destroy-successRent": "%lang:region% vellykket i å avregistrere en leie region."
"destroy-successBuy": "%lang:region% vellykket i å avregistrere en kjøpe region."
"teleport-help": "/as tp <region> [skilt]"
"teleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
"teleport-noPermission": "Du har ikke rettigheter til å teleportere til din region."
"teleport-noPermissionOther": "Du har ikke rettigheter til å teleportere til regioner du ikke eier."
"teleport-noPermissionSign": "Du har ikke rettigheter til å teleportere til skiltet til din region."
"teleport-noPermissionOtherSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du ikke eier."
"teleport-noPermissionFriend": "Du har ikke rettigheter til å teleportere til regioner du er langt til som venn."
"teleport-noPermissionFriendSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du er lagt til som venn."
"teleport-success": "Du teleporterte til %lang:region%."
"teleport-successSign": "Du teleporterte til skiltet til %lang:region%."
"teleport-noSafe": "Ingen trygg posisjon funnet i %lang:region%, ingen plasser igjen i regionen eller maks forsøk overskredet (%0%/%1%)."
"teleport-blocked": "Du kan ikke teleportere fordi posisjonen er på utsiden av regionen, og du er tvunget til å teleportere til innsiden."
"teleport-changedToSign": "Du har bare rettigheter til å teleportere til skilt og ikke utsiden av regionen, teleporterer til skilt."
"teleport-changedToNoSign": "Ingen skilt tilgjengelige å teleportere til, prøver å teleportere til innsiden av regionen."
"setteleport-help": "/as settp [region] [reset], den regionen du står i vil bli brukt om ikke spesifisert."
"setteleport-noPermission": "Du har ikke rettigheter til å sette teleporterings punkt."
"setteleport-noPermissionOther": "Du har ikke rettigheter til å sette teleporterings punktet for en region du ikke eier."
"setteleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
"setteleport-success": "Teleporterings posisjon for %lang:region% satt."
"setteleport-notInside": "Punktet må være på innsiden av regionen."
"setteleport-reset": "Teleporterings posisjon for %lang:region% har blitt resatt."
"find-help": "/as find <buy|rent> [maxpris] [gruppe]."
"find-noPermission": "Du har ikke rettigheter til å søke etter regioner og teleportere til dem."
"find-success": "Fant en %0% region: %lang:region%, under søket med en makspris av din balanse: %1%%2%."
"find-successMax": "Fant en %0% region: %lang:region%, under søket med en makspris av: %1%%2%."
"find-wrongMaxPrice": "Den spesifiserte maks prisen er ikke et korrekt nummer. %0%"
"find-wrongGroup": "Den spesifiserte gruppen eksisterer ikke: %0%."
"find-noneFound": "Ingen %0% region funnet under søket med en makspris av din balanse: %1%%2%."
"find-noneFoundMax": "Ingen %0% region ble funnet under søket med en maks pris av %1%%2%."
"find-onlyInGroup": ", bare søkt etter regioner i gruppe: %0%."
"groupadd-help": "/as groupadd <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
"groupadd-noPermission": "Du har ikke rettigheter til å legge til regioner i grupper."
"groupadd-success": "Region %lang:region% har blitt lagt til i gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
"groupadd-failed": "Region %lang:region% er allerede et medlem av gruppe '%0%'."
"groupadd-weSuccess": "Lagt til i gruppe %0%: [gray]%1%."
"groupadd-weFailed": "Var allerede i gruppe %0%: [gray]%1%."
"groupdel-help": "/as groupdel <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
"groupdel-noPermission": "Du har ikke rettigheter til å fjerne regioner fra grupper."
"groupdel-success": "Region %lang:region% har blitt fjernet fra gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
"groupdel-failed": "Region %lang:region% er ikke et medlem av gruppe '%0%'."
"groupdel-weSuccess": "Fjernet fra gruppe %0%: [gray]%1%."
"groupdel-weFailed": "Var ikke i gruppe %0% likevel: [gray]%1%."
"grouplist-noPermission": "Du har ikke rettigheter til å vise de registrerte gruppene."
"grouplist-noGroups": "Det er for øyeblikket ingen grupper registrert."
"grouplist-success": "De følgende gruppene er registrert: [gray]%0%."
"groupinfo-help": "/as groupinfo <group>."
"groupinfo-noPermission": "Du har ikke rettigheter til å se informasjon om en gruppe."
"groupinfo-noGroup": "Det er ingen grupper registrert med navnet '%0%'. bruk /as grouplist for å sjekke grupper."
"groupinfo-members": "De følgende regionene er medlemmer av gruppe %0%: [gray]%1%."
"groupinfo-noMembers": "Gruppe %0% har ingen medlemmer."
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Det spesifiserte eventet '%0%' eksisterer ikke, bruk en av de følgende [gray]%1%."
"schemevent-success": "Event '%0%' har blitt aktivert vellykket for region %lang:region%."
"schemevent-noPermission": "Du har ikke rettigheter til å aktivere et schematic event."
"add-help": "/as add <rent|buy> [region] [verden]."
"add-noPermission": "Du har ikke rettigheter til å legge til en region i AreaShop."
"add-success": "Lagt til som %0%: [gray]%1%."
"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-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."
"del-noPermission": "Du har ikke rettigheter til å fjerne regioner."
"del-success": "Fjernet regioner: [gray]%0%."
"del-failed": "Du har ikke rettigheter til å fjerne eller ikke registrert: [gray]%0%."
"addsign-help": "/as addsign [region] [profil]."
"addsign-noSign": "Du ser ikke på et skilt."
"addsign-noRegions": "Ingen region funnet rundt skiltet sin posisjon."
"addsign-couldNotDetect": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Den spesifiserte profilen finnes ikke, bruk en av de følgende (sjekk konfigurasjon): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Skiltprofil %0%"
- " hover: %lang:action|Use this profile|%"
- " kommando: /areashop linksigns %0%"
"addsign-success": "Skiltet har blitt lagt til %lang:region%."
"addsign-successProfile": "Skiltet har blitt lagt til %lang:region% med profil %0%."
"addsign-alreadyRegistered": "Det skiltet er allerede registrert for region %lang:region%."
"addsign-noPermission": "Du har ikke rettigheter til å legge til et skilt."
"delsign-noSign": "Du ser ikke på et skilt."
"delsign-noPermission": "Du har ikke rettigheter til å fjerne et skilt."
"delsign-noRegion": "Det skiltet hører ikke til en AreaShop region."
"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-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"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."
"setowner-help": "/as setowner <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"setowner-noPermission": "Du har ikke rettigheter til å sette eieren av en region."
"setowner-noPermissionRent": "Du har ikke rettigheter til å sette eieren av en leie region."
"setowner-noPermissionBuy": "Du har ikke rettigheter til å sette eieren av en kjøpe region."
"setowner-notRegistered": "Den spesifiserte regionen er ikke registrert, eier kan ikke bli satt."
"setowner-noPlayer": "Kunne ikke skaffe UUID til den spesifiserte spilleren: %0%."
"setowner-succesRent": "Eier av %lang:region% vellykket endret til %lang:player%, leid frem til %until% (%timeleft% igjen)"
"setowner-succesRentExtend": "Eier var allerede %lang:player%, leie utvidet med '%duration%', nå leid frem til %until% (%timeleft% igjen)."
"setowner-succesBuy": "Eier av %lang:region% vellykket endret til %lang:player%."
"resell-help": "/as resell <pris> [region], regionen du står i vil bli brukt om ikke spesifisert."
"resell-wrongPrice": "'%0%' er ikke en gyldig pris."
"resell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"resell-notBought": "Du kan ikke videreselge %lang:region% fordi den er ikke solgt ennå."
"resell-success": "%lang:region% er vellykket satt i videresalgsmodus for %resellprice%."
"resell-noPermission": "Du har ikke rettigheter til å sette din region i videresalgs modus."
"resell-noPermissionOther": "Du har ikke rettigheter til å sette en region i videresalgs modus."
"stopresell-help": "/as stopresell [region], regionen du står i vil bli brukt om ikke spesifisert."
"stopresell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
"stopresell-notResell": "Du kan ikke stoppe videresalget av %lang:region% fordi den er ikke i videresalgs modus."
"stopresell-success": "%lang:region% er vellykket satt tilbake i solgt modus."
"stopresell-noPermission": "Du har ikke rettigheter til å sette din region tilbake i solgt modus."
"stopresell-noPermissionOther": "Du har ikke rettigheter til å sette regioner tilbake i solgt modus."
"addfriend-help": "/as addfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"addfriend-noPermissionOther": "Du har ikke rettigheter til å legge til venner i regioner som ikke er dine."
"addfriend-noPermission": "Du har ikke rettigheter til å legge til venner i din region."
"addfriend-successOther": "%lang:tPlayer|%0%|% har blitt lagt til som venn i region %lang:region%."
"addfriend-success": "%lang:tPlayer|%0%|% har blitt lagt til som venn i din region %lang:region%."
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% er allerede lagt til som venn i %lang:region%."
"addfriend-self": "Å legge til eieren av regionen som venn vil være meningsløst."
"addfriend-noOwner": "Du kan ikke legge til venner i en region uten eier."
"addfriend-notVisited": "Du kan ikke legge til %0% fordi h*n har ikke vært på serveren ennå."
"delfriend-help": "/as delfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
"delfriend-noPermissionOther": "Du har ikke rettigheter til å fjerne venner fra regioner som ikke er dine."
"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-noOwner": "Du kan ikke fjerne venner fra en region uten eier."
"linksigns-multipleRegions": "Fant flere regioner: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Klikk en gang til for å prøve igjen eller bruk '/as linksigns' for å stoppe."
"linksigns-noRegions": "Ingen AreaShop regioner funnet i rettningen du peker, vær sikker på at regionen er lagt til i AreaShop [gray](maksimal avstand 100 blokker)."
"linksigns-regionFound": "Region %lang:region% har blitt funnet, nå pek på et skilt og venstreklikk for å koble sammen."
"linksigns-signFound": "Fant et skilt ved (%0%, %1%, %2%), nå pek mot en region og høyreklikk for å koble sammen."
"linksigns-noSign": "Ingen skilt funnet i rettningen du peker, vær sikker på at du har en ublokkert vei mot et skilt og klikk igjen [gray](maksimal avstand 100 blokker)."
"linksigns-alreadyRegistered": "Det skiltet er allerede registrert til region %lang:region%, klikk igjen for å velge et annet skilt."
"linksigns-first": "Du har aktivert skilt koblings modus."
"linksigns-next": "[gray]Ventstreklikk for å velge et skilt, høyreklikk for å velge en region, bruk /as linksigns for å stoppe."
"linksigns-noPermission": "Du har ikke rettigheter til å aktivere masse-skilt koblings modus."
"linksigns-stopped": "Gått ut av skilt koblings modus."
"stack-help":
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Antall regioner som vil bli laget.[break]"
- " [gray]<gap> Antall blokker mellom regioner.[break]"
- " [gray]<name> Navnet på regioner (nummer kommer bak).[break]"
- " [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."
"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."
"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."
"setlandlord-success": "%lang:landlord% har vellykket blitt satt som grunneier av %lang:region%."
"message-help": "/as message <spiller> <melding...>"
"message-noPermission": "Du har ikke rettigheter til å sende AreaShop meldinger."
"message-notOnline": "%0% er ikke pålogget."
"confirm-rent":
- "%lang:prefix%Er du sikker på at du vil leie %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å leie %0%|%"
- " hover: %lang:action|Lei %0%|%"
- " kommando: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Er du sikker du vil forlenge %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å utvide leie %0%|%"
- " hover: %lang:action|Utvid leie %0%|%"
- " kommando: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Er du sikker du vil stoppe leie "
- "%lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å stoppe leie %0%|%"
- " hover: %lang:action|Stopp leie %0%|%"
- " kommando: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Er du sikker du vil kjøpe %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å kjøpe %0%|%"
- " hover: %lang:action|Kjøp %0%|%"
- " kommando: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Er du sikker du vil selge %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å selge %0%|%"
- " hover: %lang:action|Selg %0%|%"
- " kommando: /areashop sell %0%"
"timeleft-years": "%0% år"
"timeleft-months": "%0% måneder"
"timeleft-days": "%0% dager"
"timeleft-hours": "%0% timer"
"timeleft-minutes": "%0% minutter"
"timeleft-second": "%0% sekund"
"timeleft-seconds": "%0% sekunder"
"timeleft-ended": "Utløpt"
"greeting-forrent": "%region% kan bli leid for %price% per %duration%."
"greeting-rented": "%region% er leid av %player% til %until%."
"greeting-forsale": "%region% kan bli kjøpt for %price%."
"greeting-bought": "%region% er kjøpt av %player%."
+564
View File
@@ -0,0 +1,564 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Polish language file, plugin version 2.5.0, 428/428 messages are 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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|Użyj komendy %1%|%"
- " command: %1%"
"helpCommand":
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Użyj %0%|%"
- " command: %0%"
"region": "%lang:tRegion|%region%|%"
"tRegion":
- "[bold]%0%[/bold]"
- " hover: Działka %0%"
- " hover: %lang:action|Informacje o działce|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Gracz %0%"
- " hover: %lang:action|Działki gracza %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Zarządca %landlord%"
- " hover: %lang:action|Działki zarządcy %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "Nie możesz posiadać większej ilości działek niż %0% (aktualnie posiadasz %1% w grupie '%2%')."
"confirm-yes": " [gray]Kliknij aby %lang:command|potwierdzić|%0%|%[gray] lub powtórz komendę."
"general-notReady": "Plugin AreaShop jeszcze się nie załadował, proszę czekać."
"general-noWorld": "Nie możesz tego zrobić, świat działki %lang:region% jest teraz niedostępny (świat '%world%')."
"general-noRegion": "Nie możesz tego zrobić, region pluginu WorldGuard jest teraz niedostępny (region %lang:region%)."
"general-noEconomy": "Plugin ekonomii nie jest zainstalowany lub nie jest poprawnie skonfigurowany, skontaktuj się z wlaścicielem serwera."
"general-cancelled": "%0%"
"cmd-notValid": "Ta komenda nie istnieje, wpisz komendę '/as help' aby wyświetlić menu pomocy."
"cmd-onlyByPlayer": "Tej komendy może użyć tylko gracz."
"cmd-weOnlyByPlayer": "Tylko gracz może użyć zaznaczenia terenu w WorldEdit, podaj nazwę działki jako dodatkowy argument."
"cmd-noSelection": "Nie zaznaczono terenu w WorldEdit."
"cmd-noRegionsFound": "W twoim zaznaczeniu terenu nie znaleziono żadnej działki."
"cmd-noWERegionsFound": "W twoim zaznaczeniu terenu nie znaleziono żadnego regionu WorldGuard."
"cmd-notRegistered": "Region '%0%' nie jest zarejestrowany jako działka AreaShop."
"cmd-noRegion": "Region '%0%' nie istnieje."
"cmd-noRegionsAtLocation": "W Twojej pozycji nie znaleziono żadnego regionu, podaj nazwę regionu jako dodatkowy argument."
"cmd-moreRegionsAtLocation": "W Twojej pozycji znaleziono więcej niż jeden region, podaj nazwę regionu jako dodatkowy argument."
"cmd-automaticRegionOnlyByPlayer": "Tylko gracz może automatycznie określić region, podaj nazwę regionu jako dodatkowy argument."
"help-header": "Menu pomocy, komendy dostępne dla Ciebie."
"help-noPermission": "Nie masz uprawnień do przeglądania menu pomocy."
"help-alias": "Aliasy komend: /areashop, /as."
"help-help": "%lang:helpCommand|/as help|% Wyświetl menu pomocy."
"help-info": "%lang:helpCommand|/as info|% Wyświetl informacje o działkach."
"help-rent": "%lang:helpCommand|/as rent|% Wynajmij działkę lub przedłuż czas jej wynajmu."
"help-buy": "%lang:helpCommand|/as buy|% Kup działkę."
"help-unrent": "%lang:helpCommand|/as unrent|% Zwolnij wynajętą działkę."
"help-sell": "%lang:helpCommand|/as sell|% Sprzedaj działkę."
"help-reload": "%lang:helpCommand|/as reload|% Przeładuj wszystkie pliki i zaktualizuj działki."
"help-setrestore": "%lang:helpCommand|/as setrestore|% Ustaw status przywracania oraz wybierz jego profil."
"help-setprice": "%lang:helpCommand|/as setprice|% Zmień cenę działki."
"help-setduration": "%lang:helpCommand|/as setduration|% Zmień okres wynajmu działki."
"help-teleport": "%lang:helpCommand|/as tp|% Teleportuj się na działkę."
"help-setteleport": "%lang:helpCommand|/as settp|% Ustaw miejsce teleportacji na działkę."
"help-find": "%lang:helpCommand|/as find|% Znajdź najbliższą wolną działkę."
"help-groupadd": "%lang:helpCommand|/as groupadd|% Dodaj działkę do grupy."
"help-groupdel": "%lang:helpCommand|/as groupdel|% Usuń działkę z grupy."
"help-grouplist": "%lang:helpCommand|/as grouplist|% Wyświetl listę grup."
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Wyświetl informacje o grupie."
"help-schemevent": "%lang:helpCommand|/as schemevent|% Wywołaj szablonowe wydarzenie dla działki."
"help-add": "%lang:helpCommand|/as add|% Określ region jako działkę do wynajęcia lub na sprzedaż."
"help-del": "%lang:helpCommand|/as del|% Usuń działkę."
"help-addsign": "%lang:helpCommand|/as addsign|% Dodaj tabliczkę do istniejącej działki."
"help-delsign": "%lang:helpCommand|/as delsign|% Usuń tabliczkę w zasięgu wzroku z istniejącej działki."
"help-me": "%lang:helpCommand|/as me|% Wyświetl listę posiadanych działek (oraz czasy wynajmu)."
"help-setowner": "%lang:helpCommand|/as setowner|% Wyznacz posiadacza działki lub przedłuż wynajem."
"help-resell": "%lang:helpCommand|/as resell|% Wprowadź działkę w status odsprzedaży."
"help-stopResell": "%lang:helpCommand|/as stopresell|% Zaprzestaj odsprzedaży działki."
"help-addFriend": "%lang:helpCommand|/as addfriend|% Dodaj gracza do działki."
"help-delFriend": "%lang:helpCommand|/as delfriend|% Usuń gracza z działki."
"help-linksigns": "%lang:helpCommand|/as linksigns|% Przełącz tryb łączenia tabliczki z działką."
"help-stack": "%lang:helpCommand|/as stack|% Utwórz wiele działek jednocześnie."
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Ustaw zarządcę działki."
"help-import": "%lang:helpCommand|/as import|% Importuj regiony z RegionForSale."
"rent-help": "Użycie: /as rent [działka]. Jeśli nie podano nazwy działki, wynajęta/przedłużona zostanie działka na której stoisz."
"rent-noPermission": "Nie masz uprawnień do wynajmowania działek."
"rent-maximum": "Nie możesz wynajmować więcej działek niż %0% (aktualnie wynajmujesz %1% w grupie '%2%')."
"rent-maximumExtend": "Nie możesz przedłużyć wynajmu, ponieważ wynajmujesz już więcej działek niż %0% (aktualnie wynajmujesz %1% w grupie '%2%')."
"rent-payError": "Wystąpił błąd z płatnością, spróbuj ponownie później."
"rent-rented": "Wynajęto działkę %lang:region% na okres do dnia %until%. Możesz przedłużyć wynajem działki klikając PPM na powiązaną tabliczkę lub używając komendy /as rent."
"rent-extended": "Przedłużono wynajem działki %lang:region% na okres do dnia %until%."
"rent-extendedToMax": "Przedłużono wynajem działki %lang:region% na okres do dnia %until% (%maxrenttime% to maksymalny możliwy czas wynajmu działki)."
"rent-lowMoneyExtend": "Nie masz wystarczającej ilości pieniędzy aby przedłużyć wynajem działki (na koncie masz %0%, a potrzebujesz %price%)."
"rent-lowMoneyRent": "Nie masz wystarczającej ilości pieniędzy aby wynająć działkę %lang:region% (na koncie masz %0%, a potrzebujesz %price%)."
"rent-someoneElse": "Działka %lang:region% została już wynajęta przez innego gracza."
"rent-notRentable": "Ta działka nie jest możliwa do wynajęcia."
"rent-maxExtends": "Nie możesz przedłużyć wynajmu tej działki (maksymalnie możesz to zrobić %maxextends% razy), ale możesz wynająć działkę %lang:region% ponownie po zakończeniu obecnego wynajmu."
"rent-maxRentTime": "Nie możesz wynająć działki %lang:region% na dłużej. Maksymalny czas to %maxrenttime%, działkę wynajmujesz już na %timeleft%."
"rent-restrictedToWorld": "Musisz znajdować się w świecie '%world%' aby wynająć działkę %lang:region% (obecnie znajdujesz się w świecie '%0%')."
"rent-restrictedToRegion": "Musisz znajdować się na działce %lang:region% aby ją wynająć."
"rent-expireWarning": "Wynajem działki %lang:region% zakończy się za %timeleft%, przedłuż wynajem jeśli wciąż chcesz wynajmować tę działkę."
"rent-expiringSoon": "Wynajem działki %lang:tRegion|%0%|% zakończy się za %1%, przedłuż wynajem jeśli wciąż chcesz wynajmować tę działkę."
"rent-alreadyAtFull": "Działka %lang:region% jest już wynajęta na maksymalny czas, jeszcze nie możesz przedłużyć jej wynajmu."
"buy-help": "Użycie: /as buy [działka]. Jeśli nie podano nazwy działki, kupiona zostanie działka na której stoisz."
"buy-noPermission": "Nie masz uprawnień do kupowania działek."
"buy-noPermissionResell": "Nie masz uprawnień do odkupowania działek."
"buy-noPermissionNoResell": "Nie masz uprawnień do kupowania nieodsprzedawanych działek."
"buy-notBuyable": "Działka '%0%' nie jest dostępna do kupienia."
"buy-maximum": "Nie możesz posiadać więcej działek niż %0% (posiadasz już %1% w grupie '%2%')."
"buy-payError": "Wystąpił błąd z płatnością, spróbuj ponownie później."
"buy-succes": "Kupiono działkę %lang:region%."
"buy-successResale": "Odkupiono działkę %lang:region% od gracza %lang:tPlayer|%0%|%."
"buy-successSeller": "Twoja działka %lang:region% została odsprzedana graczowi %lang:player% za %0%."
"buy-lowMoney": "Nie masz wystarczającej ilości pieniędzy aby kupić działkę %lang:region% (masz %0%, a potrzebujesz %price%)."
"buy-lowMoneyResell": "Nie masz wystarczającej ilości pieniędzy aby odkupić działkę %lang:region% (masz %0%, a potrzebujesz %resellprice%)."
"buy-yours": "Już posiadasz działkę %lang:region%."
"buy-someoneElse": "Działka %lang:region% została już wykupiona przez innego gracza."
"buy-restrictedToWorld": "Musisz znajdować się w świecie '%world%' aby kupić działkę %lang:region% (obecnie znajdujesz się w świecie '%0%')."
"buy-restrictedToRegion": "Musisz znajdować się na działce %lang:region% aby ją kupić."
"unrent-help": "Użycie: /as unrent [działka]. Jeśli nie podano nazwy działki, zwolniona zostanie działka na której stoisz."
"unrent-noPermission": "Nie masz uprawnień do zwalniania działek."
"unrent-noPermissionOther": "Nie masz uprawnień do zwalniania cudzych działek."
"unrent-notRegistered": "Nie istnieje działka do wynajęcia o takiej nazwie."
"unrent-notRented": "Nie możesz zwolnić tej działki, ponieważ nie jest ona wynajmowana."
"unrent-unrented": "Działka %lang:region% gracza %lang:player% została zwolniona."
"unrent-expired": "Wynajem działki %lang:region% wygasł."
"sell-help": "Użycie: /as sell [działka]. Jeśli nie podano nazwy działki, na sprzedaż zostanie wystawiona działka na której stoisz."
"sell-notRegistered": "Nie istnieje działka na sprzedaż o takiej nazwie."
"sell-notBought": "Ta działka nie może zostać sprzedana, ponieważ nie jest niczyją własnością."
"sell-sold": "Działka %lang:region% gracza %lang:player% została sprzedana."
"sell-noPermission": "Nie masz uprawnień do sprzedawania działek serwerowi."
"sell-noPermissionOther": "Nie masz uprawnień do sprzedawania cudzych działek serwerowi."
"sell-disabled": "Możliwość sprzedaży została wyłączona dla tej działki."
"reload-reloading": "Przeładowano konfigurację pluginu i rozpoczęto aktualizowanie działek."
"reload-noPermission": "Nie masz uprawnień do przeładowania konfiguracji pluginu."
"reload-updateCommandChanged": "'/as updaterents' i '/as updatebuys' zostaly usuniete, '/as reload' tez odswieza regiony, wiec uzywaj teraz tej komendy."
"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]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"info-noPermission": "Nie masz uprawnień do uzyskania informacji o działkach."
"info-allHeader": "Lista wszystkich działek%0%:"
"info-rentedHeader": "Lista wynajmowanych działek%0%:"
"info-forrentHeader": "Lista działek do wynajęcia%0%:"
"info-forsaleHeader": "Lista działek na sprzedaż%0%:"
"info-soldHeader": "Lista sprzedanych działek%0%:"
"info-resellingHeader": "Lista odsprzedawanych działek%0%:"
"info-nogroupHeader": "Lista działek nieprzydzielonych do grupy%0%:"
"info-limitedToGroup": " (ograniczona do grupy %0%)"
"info-nogroupNone": "Wszystkie działki należą do grup."
"info-noFiltergroup": "Grupa '%0%' nie istnieje."
"info-noRegions": "Nie znaleziono żadnej działki."
"info-wrongPage": "'%0%' nie jest poprawnym numerem strony."
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka do wynajęcia za %price% na %duration%."
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka wynajęta przez gracza %lang:player%."
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka na sprzedaż za %price%."
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka kupiona przez gracza %lang:player%."
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka kupiona przez gracza %lang:player%, obecnie odsprzedawana."
"info-pageStatus": "[gold]Strona %0%/%1%"
"info-pagePrevious":
- " [gold][bold]◄Poprzednia[/bold] "
- " hover: %lang:action|Wyświetl poprzednią stronę|%"
- " command: %0%"
"info-pageNoPrevious":
- " [darkgray][bold]◄Poprzednia[/bold] "
- " hover: Jesteś już na pierwszej stronie"
"info-pageNext":
- " [gold][bold]Następna►[/bold]"
- " hover: %lang:action|Wyświetl następną stronę|%"
- " command: %0%"
"info-pageNoNext":
- " [darkgray][bold]Nastepna►[/bold]"
- " hover: Jesteś już na ostatniej stronie"
"info-playerHelp": "Użycie: /as info player <nick>."
"info-playerRents": "Działki wynajęte przez gracza %lang:tPlayer|%0%|%: [gray]%1%"
"info-playerNoRents": "Gracz %lang:tPlayer|%0%|% nie wynajął żadnej działki."
"info-playerBuys": "Dzialki kupione przez gracza %lang:tPlayer|%0%|%: [gray]%1%."
"info-playerNoBuys": "Gracz %lang:tPlayer|%0%|% nie kupił żadnej działki."
"info-regionHelp": "Użycie: /as info region [działka]. Jeśli nie podano nazwy działki, zostaną wyświetlone informacje o działce na której stoisz."
"info-regionHeaderRent": "[darkgreen]Informacje o działce %lang:region%:"
"info-regionHeaderBuy": "[darkgreen]Informacje o działce %lang:region%:"
"info-regionRented": "[darkgreen][bold]►[reset] Działka wynajęta przez gracza %lang:player% na okres do dnia [gray]%until%."
"info-regionBought": "[darkgreen][bold]►[reset] Działka kupiona przez gracza %lang:player%."
"info-regionReselling": "[darkgreen][bold]►[reset] Działka kupiona przez gracza %lang:player%, obecnie odsprzedawana."
"info-regionExtending":
- "[darkgreen][bold]►[reset] "
- "[bold]Przedłużenie wynajmu za[/bold]"
- " hover: Przedłuż wynajem działki %region%"
- " hover: o %duration% za %price%"
- " hover: %lang:action|Przedłuż wynajem działki %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% o %duration%."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]Wynajem działki za[/bold]"
- " hover: Wynajmij działkę %region% za %price% na %duration%"
- " hover: %lang:action|Wynajmij działkę %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% na %duration%."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Kupno działki za[/bold]"
- " hover: Kup działkę %region% za %price%"
- " hover: %lang:action|Kup działkę %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
"info-regionReselPrice": "[darkgreen][bold]►[reset] Cena odkupienia: [gray]%resellprice% (możesz odkupić tę działkę od gracza %lang:player%)."
"info-regionFriends": "[darkgreen][bold]►[reset] Dodani gracze: [gray]%0%."
"info-friend": "%lang:tPlayer|%0%|%"
"info-friendRemove":
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Działka %region%"
- " hover: %lang:action|Usuń gracza %0% z działki|%"
- " command: /areashop delfriend %0% %region%"
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Zwrot przy sprzedaży: [gray]%moneyback% (%moneybackpercent%% ceny)."
"info-regionMoneyBackBuyClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Zwrot przy sprzedaży[/bold]"
- " hover: Sprzedaj działkę %region% i otrzymaj zwrot %moneyback%"
- " hover: %lang:action|Sprzedaj działkę %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% ceny)."
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Zwrot przy zwolnieniu: [gray]%moneyback% (%moneybackpercent%% pozostałego czasu)."
"info-regionMoneyBackRentClick":
- "[darkgreen][bold]►[reset] "
- "[bold]Zwrot przy zwolnieniu[/bold]"
- " hover: Zwolnij działkę %region% i otrzymaj zwrot %moneyback%"
- " hover: %lang:action|Zwolnij działkę %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% pozostałego czasu)."
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Wynajem działki możesz przedłużyć maksymalnie [gray]%maxextends% raz(y)."
"info-regionNoExtending": "[darkgreen][bold]►[reset] Wynajem działki nie może zostać przedłużony."
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Możesz przedłużyć wynajem jeszcze [gray]%extendsleft% raz(y) na %maxextends% możliwych."
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Maksymalny czas wynajmu to [gray]%maxrenttime%."
"info-prefix": "[darkgreen][bold]►[reset] "
"info-regionTeleport":
- "[bold]Teleportuj na działkę[/bold]"
- " hover: %lang:action|Teleportuj się na działkę %region%|%"
- " command: /areashop tp %region%"
"info-setRegionTeleport":
- "[bold]Ustaw miejsce teleportacji[/bold]"
- " hover: %region%"
- " hover: %lang:action|Ustaw miejsce teleportacji na działkę|%"
- " command: /areashop settp %region%"
"info-regionSigns": "[darkgreen][bold]►[reset] Powiązane tabliczki: [gray]%0%."
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
"info-regionGroups": "[darkgreen][bold]►[reset] Przydzielone grupy: [gray]%0%."
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Działka zostanie zwolniona automatycznie po okresie nieaktywności gracza równym [gray]%inactivetime%."
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Działka automatycznie wejdzie w odsprzedaż po okresie nieaktywności gracza równym [gray]%inactivetime%."
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Musisz znajdować się na działce %lang:region% aby ją wynająć."
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Musisz znajdować się w świecie '%world%' aby wynająć działkę %lang:region%."
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Musisz znajdować się na działce %lang:region% aby ją kupić."
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Musisz znajdować się w świecie '%world%' aby kupić działkę %lang:region%."
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Przywracanie aktywne [gray](działka zostanie zresetowana przy zwolnieniu)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Przywracanie aktywne [gray](działka zostanie zresetowana przy sprzedaży)."
"info-regionLandlord": "[darkgreen][bold]►[reset] Zarządca: [gray]%lang:landlord% (otrzymuje pieniądze)."
"info-regionNotExisting": "Działka %0% nie istnieje."
"setrestore-help": "Użycie: /as setrestore <działka> <true|false|general> [profil]."
"setrestore-noPermission": "Nie masz uprawnień do zmiany ustawień przywracania."
"setrestore-notRegistered": "Działka %0% nie istnieje."
"setrestore-invalidSetting": "'%0%' nie jest poprawnym argumentem. Użyj jednego z argumentów: true/false/general."
"setrestore-success": "Pomyślnie ustawiono status przywracania działki %lang:region% do wartości '%0%'."
"setrestore-successProfile": "Pomyślnie ustawiono status przywracania działki %lang:region% do wartości '%0%' oraz profil '%1%'."
"setprice-noPermission": "Nie masz uprawnień do zmiany ceny działki."
"setprice-help": "Użycie: /as setprice <cena> [działka]. Jeśli nie podano nazwy działki, zostanie zmieniona cena działki na której stoisz."
"setprice-notRegistered": "Działka %0% nie istnieje."
"setprice-wrongPrice": "'%0%' nie jest poprawną ceną."
"setprice-successRent": "Cena działki %lang:region% została zmieniona na: %price% na %duration%."
"setprice-successBuy": "Cena działki %lang:region% została zmieniona na %price%."
"setprice-successRemoved": "Cena działki %lang:region% została usunięta. Ustawiono domyślną cenę: %price%."
"setprice-noLandlord": "Nie masz uprawnień do zmiany ceny działki %lang:region%, ponieważ nie jesteś jej zarządcą."
"setduration-noPermission": "Nie masz uprawnień do zmiany długości okresu wynajmu działki."
"setduration-help": "Użycie: /as setduration <ilość> <jednostka> [działka]. Jeśli nie podano nazwy działki, zostanie zmieniona długość okresu wynajmu działki na której stoisz."
"setduration-notRegistered": "Działka %0% nie jest działką do wynajęcia."
"setduration-wrongAmount": "'%0%' nie jest liczbą całkowitą."
"setduration-wrongFormat": "'%0%' nie jest poprawną jednostką czasu."
"setduration-success": "Okres wynajmu działki %lang:region% został zmieniony na '%duration%'."
"setduration-noLandlord": "Nie masz uprawnień do zmiany długości okresu wynajmu działki %lang:region%, ponieważ nie jesteś jej zarządcą."
"setduration-successRemoved": "Okres wynajmu działki %lang:region% został usunięty. Ustawiono domyślny okres wynajmu: %duration%."
"setup-noRegion": "W 2. linijce wymagana jest nazwa działki."
"setup-alreadyRentSign": "Działka jest już określona jako do wynajęcia. Aby dodać tabliczkę, utwórz nową z tekstem '[as]' w 1. linijce lub użyj komendy '/as addsign'."
"setup-alreadyOtherWorld": "Region który wybrałeś jest już dodany do AreaShop w innym świecie, regiony z innych światów potrzebują innych nazw."
"setup-alreadyBuySign": "Działka jest już określona jako na sprzedaż. Aby dodać tabliczkę, utwórz nową z tekstem '[as]' w 1. linijce lub użyj komendy '/as addsign'."
"setup-noDuration": "W 3. linijce jest wymagany okres wynajmu."
"setup-wrongDuration": "Podano niepoprawny okres wynajmu. Przykład: 1 d."
"setup-noPrice": "W 4. linijce wymagana jest cena wynajmu."
"setup-wrongPrice": "Podano niepoprawną cenę, użyj tylko cyfr."
"setup-rentSuccess": "Działka %lang:region% została poprawnie ustawiona jako do wynajęcia."
"setup-buySuccess": "Działka %lang:region% została poprawnie ustawiona jako na sprzedaż."
"setup-noPermissionRent": "Nie masz uprawnień do ustawiania działek do wynajęcia."
"setup-noPermissionBuy": "Nie masz uprawnień do ustawiania działek na sprzedaż."
"setup-couldNotDetect": "Znaleziono więcej niż jeden region o tym samym priorytecie bądź relacji parent-child. Podaj nazwę odpowiedniego regionu w 2. linijce (2 znalezione regiony: %lang:tRegion|%0%|% i %lang:tRegion|%1%|%)."
"setup-blacklisted": "Region %0% znajduje się na czarnej liście, dlatego nie może zostać ustawiony jako działka."
"setup-noPermission": "Nie masz uprawnień aby ustawić działkę o regionie '%0%' bądź nie jesteś jego memberem/ownerem."
"destroy-noPermissionRent": "Nie masz uprawnień do usuwania działek do wynajęcia."
"destroy-noPermissionBuy": "Nie masz uprawnień do usuwania działek na sprzedaż."
"destroy-successRent": "Działka %lang:region% została usunięta."
"destroy-successBuy": "Działka %lang:region% została usunięta."
"teleport-help": "Użycie: /as tp <działka> [tabliczka]."
"teleport-noRentOrBuy": "Działka %0% nie istnieje."
"teleport-noPermission": "Nie masz uprawnień do teleportowania się do swoich działek."
"teleport-noPermissionOther": "Nie masz uprawnień do teleportowania się do cudzych działek."
"teleport-noPermissionSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do swoich działek."
"teleport-noPermissionOtherSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do cudzych działek."
"teleport-noPermissionFriend": "Nie masz uprawnień do teleportowania się do działek, do których Cię dodano."
"teleport-noPermissionFriendSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do działek, do których Cię dodano."
"teleport-noPermissionAvailable": "Nie masz uprawnień do teleportowania się do dostępnych działek."
"teleport-noPermissionAvailableSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do dostępnych działek."
"teleport-success": "Teleportowano do działki %lang:region%."
"teleport-successSign": "Teleportowano do tabliczki należącej do działki %lang:region%."
"teleport-noSafe": "Nie znaleziono bezpiecznego miejsca do teleportacji na działce %lang:region% bądź przekroczono ilość prób teleportacji (%0%/%1%)."
"teleport-blocked": "Nie możesz się teleportować ponieważ cel jest poza działką, a musisz teleportować się wewnątrz działki."
"teleport-changedToSign": "Nie masz uprawnień do teleportacji na działkę. Teleportowano do tabliczki."
"teleport-changedToNoSign": "Nie znaleziono żadnej dostępnej tabliczki, nastąpiła próba teleportacji na działkę"
"teleport-wrongWorld": "Musisz znajdować się w świecie '%world%' aby teleportować się na działkę %lang:region%, a znajdujesz się obecnie w świecie '%0%'."
"setteleport-help": "Użycie: /as settp [działka] [reset]. Jeśli nie podano nazwy działki, zostanie ustawione miejsce teleportacji na działkę na której stoisz."
"setteleport-noPermission": "Nie masz uprawnień do ustawiania miejsc teleportacji na działki."
"setteleport-noPermissionOther": "Nie masz uprawnień do ustawiania miejsc teleportacji na cudze działki."
"setteleport-noRentOrBuy": "Działka %0% nie istnieje."
"setteleport-success": "Pomyślnie ustawiono miejsce teleportacji na działkę %lang:region%."
"setteleport-notInside": "Miejsce teleportacji musi zostać ustalone w obrębie działki."
"setteleport-reset": "Miejsce teleportacji na działkę %lang:region% zostało zresetowane."
"find-help": "Użycie: /as find <buy|rent> [maksymalnaCena] [grupa]."
"find-noPermission": "Nie masz uprawnień do wyszukiwania działek."
"find-success": "Znaleziono działkę typu '%0%': %lang:region% przy uwzględnieniu maksymalnej ceny równej Twojemu stanowi konta: %1%%2%."
"find-successMax": "Znaleziono działkę typu '%0%': %lang:region% przy uwzględnieniu podanej maksymalnej ceny równej %1%%2%."
"find-wrongMaxPrice": "Wpisana maksymalna cena '%0%' nie jest poprawną ceną."
"find-wrongGroup": "Grupa %0% nie istnieje."
"find-noneFound": "Nie znaleziono żadnej działki typu '%0%' przy uwzględnieniu maksymalnej ceny równej Twojemu stanowi konta: %1%%2%."
"find-noneFoundMax": "Nie znaleziono żadnej działki typu '%0%' przy uwzględnieniu podanej maksymalnej ceny równej %1%%2%."
"find-onlyInGroup": ", szukano tylko działek należących do grupy %0%."
"groupadd-help": "Użycie: /as groupadd <grupa> [działka]. Jeśli nie podano nazwy działki, do grupy zostaną dodane wszystkie działki zawarte w Twoim zaznaczeniu terenu."
"groupadd-noPermission": "Nie masz uprawnień do dodawania działek do grup."
"groupadd-success": "Działka %lang:region% została pomyślnie dodana do grupy '%0%', do grupy należą teraz działki w liczbie %1%."
"groupadd-failed": "Działka %lang:region% należy już do grupy '%0%'."
"groupadd-weSuccess": "Działki dodane do grupy %0%: [gray]%1%."
"groupadd-weFailed": "Działki, które były już w grupie %0%: [gray]%1%."
"groupdel-help": "Użycie: /as groupdel <grupa> [działka]. Jeśli nie podano nazwy działki, z grupy zostaną usunięte wszystkie działki zawarte w Twoim zaznaczeniu terenu."
"groupdel-noPermission": "Nie masz uprawnień do usuwania działek z grup."
"groupdel-wrongGroup": "Grupa %0% nie istnieje, wpisz komendę '/as grouplist' aby wyświetlić listę grup."
"groupdel-success": "Działka %lang:region% została pomyślnie usunięta z grupy '%0%', do grupy należą teraz działki w liczbie %1%."
"groupdel-failed": "Działka %lang:region% nie należy do grupy '%0%'."
"groupdel-weSuccess": "Działki usunięte z grupy %0%: [gray]%1%."
"groupdel-weFailed": "Działki, które nie były w grupie %0%: [gray]%1%."
"grouplist-noPermission": "Nie masz uprawnień do wyświetlania listy istniejących grup."
"grouplist-noGroups": "Nie istnieje żadna grupa."
"grouplist-success": "Istnieją następujące grupy: [gray]%0%."
"groupinfo-help": "Użycie: /as groupinfo <grupa>."
"groupinfo-noPermission": "Nie masz uprawnień do wyświetlania informacji o grupach."
"groupinfo-noGroup": "Grupa '%0%' nie istnieje, użyj komendy /as grouplist aby wyświetlić listę istniejących grup."
"groupinfo-members": "Do grupy %0% należą następujące działki: [gray]%1%."
"groupinfo-noMembers": "Do grupy %0% nie należy żadna działka."
"schemevent-help": "Użycie: /as schemevent <działka> <created|deleted|rented|unrented|bought|sold>."
"schemevent-wrongEvent": "Wydarzenie '%0%' nie istnieje, wywołaj jedno z następujących wydarzeń: [gray]%1%."
"schemevent-success": "Wydarzenie '%0%' zostało pomyślnie wywołane dla działki %lang:region%."
"schemevent-noPermission": "Nie masz uprawnień do wywoływania wydarzeń."
"add-help": "Użycie: /as add <rent|buy> [działka] [świat]."
"add-noPermission": "Nie masz uprawnień do ustawiania działek."
"add-success": "Pomyślnie ustawiono jako działka '%0%' regiony: [gray]%1%."
"add-failed": "Regiony wcześniej zarejestrowane jako działki: [gray]%0%."
"add-failedOtherWorld": "Region zarejestrowany w innym świecie: [gray] %0%."
"add-blacklisted": "Na czarnej liście: [gray]%0%."
"add-specifyWorld": "Używając konsoli musisz sprecyzować świat regionu."
"add-incorrectWorld": "Świat '%0%' nie istnieje, zwróć uwagę na wielkość liter."
"add-noPermissionRegions": "Brak uprawnień do rejestracji tych regionów: [gray]%0%."
"add-noPermissionOwnerMember": "[gray]Nie masz uprawnień do ustawiania cudzych regionów jako działek."
"del-noPermission": "Nie masz uprawnień do usuwania działek."
"del-success": "Usunięto działki: [gray]%0%."
"del-failed": "Brak uprawnień do odrejestrowania działek (lub działki nie istnieją): [gray]%0%."
"addsign-help": "Użycie: /as addsign [działka] [profil]."
"addsign-noSign": "Nie patrzysz na żadną tabliczkę."
"addsign-noRegions": "Nie znaleziono żadnej działki w pozycji tabliczki."
"addSign-notRegistered": "Regiony, które nie są zarejestrowane jako działki: %0% (regiony najpierw muszą zostać dodane, zanim będzie możliwe dodanie tabliczki)."
"addsign-couldNotDetect": "Znaleziono więcej niż jedną działkę w obrębie tabliczki, podaj nazwę działki jako dodatkowy argument (2 znalezione działki: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "Znaleziono więcej niż jedną działkę w obrębie tabliczki, podaj nazwę odpowiedniej działki w 2. linijce (2 znalezione działki: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "Podany profil nie istnieje, użyj jednego z następujących: [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Profil %0%"
- " hover: %lang:action|Użyj tego profilu|%"
- " command: /areashop linksigns %0%"
"addsign-success": "Tabliczka została pomyślnie dodana do działki %lang:region%."
"addsign-successProfile": "Tabliczka została pomyślnie dodana do działki %lang:region% o profilu %0%."
"addsign-alreadyRegistered": "Ta tabliczka jest już dodana do działki %lang:region%."
"addsign-noPermission": "Nie masz uprawnień do dodawania tabliczek do działek."
"delsign-noSign": "Nie patrzysz na żadną tabliczkę."
"delsign-noPermission": "Nie masz uprawnień do usuwania tabliczek z działek."
"delsign-noRegion": "Ta tabliczka nie należy do żadnej działki."
"delsign-success": "Tabliczka została pomyślnie usunięta z działki %lang:region%."
"me-noPermission": "Nie masz uprawnień do sprawdzenia stanu swoich działek."
"me-header": "Działki gracza %lang:tPlayer|%0%|%:"
"me-notAPlayer": "Tylko gracze mogą mieć działki."
"me-rentLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "Wygasa za %timeleft%"
- " hover: do %until%"
- ")."
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
"me-friendLine":
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "należy do gracza %lang:player%"
- " hover: Dodano Cię do tej działki"
- ")."
"me-nothing": "Gracz %lang:tPlayer|%0%|% nie posiada żadnej działki ani nie jest do żadnej dodany."
"me-noPlayer": "Nie znaleziono gracza %0%, zwróć uwagę na wielkość liter."
"me-clickHint": "[gray][italic]Kliknij na nazwę działki, aby wyświetlić informacje o niej."
"setowner-help": "Użycie: /as setowner <nick> [działka]. Jeśli nie podano nazwy działki, zostanie ustawiony właściciel/najemca działki na której stoisz."
"setowner-noPermission": "Nie masz uprawnień do ustawiania właścicieli/najemców działek."
"setowner-noPermissionRent": "Nie masz uprawnień do ustawiania najemców działek."
"setowner-noPermissionBuy": "Nie masz uprawnień do ustawiania właścicieli działek."
"setowner-notRegistered": "Podana działka nie istnieje."
"setowner-noPlayer": "Nie udało się uzyskać UUID podanego gracza: %0%."
"setowner-succesRent": "Pomyślnie ustawiono gracza %lang:player% jako najemcę działki %lang:region%, czas wynajmu kończy się %until% (pozostały czas to %timeleft%)."
"setowner-succesRentExtend": "Gracz %lang:player% jest już najemcą tej działki, więc przedłużono czas wynajmu o %duration%, obecny czas wynajmu kończy się %until% (pozostały czas to %timeleft%)."
"setowner-succesBuy": "Pomyślnie ustawiono gracza %lang:player% jako właściciela działki %lang:region%."
"resell-help": "Użycie: /as resell <cena> [działka]. Jeśli nie podano nazwy działki, w status odsprzedaży wejdzie działka na której stoisz."
"resell-wrongPrice": "'%0%' nie jest poprawną ceną."
"resell-notRegistered": "Działka %0% nie istnieje."
"resell-notBought": "Działka %lang:region% nie może wejść w status odsprzedaży, ponieważ nie została jeszcze kupiona."
"resell-success": "Działka %lang:region% pomyślnie weszła w status odsprzedaży. Cena odkupienia: %resellprice%."
"resell-noPermission": "Nie masz uprawnień do odsprzedawania swoich działek."
"resell-noPermissionOther": "Nie masz uprawnień do odsprzedawania cudzych działek."
"resell-disabled": "Możliwość odsprzedaży została wyłączona dla tej działki."
"stopresell-help": "Użycie: /as stopresell [działka]. Jeśli nie podano nazwy działki, zostanie zaprzestana odsprzedaż działki na której stoisz."
"stopresell-notRegistered": "Działka %0% nie istnieje."
"stopresell-notResell": "Nie możesz zaprzestać odsprzedaży działki %lang:region%, ponieważ nie jest ona odsprzedawana."
"stopresell-success": "Pomyślnie zaprzestano odsprzedaży działki %lang:region%."
"stopresell-noPermission": "Nie masz uprawnień do zaprzestawania odsprzedaży swoich działek."
"stopresell-noPermissionOther": "Nie masz uprawnień do zaprzestawania odsprzedaży cudzych działek."
"addfriend-help": "Użycie: /as addfriend <nick> [działka]. Jeśli nie podano nazwy działki, podany gracz zostanie dodany do działki na której stoisz."
"addfriend-noPermissionOther": "Nie masz uprawnień do dodawania graczy do cudzych działek."
"addfriend-noPermission": "Nie masz uprawnień do dodawania graczy do swoich działek."
"addfriend-successOther": "Gracz %lang:tPlayer|%0%|% został pomyślnie dodany do działki %lang:region%."
"addfriend-success": "Dodano gracza %lang:tPlayer|%0%|% do działki %lang:region%."
"addfriend-alreadyAdded": "Gracz %lang:tPlayer|%0%|% jest już dodany do działki %lang:region%."
"addfriend-self": "Niemożliwe jest dodanie do działki jej właściciela/najemcy."
"addfriend-noOwner": "Niemożliwe jest dodanie gracza do niczyjej działki."
"addfriend-notVisited": "Nie możesz dodać gracza %0%, ponieważ nigdy nie pojawił się na serwerze."
"delfriend-help": "Użycie: /as delfriend <nick> [działka]. Jeśli nie podano nazwy działki, podany gracz zostanie usunięty z działki na której stoisz."
"delfriend-noPermissionOther": "Nie masz uprawnień do usuwania graczy z cudzych działek."
"delfriend-noPermission": "Nie masz uprawnień do usuwania graczy ze swoich działek."
"delfriend-successOther": "Gracz %lang:tPlayer|%0%|% został pomyślnie usunięty z działki %lang:region%."
"delfriend-success": "Usunięto gracza %lang:tPlayer|%0%|% z działki %lang:region%."
"delfriend-notAdded": "Gracz %lang:tPlayer|%0%|% nie jest dodany do działki %lang:region%."
"delfriend-noOwner": "Niemożliwe jest usunięcie gracza z niczyjej działki."
"linksigns-multipleRegions": "Znaleziono następujące działki: [gray]%0%."
"linksigns-multipleRegionsAdvice": "Kliknij LPM ponownie lub użyj komendy '/as linksigns' aby wyłączyć tryb wiązania tabliczki z działką."
"linksigns-noRegions": "Nie znaleziono żadnej działki w kierunku, na który patrzysz, upewnij się, że region został ustawiony jako działka [gray](maksymalny zasięg to 100 bloków)."
"linksigns-regionFound": "Zaznaczono działkę %lang:region, teraz zaznacz tabliczkę klikając na nią LPM aby ją połączyć z działką."
"linksigns-signFound": "Zaznaczono tabliczkę na pozycji (%0%, %1%, %2%), teraz zaznacz działkę klikając PPM w kierunku jej obszaru."
"linksigns-noSign": "Nie znaleziono żadnej tabliczki w kierunku, na który patrzysz, upewnij się, że patrzysz prosto na tabliczkę [gray](maksymalny zasięg to 100 bloków)."
"linksigns-alreadyRegistered": "Znaleziona tabliczka jest już dodana do działki %lang:region%, kliknij jeszcze raz aby dodać inną tabliczkę."
"linksigns-first": "Włączono tryb wiązania tabliczki z działką."
"linksigns-next": "Kliknij LPM aby zaznaczyć tabliczkę, kliknij PPM aby zaznaczyć działkę, użyj komendy /as linksigns aby wyjść z trybu."
"linksigns-noPermission": "Nie masz uprawnień do wejścia w trym wiązania tabliczki z działką."
"linksigns-stopped": "Wyłączono tryb wiązania tabliczki z działką."
"stack-help":
- "Użycie: /as stack <ilość> <X> <nazwa> <rent|buy> [grupa].[break]"
- " [gray]<ilosć> Ilość działek do ustawienia.[break]"
- " [gray]<X> Dystans X bloków pomiędzy działkami.[break]"
- " [gray]<nazwa> Nazwa działki (jej numer nastąpi po nazwie).[break]"
- " [gray]<rent|buy> Określ działki jako do wynajęcia lub na sprzedaż.[break]"
- " [gray][group] Grupa, do której zostaną przydzielone działki.[break]"
- " [gray]Działki będą tworzone w kierunku, na który patrzysz."
"stack-accepted": "Rozpoczęto ustawianie %0% działek typu '%1%' w odstępie %2% bloków od siebie, nazwy działek będą zaczynały się od %3% oraz kończyły odpowiednią liczbą w kolejności.%4%"
"stack-addToGroup": "Działki zostaną przydzielone do grupy '%0%'."
"stack-noPermission": "Nie masz uprawnień do masowego ustawiania działek."
"stack-wrongAmount": "'%0%' nie jest poprawną ilością działek."
"stack-wrongGap": "'%0%' nie jest poprawną liczbą bloków odstępu pomiędzy działkami."
"stack-noSelection": "Nie został zaznaczony pierwszy region, od którego ma zostać rozpoczęte ustawianie działek."
"stack-addStart": "[gray]Ustawianie %0% działek w tempie %1% na sekundę."
"stack-addComplete": "[gray]Ustawiono działki w liczbie %0% o typie '%1%'."
"stack-tooHigh": ", %0% działek zostało pominiętych z powodu ich wysokości większej niż Y=256."
"stack-tooLow": ", %0% działek zostało pominiętych z powodu ich wysokości mniejszej niż Y=0."
"stack-unclearDirection": "Patrz dokładnie na jeden z 6 kierunków: północ, południe, wschód, zachód, góra, dół; obecnie wykryto kierunek '%0%'."
"setlandlord-help": "Użycie: /as setlandlord <nick> [działka]. Jeśli nie podano nazwy działki, zostanie ustawiony zarządca działki na której stoisz."
"setlandlord-noPermission": "Nie masz uprawnień do ustawiania zarządców działek."
"setlandlord-success": "Gracz %lang:landlord% został pomyślnie ustalony zarządcą działki %lang:region%."
"message-help": "Użycie: /as message <nick> <treść>."
"message-noPermission": "Nie masz uprawnień do wysyłania wiadomości AreaShop."
"message-notOnline": "Gracz %0% jest nieobecny."
"import-help": "Użycie: /as import RegionForSale."
"import-wrongSource": "Sprezycuj skąd chcesz zaimportować dane, opcje: RegionForSale."
"import-noPluginFolder": "Nie znaleziono folderu %0%, upewnij się, że importujesz dane z poprawnego źródła."
"import-noWorldsFolder": "Nie istnieje folder 'plugins/RegionForSale/worlds', więc nic nie mogło zostać zaimportowane."
"import-confirm": "Jesteś pewny/a, że chcesz zaimportować wszystkie regiony z RegionForSale?"
"import-start": "Rozpoczęto import danych z RegionForSale:"
"import-doWorld": "[darkgreen][bold]► Świat %0%:"
"import-noBukkitWorld": "[red]Nie znaleziono świata w Bukkicie."
"import-noRegionManager": "[red]Nie znaleziono RegionManagera z pluginu WorldGuard, czy regiony są włączone w tym świecie?"
"import-noRegions": "[red]Nie znaleziono pliku regions.yml."
"import-loadRegionsFailed": "[red]Nie udało się załadować pliku regions.yml w: %0%"
"import-invalidRegionSection": "[red]Niepoprawna sekcja w pliku regions.yml: %0%."
"import-noWorldGuardRegion": "[red]Nie znaleziono regionu WorldGuard: %0%."
"import-noWorldGuardRegionParent": "[red]Nie znaleziono regionu WorldGuard podpiętego pod inny region: %0%."
"import-buyAndRent": "[gold]Działka %0% może zostać kupiona oraz wynajęta, ustawianie działki jako do kupienia (nie może mieć dwóch typów jednocześnie)."
"import-noBuyAndNoRent": "[red]Działka %0% nie może zostać ani kupiona, ani wynajęta, pomijanie importu."
"import-imported": "[green]Działka %lang:tRegion|%0%|% zaimportowana."
"import-loadWorldConfigFailed": "[red]Wystąpił błąd podczas ładowania pliku świata config.yml: %0%."
"import-improperParentRegion": "[red]Parametry regionu %0% nie mogą zostać odczytane."
"import-alreadyAdded": "[red]Region '%0%' już został dodany."
"import-alreadyAddedOtherWorld": "[red]Region '%0%' został już ustawiony jako działka w świecie %1%, działki w różnych światach nie mogą mieć tej samej nazwy."
"import-invalidSignLocation": "[red]Nie udało się zaimportować tabliczki działki '%0%', błędna pozycja: '%1%'."
"import-signAlreadyAdded": "[red]Pominięto dodanie tabliczki w pozycji '%1%' do działki '%0%', jest ona już dodana do działki '%2%'."
"import-moneyBackFailed": "[red]Nie udało się załadować ceny kupna '%0%' oraz ceny sprzedaży '%1%' aby ustawić procent zwrotu przy sprzedaży."
"confirm-rent":
- "%lang:prefix%Czy na pewno chcesz wynająć działkę %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby wynająć %0%|%"
- " hover: %lang:action|Wynajmij działkę %0%|%"
- " command: /areashop rent %0%"
"confirm-extend":
- "%lang:prefix%Czy na pewno chcesz przedłużyć wynajem działki %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby przedłużyć wynajem działki %0%|%"
- " hover: %lang:action|Przedłuż wynajem działki %0%|%"
- " command: /areashop rent %0%"
"confirm-unrent":
- "%lang:prefix%Czy na pewno chcesz zwolnić działkę %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby zwolnić działkę %0%|%"
- " hover: %lang:action|Zwolnij działkę %0%|%"
- " command: /areashop unrent %0%"
"confirm-buy":
- "%lang:prefix%Czy na pewno chcesz kupić działkę %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby kupić działkę %0%|%"
- " hover: %lang:action|Kup działkę%0%|%"
- " command: /areashop buy %0%"
"confirm-sell":
- "%lang:prefix%Czy na pewno chcesz sprzedać działkę %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby sprzedać działkę %0%|%"
- " hover: %lang:action|Sprzedaj działkę %0%|%"
- " command: /areashop sell %0%"
"timeleft-years": "%0% lat"
"timeleft-months": "%0% miesięcy"
"timeleft-days": "%0% dni"
"timeleft-hours": "%0% godzin"
"timeleft-minutes": "%0% minut"
"timeleft-second": "%0% sekunda"
"timeleft-seconds": "%0% sekund"
"timeleft-ended": "Upłynął"
"greeting-forrent": "Wynajmij działkę %region% za %price% na %duration%."
"greeting-rented": "Działka %region% wynajęta przez gracza %player% do %until%."
"greeting-forsale": "Kup działkę %region% za %price%."
"greeting-bought": "Działka %region% kupiona przez gracza %player%."
"greeting-resale": "Odkup działkę %region% za %resellprice% od gracza %player%."
"update-playerNotify":
- "[darkgreen]Dostępna jest aktualizacja pluginu AreaShop z wersji V%0% na wersję V%1%. Pobierz najnowszą wersję ze strony "
- "[bold]Spigota[/bold]"
- " hover: %lang:action|Przejdź do strony pluginu na Spigocie|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (i pozostaw recenzję pluginu)."
+525
View File
@@ -0,0 +1,525 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Russian language file, plugin version 2.5.0, 395/428 messages are translated (92%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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-notRegistered": "Регион '%0%' недоступен в AreaShop."
"cmd-noRegion": "'%0%' не является допустимым регионом WorldGuard."
"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": "Регион '%0%' недоступен для аренды (не зарегистрирован в AreaShop или регион можно только купить)."
"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-expiringSoon": "Ваш регион %lang:tRegion|%0%|% осталось %1% , не забудьте продлить аренду, если хотите его сохранить."
"rent-alreadyAtFull": "%lang:region% уже на уровне или выше максимального времени аренды, вы не можете продлить его еще.."
"buy-help": "/as buy [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
"buy-noPermission": "У Вас нет прав для покупки региона."
"buy-noPermissionResell": "У Вас нет прав для покупки региона в режиме перепродажи."
"buy-noPermissionNoResell": "У Вас нет прав для покупки региона, который не находится в режиме перепродажи."
"buy-notBuyable": "Регион '%0%' недоступен для покупки (не зарегистрирован в AreaShop или регион только для аренды)."
"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-noPermission": "Недостаточно полномочий для того, чтобы перезагрузить конфиги плагина."
"reload-updateCommandChanged": "'/as updaterents' и '/as updatebuys' были удалены, '/as reload' теперь будет также обновлять регионы, используйте взамен эту команду."
"info-help":
- "/as info[break]"
- " %lang:command|all|/as info all|%[break]"
- " %lang:command|rented|/as info rented|% [group] [page][break]"
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
- " %lang:command|sold|/as info sold|% [group] [page][break]"
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
- " %lang:command|region|/as info region|% [region]"
"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-pageNoPrevious":
- " [darkgray][bold]◄Предыдущая[/bold] "
- " hover: Это первая страница"
"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-regionRestoringRent": "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после завершения аренды)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после продажи)."
"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-noPermissionAvailable": "У вас нет разрешения на телепорт в имеющийся регионы."
"teleport-noPermissionAvailableSign": "У вас нет разрешения на телепорт к табличкам имеющийся регионов."
"teleport-success": "Вы телепортированы к %lang:region%."
"teleport-successSign": "Вы телепортированы к табличке возле %lang:region%."
"teleport-noSafe": "Сохранение позиции не найдено в %lang:region%, нет места в регионе или превышен максимальный лимит (%0%/%1%)."
"teleport-blocked": "Вы не можете телепортироваться, потому что положение находится за пределами региона, и вы вынуждены телепортироваться во внутрь."
"teleport-changedToSign": "У вас есть только разрешение на телепортироваться к табличке, а не во внутрь региона, телепортация к табличке."
"teleport-changedToNoSign": "Ни одна табличка не доступна что бы телепортироваться, попытка телепортироваться во внутрь региона вместо этого."
"teleport-wrongWorld": "Вы должны быть в мире '%world%' чтобы телепортироватся на %lang:region%, только вы находитесь в мире '%0%'."
"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-wrongGroup": "Группа %0% не найдена, используй '/as grouplist' для просмотра зарегистрированных групп."
"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% в секунду."
"stack-addComplete": "[gray]Добавлено %0% регионов%1%."
"stack-tooHigh": ", %0% регионов пропущены, потому что они были выше Y=256"
"stack-tooLow": ", %0% регионов пропущены, потому что они были ниже Y=0"
"stack-unclearDirection": "Пожалуйста, посмотрите четко на север, восток, юг, запад, вверх или вниз, в настоящее время обнаружено %0%."
"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% может быть куплен за %resellprice% в %player%."
"update-playerNotify":
- "[darkgreen]Обновление для AreaShop V%0% до AreaShop V%1% доступно, получить последнюю версию на "
- "[bold]Spigot[/bold]"
- " hover: %lang:action|Перейти к странице AreaShop на Spigot|%"
- " link: https://www.spigotmc.org/resources/areashop.2991/"
- " (И оставить отзыв)."
+492
View File
@@ -0,0 +1,492 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Swedish language file, plugin version 2.5.0, 376/428 messages are translated (88%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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-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-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-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-pageNoPrevious":
- " [darkgray][bold]◄Föregående[/bold] "
- " hover: Detta är redan första sidan"
"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%."
+518
View File
@@ -0,0 +1,518 @@
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
# ║ Chinese language file, plugin version 2.5.0, 393/428 messages are translated (92%)
# ║
# ║ 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`
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
# ║ 4: Change the messages in the new file to your liking
# ║ 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: Region %0%"
- " hover: %lang:action|区域信息|%"
- " command: /areashop info region %0%"
"player": "%lang:tPlayer|%player%|%"
"tPlayer":
- "[bold]%0%[/bold]"
- " hover: Player %0%"
- " hover: %lang:action|区域 %0%|%"
- " command: /areashop info player %0%"
"landlord":
- "[bold]%landlord%[/bold]"
- " hover: Landlord %landlord%"
- " hover: %lang:action|区域 %landlord%|%"
- " command: /areashop info player %landlord%"
"total-maximum": "你不能租用和购买超过总共的 %0% 区域 (你在区域 '%2%'已经拥有了 %1% 区域商店)."
"general-notReady": "区域商店还没有加载成功,请稍候..."
"general-noWorld": "你无法这样做, 在这个世界 %lang:region% 无法使用 (当前世界:'%world%')."
"general-noRegion": "你无法这样做, 这块区域商店无法使用 (区域: %lang:region%)."
"general-noEconomy": "没有安装经济插件或者安装有误,请通知服务器管理员..."
"general-cancelled": "%0%"
"cmd-notValid": "你输入的命令不正确, 用法 '/as help' 获取更多信息."
"cmd-onlyByPlayer": "这个命令只能给玩家使用."
"cmd-weOnlyByPlayer": "请使用 创世神 选择区域,指定区域后再使用指令."
"cmd-noSelection": "你不能使用 创世神 的选择功能."
"cmd-noRegionsFound": "你选择的区域没有区域商店."
"cmd-noWERegionsFound": "没有找到与你的选择相交的WorldEdit区域."
"cmd-notRegistered": "区域 '%0%' 再区域商店中不可用."
"cmd-noRegion": "'%0%' 不是一个有效的WorldGuard区域."
"cmd-noRegionsAtLocation": "在你的位置找不到你想要的区域类型,请指定区域再使用指令."
"cmd-moreRegionsAtLocation": "在你的位置找到多个区域,请指定区域再使用指令."
"cmd-automaticRegionOnlyByPlayer": "自动确定区域只适用于玩家,请指定区域再使用指令."
"help-header": "&f帮助信息,可以点击彩色字体使用命令————&2由 BenLi豪 翻译&f."
"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|% 移除已注册的区域商店."
"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%个区域商店 (你所在的'%2%'权限组只能租用%1%个商店)."
"rent-maximumExtend": "你不能再续费,因为你超过 %0% 的区域 (你所在的'%2%'权限组只能租用%1%个商店)."
"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-expiringSoon": "你的区域 %lang:tRegion|%0%|% 剩下 %1%,如果你想保留就续费(如果不续费请提前清理你租用区域的物品)."
"rent-alreadyAtFull": "%lang:region% 已经是最长的租金时间了,你不能再延长了."
"buy-help": "/as buy [region], 你所在的区域将被选定使用,如果没有你没有明确的选择自己要的区域."
"buy-noPermission": "你没有购买区域的权限.."
"buy-noPermissionResell": "你无权在转售模式下购买区域."
"buy-noPermissionNoResell": "你没有权限购买不在转售模式的区域."
"buy-notBuyable": "区域 %lang:region% 不能购买."
"buy-maximum": "你不能为购买该区域,因为你超过%0%区域 (你目前在 %1% 组已经拥有 '%2%')."
"buy-payError": "付款后出现问题,请稍后再试."
"buy-succes": "祝贺你成功购买了该区域: %lang:region%."
"buy-successResale": "你在玩家 %lang:tPlayer|%0%|%那里成功购买了区域: %lang:region% ."
"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 [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"unrent-noPermission": "你没有租用地区的权限."
"unrent-noPermissionOther": "你没有权限出租另一个地区."
"unrent-notRegistered": "该地区由于没有注册出租功能而无法租用."
"unrent-notRented": "该区域不可以放弃出租,因为它还没有被玩家租用."
"unrent-unrented": "%lang:player% 的 %lang:region% 已过期."
"unrent-expired": "你的区域商店 %lang:region% 已过期."
"sell-help": "/as sell [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"sell-notRegistered": "该地区由于没有注册购买而无法出售."
"sell-notBought": "该地区不能出售,因为它不属于你."
"sell-sold": "%lang:player% 的 %lang:region% 已售出."
"sell-noPermission": "你没有出售地区商店的权限."
"sell-noPermissionOther": "你没有权限出售该区域。"
"reload-reloading": "重新加载所有文件,并检查租金和更新区域."
"reload-noPermission": "你没有权限重新加载配置文件."
"reload-updateCommandChanged": "'/as updaterents' 和 '/as updatebuys' 已被移除, '/as reload' 也会更新现在的区域,所以使用该命令."
"info-help":
- "/as info[break]"
- " %lang:command|所有相关|/as info all|%[break]"
- " %lang:command|已被租用|/as info rented|% [group] [page][break]"
- " %lang:command|等待被租用的商店|/as info forrent|% [group] [page][break]"
- " %lang:command|已被购买|/as info sold|% [group] [page][break]"
- " %lang:command|等待被购买的商店|/as info forsale|% [group] [page][break]"
- " %lang:command|转售中的商店|/as info reselling|% [group] [page][break]"
- " %lang:command|组里面能使用的区域商店|/as info nogroup [page]|%[break]"
- " %lang:command|当前区域商店信息|/as info region|% [region]"
"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]出租每 %duration%需要 %price% 金币."
"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-pageNoPrevious":
- " [darkgray][bold]◄前一页[/bold] "
- " hover: 前一页"
"info-pageNoNext":
- " [darkgray][bold]下一页►[/bold]"
- " hover: 这已经是最后一页了"
"info-playerHelp": "/as info player <name>."
"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 [name], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"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]每 %duration%需要%price%金币."
"info-regionCanBeRented":
- "[darkgreen][bold]►[reset] "
- "[bold]出租信息[/bold]"
- " hover: 出租 %region% 每 %duration% 需要 %price% 金币"
- " hover: %lang:action|出租 %region%|%"
- " command: /areashop rent %region%"
- ": [gray]每 %duration%需要%price%金币."
"info-regionCanBeBought":
- "[darkgreen][bold]►[reset] "
- "[bold]Buy for[/bold]"
- " hover: Buy %region% for %price%"
- " hover: %lang:action|Buy %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 %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-regionRestoringRent": "[darkgreen][bold]►[reset] 恢复启用 [gray](区域将重置)."
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] 恢复启用 [gray](区域将重新出售)."
"info-regionLandlord": "[darkgreen][bold]►[reset] 区域主人: [gray]%lang:landlord% (收到金币)."
"info-regionNotExisting": "指定区域未注册: %0%."
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
"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> [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"setprice-notRegistered": "指定区域未注册: %0%."
"setprice-wrongPrice": "'%0%' 不是有效的价格."
"setprice-successRent": "区域价格%lang:region% 改为 每 %duration%需要%price%金币."
"setprice-successBuy": "区域价格 %lang:region% 改为 %price%."
"setprice-successRemoved": " %lang:region% 的租期价格已被删除, 现在将使用一个组或default.yml文件中的租期价格, 新的租期价格: %price%."
"setprice-noLandlord": "你没有权限更改价格,因为你不是 %lang:region% 的主人."
"setduration-noPermission": "你没有权限更改出租期限."
"setduration-help": "/as setduration <amount> <identifier> [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"setduration-notRegistered": "%0% 区域还没有注册出租."
"setduration-wrongAmount": "'%0%'不是有效的数量,请使用一个整数."
"setduration-wrongFormat": "'%0%' 不正确的时间格式,请检查清楚."
"setduration-success": "租期时间为:%lang:region% 现在已改为:'%duration%'."
"setduration-noLandlord": "你没有更改租期时间的权限,因为你不是 %lang:region% 的主人."
"setduration-successRemoved": " %lang:region% 的租期时间已被删除, 现在将使用一个组或default.yml文件中的默认租期时间, 新的租期时间: %duration%."
"setup-noRegion": "你没有在第二行指定区域."
"setup-alreadyRentSign": "你指定的区域已经添加到区域商店作为出售区域, 给木牌第一行添加 [as] 或者使用指令 '/as addsign'."
"setup-alreadyBuySign": "你指定的区域已经添加到区域商店作为购买区域, 给木牌第一行添加 [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%|% and %lang:tRegion|%1%|%)."
"setup-blacklisted": "%0% 在黑名单上,不能添加到区域商店."
"setup-noPermission": "你不能添加区域' '%0%', 你不是所有者/成员或没有权限."
"destroy-noPermissionRent": "你没有注销租赁区域的权限."
"destroy-noPermissionBuy": "你无权取消注册购买区域."
"destroy-successRent": "%lang:region% 区域成功注销出租."
"destroy-successBuy": "%lang:region% 区域成功注销购买."
"teleport-help": "/as tp <region> [木牌ID]."
"teleport-noRentOrBuy": "指定区域未注册: %0%."
"teleport-noPermission": "你没有权限传送到你所在的区域."
"teleport-noPermissionOther": "你没有权限传送到不属于你的区域."
"teleport-noPermissionSign": "你没有权限传送到你所在区域的木牌位置."
"teleport-noPermissionOtherSign": "你没有权限传送到你没拥有的区域的木牌位置."
"teleport-noPermissionFriend": "你没有权限作为好友的身份传送到该区域."
"teleport-noPermissionFriendSign": "你没有权限传送到你添加好友的区域木牌位置."
"teleport-noPermissionAvailable": "你没有权限传送到可使用的区域."
"teleport-noPermissionAvailableSign": "你没有权限传送到可使用区域的木牌位置."
"teleport-success": "传送到 %lang:region%中..."
"teleport-successSign": "你传送到 %lang:region% 的木牌位置附近."
"teleport-noSafe": "在区域 %lang:region%中找不到安全位置, 区域内没有具体的点或超过最大尝试次数 (%0%/%1%)."
"teleport-blocked": "你不能传送,因为位置在该区域以外,你被迫传送到里面."
"teleport-changedToSign": "你只能传送到该区域的木牌地点,而不是在区域内传送."
"teleport-changedToNoSign": "没有木牌可以传送,尝试在该区域内传送."
"setteleport-help": "/as settp [region] [reset], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"setteleport-noPermission": "你没有设置传送位置的权限."
"setteleport-noPermissionOther": "你没有权限给不属于你的区域设置传送点."
"setteleport-noRentOrBuy": "指定区域未注册到区域商店: %0%."
"setteleport-success": "区域%lang:region% 传送点已设置成功."
"setteleport-notInside": "该地点必须在该区域内."
"setteleport-reset": "%lang:region% 的传送位置已重置."
"find-help": "/as find <buy|rent> [最高价格] [group]."
"find-noPermission": "你没有权限搜索区域和传送到那里."
"find-success": "发现 %0% 区域: %lang:region%, 以你的身上金币的最高价格进行搜索: %1%%2%."
"find-successMax": "发现 %0% 区域,同时以最高价格%1%%2%进行搜索"
"find-wrongMaxPrice": "指定的最高价格不是正确的数字: %0%."
"find-wrongGroup": "指定的权限组不存在: %0%."
"find-noneFound": "在你的余额最大价格搜索时找不到%0%的区域:%1%%2%."
"find-noneFoundMax": "在最大价格为%1%%2%的情况下搜索时找不到要%0%的区域."
"find-onlyInGroup": ", 只搜索权限组中的区域: %0%."
"groupadd-help": "/as groupadd <group> [region], 如果没有指定区域,使用创世神选择区域."
"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> [region], 如果没有指定区域,使用创世神选择区域."
"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 <group>."
"groupinfo-noPermission": "你没有权限显示有关该权限组的信息."
"groupinfo-noGroup": "没有任何权限组注册该名称 '%0%', 使用 /as grouplist 检查权限组."
"groupinfo-members": "以下区域是权限权限组 %0% 的成员: [gray]%1%."
"groupinfo-noMembers": "权限组 %0% 没有任何成员."
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>...<创建|删除|租用|停租|购买|出售>."
"schemevent-wrongEvent": "指定事件 '%0%' 不存在, 请使用以下内容: [gray]%1%."
"schemevent-success": "%lang:region% 已成功触发事件'%0%'."
"schemevent-noPermission": "你没有触发schematic事件的权限."
"add-help": "/as add <rent|buy> [区域] [世界]."
"add-noPermission": "你没有将区域添加到区域商店的权限."
"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 [region] [profile]."
"addsign-noSign": "你没有对准木牌."
"addsign-noRegions": "木牌周围没有发现区域."
"addsign-couldNotDetect": "在木牌附近找到多个区域,请指定区域再使用指令 (2个被发现的区域: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-couldNotDetectSign": "在木牌附近找到多个区域, 指定第二行的区域(2个被发现的区域: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
"addsign-wrongProfile": "指定的配置文件不存在,请使用以下其中一个(检查配置): [gray]%0%."
"addsign-profile":
- "[bold]%0%[/bold]"
- " hover: Signprofile %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": "该木牌不属于区域商店."
"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 <玩家> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"setowner-noPermission": "你没有设置区域所有者的权限."
"setowner-noPermissionRent": "你没有设置租用区域所有者的权限."
"setowner-noPermissionBuy": "你没有设置购买区域所有者的权限."
"setowner-notRegistered": "指定区域未注册到区域商店,区域的主人设置失败."
"setowner-noPlayer": "无法获取该玩家的 UUID : %0%."
"setowner-succesRent": " &2&l%lang:region%&r的主人成功更改为&2&l%lang:player%&r, 租用直到&2&l%until%%&r(&2&l%timeleft%&r)."
"setowner-succesRentExtend": "该区域的主人已经是&2&l%lang:player%&r, 续费时间为&2&l'%duration%'&r, 租用期限为 &2&l%until%&r(&2&l%timeleft%&r)."
"setowner-succesBuy": " &2&l%lang:region%&r的主人成功更改为&2&l%lang:player%&r."
"resell-help": "/as resell <价格> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"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 <玩家> [区域],如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"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 <玩家> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
"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": "在鼠标准心方向找不到区域商店,确保将该区域已被添加到了区域商店 [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 to stop."
"linksigns-noPermission": "你没有进入批量牌子关联模式的权限。"
"linksigns-stopped": "退出牌子关联模式."
"stack-help":
- "/as stack <数量> <区域商店的间隔> <名称> <rent|buy> [权限组].[break]"
- " [gray]<amount> 要创建的区域数量[break]"
- " [gray]<gap> 阻止区域之间的间隔.[break]"
- " [gray]<name> 区域名称(数字将在后面).[break]"
- " [gray]<rent|buy> 出租或购买区域.[break]"
- " [gray][group] 将创建的区域添加到权限组.[break]"
- " [gray]这些区域将按照你的朝向创建。"
"stack-accepted": "开始创建%0%个%1%类型的区域,间隔为%2%,名称以%3%开头,后面数字由001|%4%开始"
"stack-addToGroup": " 创建的区域将添加到权限组 '%0%'."
"stack-noPermission": "你没有权限批量创建和添加区域商店."
"stack-wrongAmount": "'%0%' 区域商店的数量不正确."
"stack-wrongGap": "'%0%' 在两个区域商店之间不是正确的数字."
"stack-noSelection": "你创建区域需要使用创世神工具选择区域"
"stack-addStart": "[gray]添加 %0% 区域商店,以每秒钟 %1%的速度创建. "
"stack-addComplete": "[gray]新建 %0% regions%1%."
"stack-tooHigh": ",跳过 %0% 区域,因为高度在256以上。"
"stack-tooLow": ",跳过 %0% 区域,因为高度y低于0"
"stack-unclearDirection": "请分辨好 北, 东, 南, 西, 上, 下 方向, 目前检测到 %0%."
"setlandlord-help": "/as setlandlord <玩家> [区域], 如果你没有选定区域,那么你所在的地方即将是你要使用的区域."
"setlandlord-noPermission": "你没有权限为这个区域设置主人."
"setlandlord-success": "%lang:landlord% 成功继承了 %lang:region% 并成为了改区域商店的主人."
"message-help": "/as message <玩家ID> <消息内容...>"
"message-noPermission": "你没有发送区域商店消息的权限。."
"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": "区域商店:&2&l%region%&r可以花费 &2&l%price%&r 金币,租用期限为&2&l%duration%&r."
"greeting-rented": "欢迎来到:&2&l%player%&r的商店,商店编号:&2&l%region%&r,租用期限直到&2%until%."
"greeting-forsale": "区域商店:&2&l%region%&r可以花费&2&l%price%&r金币购买."
"greeting-bought": "区域商店:&2&l%region%&r被&2&l%player%&r购买了."
"greeting-resale": "区域商店:&2&l%region%&r可以找&2&l%player%&r购买&2&l%resaleprice%&r."
"update-playerNotify": "[darkgreen]请更新AreaShop 版本%0% 到 %1% 版本 , 获取最新版本 https://github.com/NLthijs48/AreaShop/releases."
Loaded 100 of 180 files, more files were not shown because too many files have changed in this diff. Show more