Compare commits

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

Update BuyRegion.java
Add Available function for selled

Update RentRegion.java
Add Available function for rented

Update TeleportCommand.java
Check new permission

Finish feature teleport available region

* Fix translation
2016-11-19 17:15:23 +01:00
Thijs Wiefferink d9abe2e347 FIx problem with null regionFlags sections 2016-11-14 18:02:59 +01:00
Thijs Wiefferink 1ba2e21ae9 Make profile based settings easier to understand
- Remove 'signProfiles', 'flagProfiles', 'eventCommandProfiles', 'schematicProfiles' and 'expirationWarningProfiles' from the config.yml file
- Add the removed profile contents directly to the setting without the trailing 's' in the default.yml file (this prevents the need to understand the creation of profiles, and then assigning them, taking out a step in the thought process of users)
- Added method in GeneralRegion to get a ConfigurationSection from the region file, group files or default file while also taking into account the translation from a string to a profile that is defined in the config.yml file. This ensures backwards compatibility with current config files (the old style will not be promoted anymore though).
- The 'expirationWarningProfiles' does not have the subkeys 'warnPlayer' and 'commands' anymore, it is just a list of commands now, using the '/areashop message' command to warn a player.
- Add a workaround for the empty sign problem after unrent/sell of a region while having restore enabled, an AsyncWorldEdit plugin installed and signs inside the region (sign will be updated again half a second after unrent/sell).
2016-11-13 00:44:35 +01:00
Thijs Wiefferink fcdfdc6094 Update language files
- Swedish is added
- German, French and Russian are improved
2016-11-07 14:13:03 +01:00
Thijs Wiefferink 8a7e2ba5c2 Indicate limits when a MaxChangedBlocksException is thrown by WorldEdit 2016-11-07 13:52:54 +01:00
Thijs Wiefferink 0950452692 Fix a couple of problems caused by vertical /as stack addition 2016-10-31 21:07:08 +01:00
Thijs Wiefferink 293978f068 Decouple Message class from replacement providers
- Instead of applying replacements by testing for a replacement that has the GeneralRegion type, it now checks for a ReplacementProvider instances (one step closer to making Message independent of AreaShop).
- Replacements are handled one by one with a switch-case instead of getting them from a map, helps performance a lot.
2016-10-25 20:57:58 +02:00
Thijs Wiefferink 5efe14b8e9 Add up and down direction for '/as stack'
Prevents creating regions above and below the world limits, still needs
testing.
Progress for #105
2016-10-24 15:02:49 +02:00
Thijs Wiefferink 839d510151 Switch from Bukkit to Spigot Maven repo since it is down
Also switched from Bukkit 1.7.9 to Bukkit 1.8.0 because that is the lowest version available on the Spigot repo
2016-10-17 23:45:08 +02:00
Thijs Wiefferink 9180d9b8ee Fix small language file issue
When you only have a formatting code before a language variable, the hover/click effects will accidentally be applied to one text part earlier
2016-10-16 18:29:26 +02:00
Thijs Wiefferink 7aa786f4ce Fix default config trying to execute /as message as player
Fixes #221
2016-09-04 22:43:03 +02:00
Thijs Wiefferink 10ea8540e7 Add tab completion for '/as me [player]'
Closes #220
2016-09-04 00:59:04 +02:00
Thijs Wiefferink dba00769f6 Fix problem with line breaks 2016-09-03 20:58:45 +02:00
Thijs Wiefferink 44c70c6a33 Cleanup messages about region that does not exist in WorldGuard 2016-09-03 19:46:05 +02:00
Thijs Wiefferink 570f7b4055 Don't extend rent when using '/as setowner' to set a different owner
Also remove new owner from the friends list.
Fixes #219
2016-09-03 19:19:40 +02:00
Thijs Wiefferink feafa012dd Fix issue with \n on 1.7.x servers
- Each line of a message will now be sent separately instead of using '\n' in the text
- Drastically reduced the number of StringBuilders that are instantiated during message construction
- Fixes #222
2016-09-03 17:22:40 +02:00
Thijs Wiefferink 82b340ce1a Messages: also parse section signs into color tags properly
Fixes line-wrapping removing color in some cases
2016-09-02 21:43:58 +02:00
Thijs Wiefferink 93809f27fc Rename events to be consistent with commands
- AddFriendEvent -> AddedFriendEvent
- DeleteFriendEvent -> DeletedFriendEvent
- RemovedRegionEvent -> DeletedRegionEvent
2016-08-28 22:45:20 +02:00
Thijs Wiefferink f8ed3654fd Fix compilation error 2016-08-28 22:31:06 +02:00
Thijs Wiefferink 58a1afccf3 Invert inheritance of RegionEvent and CancellabelRegionEvent/NotifyRegionEvent 2016-08-28 22:29:45 +02:00
Thijs Wiefferink d9c3573225 Change RegionUpdateEvent to UpdateRegionEvent
This breaks plugins using the event
2016-08-28 22:21:33 +02:00
Thijs Wiefferink 1577443203 Generalize events better
Adds generic classes for events with a region (BuyRegion, RentRegion or GeneralRegion)
2016-08-28 22:11:17 +02:00
Thijs Wiefferink ab7a92c57d Update README.md 2016-08-26 19:49:21 +02:00
Thijs Wiefferink 2e09b0f60f Update README.md 2016-08-26 19:48:59 +02:00
Thijs Wiefferink 6e5c35f95b Add extension plugins section 2016-08-26 19:45:37 +02:00
Thijs Wiefferink 066ceedafd Add 'build' flag by default to prevent inheriting from parent regions. 2016-08-21 22:20:25 +02:00
Thijs Wiefferink c8ebe24bd3 Put break in '/as info' help message in the right spot 2016-08-19 20:52:07 +02:00
Thijs Wiefferink ad7db5ee23 Attempt to fix unable to add new players with '/as addfriend' 2016-08-16 22:43:09 +02:00
Thijs Wiefferink f80a8178ff Fix formatting not clearing on new lines 2016-08-13 22:28:15 +02:00
Thijs Wiefferink 05c8e1a7e4 Make loggin methods more generic 2016-08-10 16:07:39 +02:00
Thijs Wiefferink 9904805310 Improve version detection of WorldGuard
- First detect version 5
- Then detect lower than 6.1.3
- Else check build number:
  - Build number exists and lower than 1672: 6
  - Build number exists and Is 1672: broken
  - Else: 6_1_3
2016-08-09 22:56:21 +02:00
Thijs Wiefferink 0df2f429c0 Only print build number warning if we found it 2016-08-09 22:38:33 +02:00
Thijs Wiefferink b3408a2648 Fix compilation error and WorldGuard version detection 2016-08-09 21:52:53 +02:00
Thijs Wiefferink e1f89e7904 Cleanup some leftover logging in an old style 2016-08-08 22:06:31 +02:00
Thijs Wiefferink 064b129205 Change version to 2.3.2 and update languages
- Russian has been added
- Spelling errors in French have been corrected
2016-08-07 22:21:57 +02:00
Thijs Wiefferink 8111387f32 Improve friend line of /as me, add click hint
Change blue color of hover popup to gold, which will be used as action color
2016-08-07 22:06:09 +02:00
Thijs Wiefferink a4b23bebba Improve line of rented regions in info command 2016-08-07 21:49:44 +02:00
Thijs Wiefferink 7421e685fa Improve robustness of variable replacing in messages
- Once the limit is reached the argument replacer would still continue sometimes (if a the replacement itself triggers the limit and the inserted message increases the size of the message we are building and adds a parameter tag again, like %0%)
- The language tag replacer also stops earlier now, it did not have the above problem though
- Fixed FancyMessageFormat.insertMessage() not checking its parameters
- Message.get() with a limit will now return an empty message if the limit is reached to prevent problems like above.
- Closes #205
2016-08-07 00:09:30 +02:00
Christoph Krüger @Androkai 374b68d8fa Update VaultAPI-repo (#206)
The url of the Vault Maven repository has changed.
2016-08-06 22:36:26 +02:00
Thijs Wiefferink ca7a9664f3 Fix error in info command of rental region 2016-08-02 22:27:55 +02:00
Thijs Wiefferink e957b4fc73 Remove all reflection for sending fancy messages
- Reflection removed
- JSON is now fully escaped instead of lenient escaping
- Sending is now done with /tellraw
2016-08-01 21:31:14 +02:00
Thijs Wiefferink 6493bc4f78 Add empty lines if a page does not fill the screen
Relevant for commands like `/as info all` that can have pages
2016-08-01 21:28:11 +02:00
Thijs Wiefferink 2db1b6a243 Prevent updater throwing errors sometimes when BukkitDev is offline 2016-08-01 20:46:40 +02:00
Thijs Wiefferink 864662a3c4 Add javadocs to limitgroup inner class and setting methods 2016-08-01 20:23:49 +02:00
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
120 changed files with 20982 additions and 16792 deletions

No files matched your search

+33
View File
@@ -0,0 +1,33 @@
# Maven stuff
/target
*.pydevproject
.project
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
# IntelliJ IDEA
*.iml
.idea
dependency-reduced-pom.xml
+125 -54
View File
@@ -1,38 +1,28 @@
<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>
<groupId>nl.evolutioncoding</groupId>
<artifactId>areashop</artifactId>
<packaging>jar</packaging>
<name>AreaShop</name>
<version>2.2.0</version> <!-- Main plugin version -->
<version>2.4.0</version> <!-- Main plugin version -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>bukkit-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url>
</repository>
<repository>
<id>sk89q-repo-wg</id>
<url>http://maven.sk89q.com/artifactory/repo/</url>
</repository>
</repositories>
<parent>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-parent</artifactId>
<version>parent</version>
</parent>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version>
<version>1.8-R0.1-SNAPSHOT</version>
<type>jar</type>
<scope>provided</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>nl.evolutioncoding</groupId>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-5</artifactId>
<version>WorldGuard-5</version>
<type>jar</type>
@@ -40,7 +30,7 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>nl.evolutioncoding</groupId>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-6</artifactId>
<version>WorldGuard-6</version>
<type>jar</type>
@@ -48,7 +38,15 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>nl.evolutioncoding</groupId>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldguard-6_1_3</artifactId>
<version>WorldGuard-6_1_3</version>
<type>jar</type>
<scope>compile</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-interface</artifactId>
<version>AreaShopInterface</version>
<type>jar</type>
@@ -56,7 +54,7 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>nl.evolutioncoding</groupId>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-5</artifactId>
<version>WorldEdit-5</version>
<type>jar</type>
@@ -64,7 +62,7 @@
<optional>true</optional>
</dependency>
<dependency>
<groupId>nl.evolutioncoding</groupId>
<groupId>me.wiefferink</groupId>
<artifactId>areashop-worldedit-6</artifactId>
<version>WorldEdit-6</version>
<type>jar</type>
@@ -86,18 +84,114 @@
<type>jar</type>
</dependency>
<dependency>
<groupId>net.milkbowl</groupId>
<artifactId>vault</artifactId>
<version>1.4.1</version>
<scope>system</scope>
<systemPath>${basedir}/../Dependencies/Vault.jar</systemPath>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.4</version>
<scope>provided</scope>
</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>
<!-- Include all required resources -->
<resources>
<resource>
<targetPath>.</targetPath>
@@ -106,6 +200,7 @@
<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>
@@ -116,7 +211,7 @@
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>1.4</version>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
@@ -128,31 +223,7 @@
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<!-- Copy resulting file to local server, change to your own path -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<configuration>
<tasks>
<copy file="./target/${project.build.finalName}.jar" tofile="C:\Games\Minecraft\Spigot 1.8.7\plugins\${project.build.finalName}.jar"/>
</tasks>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<target failonerror="false"></target>
</configuration>
</execution>
</executions>
<version>3.5.1</version>
</plugin>
</plugins>
</build>
@@ -0,0 +1,737 @@
package me.wiefferink.areashop;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
import me.wiefferink.areashop.features.DebugFeature;
import me.wiefferink.areashop.features.Feature;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.features.WorldGuardRegionFlagsFeature;
import me.wiefferink.areashop.interfaces.AreaShopInterface;
import me.wiefferink.areashop.interfaces.WorldEditInterface;
import me.wiefferink.areashop.interfaces.WorldGuardInterface;
import me.wiefferink.areashop.lib.Metrics;
import me.wiefferink.areashop.lib.Updater;
import me.wiefferink.areashop.lib.Updater.UpdateResult;
import me.wiefferink.areashop.lib.Updater.UpdateType;
import me.wiefferink.areashop.listeners.PlayerLoginLogoutListener;
import me.wiefferink.areashop.listeners.SignBreakListener;
import me.wiefferink.areashop.listeners.SignChangeListener;
import me.wiefferink.areashop.listeners.SignClickListener;
import me.wiefferink.areashop.managers.CommandManager;
import me.wiefferink.areashop.managers.FileManager;
import me.wiefferink.areashop.managers.SignLinkerManager;
import me.wiefferink.areashop.messages.LanguageManager;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.GeneralRegion;
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.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
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 boolean debug = false;
private List<String> chatprefix = null;
private Updater updater = null;
private boolean updateAvailable = false;
private boolean ready = false;
// Folders and file names
public static final String languageFolder = "lang";
public static final String schematicFolder = "schem";
public static final String schematicExtension = ".schematic";
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 tagTimeLeft = "timeleft";
public static final String tagClicker = "clicker";
public static final String tagResellPrice = "resellprice";
public static final String tagRawResellPrice = "rawresellprice";
public static final String tagFriends = "friends";
public static final String tagFriendsUUID = "friendsuuid";
public static final String tagMoneyBackPercentage = "moneybackpercent";
public static final String tagMoneyBackAmount = "moneyback";
public static final String tagRawMoneyBackAmount = "rawmoneyback";
public static final String tagMaxExtends = "maxextends";
public static final String tagExtendsLeft = "extendsleft";
public static final String tagMaxRentTime = "maxrenttime";
public static final String tagMaxInactiveTime = "inactivetime";
public static final String tagLandlord = "landlord";
public static final String tagLandlordUUID = "landlorduuid";
public static final String tagDateTime = "datetime";
public static final String tagDateTimeShort = "datetimeshort";
public static final String tagYear = "year";
public static final String tagMonth = "month";
public static final String tagDay = "day";
public static final String tagHour = "hour";
public static final String tagMinute = "minute";
public static final String tagSecond = "second";
public static final String tagMillisecond = "millisecond";
public static final String tagEpoch = "epoch";
public static final String tagTeleportX = "tpx";
public static final String tagTeleportY = "tpy";
public static final String tagTeleportZ = "tpz";
public static final String tagTeleportBlockX = "tpblockx";
public static final String tagTeleportBlockY = "tpblocky";
public static final String tagTeleportBlockZ = "tpblockz";
public static final String tagTeleportPitch = "tppitch";
public static final String tagTeleportYaw = "tpyaw";
public static final String tagTeleportPitchRound = "tppitchround";
public static final String tagTeleportYawRound = "tpyawround";
public static final String tagTeleportWorld = "tpworld";
public static AreaShop getInstance() {
return AreaShop.instance;
}
/**
* Called on start or reload of the server
*/
public void onEnable() {
AreaShop.instance = this;
boolean error = false;
// Check if WorldGuard is present
String wgVersion = null;
String rawVersion = null;
int major = 0, minor = 0, fixes = 0;
Integer build = null;
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
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(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";
}
}
} catch(Exception e) { // If version detection fails, at least try to load the latest version
wgVersion = "6_1_3";
}
// 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 == null || !(plugin instanceof WorldEditPlugin)) {
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 {
weVersion = "6";
}
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(this);
error = error | !fileManager.loadFiles();
// 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);
}
// Create a LanguageMananager
languageManager = new LanguageManager(this);
if(error) {
error("The plugin has not started, fix the errors listed above");
} else {
// Register the event listeners
getServer().getPluginManager().registerEvents(new SignChangeListener(this), this);
getServer().getPluginManager().registerEvents(new SignBreakListener(this), this);
getServer().getPluginManager().registerEvents(new SignClickListener(this), this);
getServer().getPluginManager().registerEvents(new PlayerLoginLogoutListener(this), this);
setupFeatures();
setupTasks();
// Startup the CommandManager (registers itself for the command)
commandManager = new CommandManager(this);
// Create a signLinkerManager
signLinkerManager = new SignLinkerManager(this);
// Enable Metrics if config allows it
if(getConfig().getBoolean("sendStats")) {
startMetrics();
}
// Register dynamic permission (things declared in config)
registerDynamicPermissions();
// Dont initialize the updatechecker if disabled in the config
if(getConfig().getBoolean("checkForUpdates")) {
new BukkitRunnable() {
@Override
public void run() {
try {
updater = new Updater(AreaShop.getInstance(), 76518, null, UpdateType.NO_DOWNLOAD, false);
AreaShop.debug("Result=" + updater.getResult().toString() + ", Latest=" + updater.getLatestName() + ", Type=" + updater.getLatestType());
updateAvailable = updater.getResult() == UpdateResult.UPDATE_AVAILABLE;
if(updateAvailable) {
AreaShop.info("Update from AreaShop V"+AreaShop.getInstance().getDescription().getVersion()+" to "+updater.getLatestName()+" available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/");
new BukkitRunnable() {
@Override
public void run() {
for(Player player : Utils.getOnlinePlayers()) {
if(player.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(player, "update-playerNotify", AreaShop.getInstance().getDescription().getVersion(), AreaShop.getInstance().getUpdater().getLatestName());
}
}
}
}.runTask(AreaShop.getInstance());
}
} catch(Exception e) {
AreaShop.debug("Something went wrong with the Updater:");
AreaShop.debug(e.getMessage());
updateAvailable = false;
}
}
}.runTaskAsynchronously(this);
}
}
}
/**
* Called on shutdown or reload of the server
*/
public void onDisable() {
// Update lastactive time for players that are online now
for(GeneralRegion region : fileManager.getRegions()) {
Player player = Bukkit.getPlayer(region.getOwner());
if(player != null) {
region.updateLastActiveTime();
}
}
fileManager.saveRequiredFilesAtOnce();
Bukkit.getServer().getScheduler().cancelTasks(this);
worldGuard = null;
worldEdit = null;
fileManager = null;
languageManager = null;
commandManager = null;
chatprefix = null;
debug = false;
ready = false;
updater = null;
}
/**
* Instanciate and register all Feature classes
*/
public void setupFeatures() {
Set<Feature> features = new HashSet<>();
features.add(new DebugFeature());
features.add(new SignsFeature());
features.add(new WorldGuardRegionFlagsFeature());
// Register as listener when necessary
for(Feature feature : features) {
feature.listen();
}
}
/**
* 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;
}
/**
* 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;
}
/**
* 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;
}
public SignLinkerManager getSignlinkerManager() {
return signLinkerManager;
}
/**
* 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 current chatPrefix
* @return The current chatPrefix
*/
public List<String> getChatPrefix() {
return chatprefix;
}
/**
* Method to get the FileManager (loads/save regions and can be used to get regions)
* @return The fileManager
*/
public FileManager getFileManager() {
return fileManager;
}
/**
* Get the updater (check the update result)
* @return The updater
*/
public Updater getUpdater() {
return updater;
}
/**
* Check if an update for AreaShop is available
* @return true if an update is available, otherwise false
*/
public boolean updateAvailable() {
return updateAvailable;
}
/**
* Register dynamic permissions controlled by config settings
*/
public 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
*/
public void setupTasks() {
// Rent expiration timer
long expirationCheck = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("expiration.delay"));
final AreaShop finalPlugin = this;
if(expirationCheck > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().checkRents();
AreaShop.debugTask("Checking rent expirations...");
} else {
AreaShop.debugTask("Skipped checking rent expirations, plugin not ready");
}
}
}.runTaskTimer(this, 1, expirationCheck);
}
// Inactive unrenting/selling timer
long inactiveCheck = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("inactive.delay"));
if(inactiveCheck > 0) {
new BukkitRunnable() {
@Override
public void run() {
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");
}
}
}.runTaskTimer(this, inactiveCheck, inactiveCheck);
}
// Periodic updating of signs for timeleft tags
long periodicUpdate = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("signs.delay"));
if(periodicUpdate > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().performPeriodicSignUpdate();
AreaShop.debugTask("Performing periodic sign update...");
} else {
AreaShop.debugTask("Skipped performing periodic sign update, plugin not ready");
}
}
}.runTaskTimer(this, periodicUpdate, periodicUpdate);
}
// Saving regions and group settings
long saveFiles = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("saving.delay"));
if(saveFiles > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().saveRequiredFiles();
AreaShop.debugTask("Saving required files...");
} else {
AreaShop.debugTask("Skipped saving required files, plugin not ready");
}
}
}.runTaskTimer(this, saveFiles, saveFiles);
}
// Sending warnings about rent regions to online players
long expireWarning = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("expireWarning.delay"));
if(expireWarning > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().sendRentExpireWarnings();
AreaShop.debugTask("Sending rent expire warnings...");
} else {
AreaShop.debugTask("Skipped sending rent expire warnings, plugin not ready");
}
}
}.runTaskTimer(this, expireWarning, expireWarning);
}
// Update all regions on startup
if(getConfig().getBoolean("updateRegionsOnStartup")) {
new BukkitRunnable() {
@Override
public void run() {
finalPlugin.getFileManager().updateAllRegions();
AreaShop.debugTask("Updating all regions at startup...");
}
}.runTaskLater(this, 20L);
}
}
/**
* 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();
}
/**
* Start the Metrics stats collection
*/
private void startMetrics() {
try {
Metrics metrics = new Metrics(this);
metrics.start();
} catch (Exception e) {
AreaShop.debug("Could not start Metrics");
}
}
/**
* 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
*/
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 messagfe to print
*/
public static void error(Object... message) {
AreaShop.getInstance().getLogger().severe(StringUtils.join(message, " "));
}
/**
* Print debug message for periodic task
* @param message The message to print
*/
public static void debugTask(Object... message) {
if(AreaShop.getInstance().getConfig().getBoolean("debugTask")) {
AreaShop.debug(StringUtils.join(message, " "));
}
}
/**
* Reload all files of the plugin and update all regions
* confirmationReceiver The CommandSender that should receive confirmation messages, null for nobody
* @param confirmationReceiver The CommandSender which should be notified when complete
*/
public void reload(final CommandSender confirmationReceiver) {
setReady(false);
fileManager.saveRequiredFilesAtOnce();
fileManager.loadFiles();
languageManager = new LanguageManager(this);
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,746 @@
package me.wiefferink.areashop;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.*;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
public class Utils {
// Not used
private Utils() {}
private static YamlConfiguration config;
private static ArrayList<String> identifiers;
private static ArrayList<String> seconds;
private static ArrayList<String> minutes;
private static ArrayList<String> hours;
private static ArrayList<String> days;
private static ArrayList<String> weeks;
private static ArrayList<String> months;
private static ArrayList<String> years;
public static void initialize(YamlConfiguration pluginConfig) {
config = pluginConfig;
// Setup individual identifiers
seconds = new ArrayList<>(config.getStringList("seconds"));
minutes = new ArrayList<>(config.getStringList("minutes"));
hours = new ArrayList<>(config.getStringList("hours"));
days = new ArrayList<>(config.getStringList("days"));
weeks = new ArrayList<>(config.getStringList("weeks"));
months = new ArrayList<>(config.getStringList("months"));
years = new ArrayList<>(config.getStringList("years"));
// Setup all time identifiers
identifiers = new ArrayList<>();
identifiers.addAll(seconds);
identifiers.addAll(minutes);
identifiers.addAll(hours);
identifiers.addAll(days);
identifiers.addAll(weeks);
identifiers.addAll(months);
identifiers.addAll(years);
}
/**
* 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
* @return Innput object concatenated with comma's in between
*/
public static String createCommaSeparatedList(Collection<?> input) {
String result = "";
boolean first = true;
for(Object object : input) {
if(object != null) {
if(first) {
first = false;
result += object.toString();
} else {
result += ", " + object.toString();
}
}
}
return result;
}
/**
* 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> getASRegionsInSelection(Selection selection) {
ArrayList<GeneralRegion> result = new ArrayList<>();
for(ProtectedRegion region : getWERegionsInSelection(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> getASRegionsByLocation(Location location) {
Selection selection = new CuboidSelection(location.getWorld(), location, location);
return getASRegionsInSelection(selection);
}
/**
* 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> getWERegionsInSelection(Selection selection) {
// Get all regions inside or intersecting with the WorldEdit selection of the player
World world = selection.getWorld();
RegionManager regionManager = AreaShop.getInstance().getWorldGuard().getRegionManager(world);
ArrayList<ProtectedRegion> result = new ArrayList<>();
Location selectionMin = selection.getMinimumPoint();
Location selectionMax = selection.getMaximumPoint();
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> getApplicableRegions(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> getApplicableRentRegions(Location location) {
List<RentRegion> result = new ArrayList<>();
for(GeneralRegion region : getApplicableASRegions(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> getApplicableBuyRegions(Location location) {
List<BuyRegion> result = new ArrayList<>();
for(GeneralRegion region : getApplicableASRegions(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> getAllApplicableRegions(Location location) {
return getApplicableASRegions(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> getApplicableASRegions(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.isRentRegion())
|| (type == GeneralRegion.RegionType.BUY && region.isBuyRegion())
|| 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, "\u20ac");
String after = config.getString("moneyCharacterAfter");
after = after.replace(AreaShop.currencyEuro, "\u20ac");
String result;
// Check for infinite and NaN
if(Double.isInfinite(amount)) {
result = "\u221E"; // Infinite symbol
} else if(Double.isNaN(amount)) {
result = "NaN";
} else {
// Add metric
double metricAbove = config.getDouble("metricSuffixesAbove");
if(metricAbove != -1 && amount >= metricAbove) {
if(amount >= 1000000000000000000000000.0) {
amount = amount/1000000000000000000000000.0;
after = "Y"+after;
} else if(amount >= 1000000000000000000000.0) {
amount = amount/1000000000000000000000.0;
after = "Z"+after;
} else if(amount >= 1000000000000000000.0) {
amount = amount/1000000000000000000.0;
after = "E"+after;
} else if(amount >= 1000000000000000.0) {
amount = amount/1000000000000000.0;
after = "P"+after;
} else if(amount >= 1000000000000.0) {
amount = amount/1000000000000.0;
after = "T"+after;
} else if(amount >= 1000000000.0) {
amount = amount/1000000000.0;
after = "G"+after;
} else if(amount >= 1000000.0) {
amount = amount/1000000.0;
after = "M"+after;
} else if(amount >= 1000.0) {
amount = amount/1000.0;
after = "k"+after;
}
BigDecimal bigDecimal = new BigDecimal(amount);
if(bigDecimal.toString().contains(".")) {
int frontLength = bigDecimal.toString().substring(0, bigDecimal.toString().indexOf('.')).length();
bigDecimal = bigDecimal.setScale(config.getInt("fractionalNumbers")+(3-frontLength), RoundingMode.HALF_UP);
}
result = bigDecimal.toString();
} else {
BigDecimal bigDecimal = new BigDecimal(amount);
bigDecimal = bigDecimal.setScale(config.getInt("fractionalNumbers"), RoundingMode.HALF_UP);
amount = bigDecimal.doubleValue();
result = bigDecimal.toString();
if(config.getBoolean("hideEmptyFractionalPart") && (amount%1.0) == 0.0 && result.contains(".")) {
result = result.substring(0, result.indexOf('.'));
}
}
}
result = result.replace(".", config.getString("decimalMark"));
return before+result+after;
}
/**
* 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, time.length());
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")) {
return -1;
} else if(duration.indexOf(' ') == -1) {
return 0;
}
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(0);
String durationString = duration.substring(duration.indexOf(' ')+1, duration.length());
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);
}
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);
}
}
/**
* Get a start of the message with a maximum length
* @param message The message
* @param maximumLength The maximum length to return
* @return The start of the message with at most maximumLength characters
*/
public static String getMessageStart(Message message, int maximumLength) {
String messageStart = "";
for(int i = 0; i < message.getRaw().size() && messageStart.length() < maximumLength; i++) {
messageStart += message.getRaw().get(i).substring(0, Math.min(maximumLength, message.getRaw().get(i).length()));
}
return messageStart.substring(0, Math.min(maximumLength, messageStart.length()));
}
/**
* 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
*/
public static boolean isNumeric(String input) {
try {
Integer.parseInt(input);
return true;
} catch(NumberFormatException ignored) {
return false;
}
}
// 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 toUUID(String name) {
if(name == null) {
return null;
} else {
return Bukkit.getOfflinePlayer(name).getUniqueId().toString();
}
}
}
@@ -1,239 +1,239 @@
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.managers.FileManager.AddResult;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class AddCommand extends CommandAreaShop {
public AddCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop add";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.createrent") || target.hasPermission("areashop.createbuy")) {
return plugin.getLanguageManager().getLang("help-add");
}
return null;
}
@Override
public void execute(final CommandSender sender, Command command, 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;
}
List<ProtectedRegion> regions = new ArrayList<ProtectedRegion>();
World world = null;
Player player = null;
if(sender instanceof Player) {
player = (Player)sender;
}
if(args.length == 2) {
if(player == null) {
plugin.message(sender, "cmd-weOnlyByPlayer");
return;
}
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
world = selection.getWorld();
regions = Utils.getWERegionsInSelection(selection);
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.getWorldGuard().getRegionManager(world).getRegion(args[2]);
if(region == null) {
plugin.message(sender, "add-noRegion", args[2]);
return;
}
regions.add(region);
}
final boolean isRent = "rent".equals(args[1].toLowerCase());
final List<ProtectedRegion> finalRegions = regions;
final Player finalPlayer = player;
final World finalWorld = world;
AreaShop.debug("Starting add task with " + regions.size() + " regions");
new BukkitRunnable() {
private int current = 0;
private ArrayList<String> namesSuccess = new ArrayList<String>();
private ArrayList<String> namesAlready = new ArrayList<String>();
private ArrayList<String> namesBlacklisted = new ArrayList<String>();
private ArrayList<String> namesNoPermission = new ArrayList<String>();
@Override
public void run() {
for(int i=0; i<plugin.getConfig().getInt("adding.regionsPerTick"); i++) {
if(current < finalRegions.size()) {
ProtectedRegion region = finalRegions.get(current);
// 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 = null;
if(isRent) {
type = "rent";
} else {
type = "buy";
}
AddResult result = plugin.getFileManager().checkRegionAdd(sender, region, isRent ? RegionType.RENT : RegionType.BUY);
if(result == AddResult.ALREADYADDED) {
namesAlready.add(region.getId());
} else if(result == AddResult.BLACKLISTED) {
namesBlacklisted.add(region.getId());
} else if(result == AddResult.NOPERMISSION) {
namesNoPermission.add(region.getId());
} else {
namesSuccess.add(region.getId());
// 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)));
if(isRent) {
RentRegion rent = new RentRegion(plugin, region.getId(), finalWorld);
// Set landlord
if(landlord) {
rent.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
// Run commands
rent.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(RegionEvent.CREATED);
// Set the flags for the region
rent.updateRegionFlags();
// Run commands
rent.runEventCommands(RegionEvent.CREATED, false);
} else {
BuyRegion buy = new BuyRegion(plugin, region.getId(), finalWorld);
// Set landlord
if(landlord) {
buy.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
}
// Run commands
buy.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(RegionEvent.CREATED);
// Set the flags for the region
buy.updateRegionFlags();
// Run commands
buy.runEventCommands(RegionEvent.CREATED, false);
}
}
current++;
}
}
if(current >= finalRegions.size()) {
if(!namesSuccess.isEmpty()) {
plugin.message(sender, "add-success", args[1], Utils.createCommaSeparatedList(namesSuccess));
}
if(!namesAlready.isEmpty()) {
plugin.message(sender, "add-failed", Utils.createCommaSeparatedList(namesAlready));
}
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");
}
this.cancel();
}
}
}.runTaskTimer(plugin, 1, 1);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
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.getWorldGuard().getRegionManager(player.getWorld()).getRegions().values()) {
result.add(region.getId());
}
}
}
}
return result;
}
}
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
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 org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeSet;
public class AddCommand extends CommandAreaShop {
public AddCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop add";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.createrent") || target.hasPermission("areashop.createbuy")) {
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;
}
List<ProtectedRegion> regions = new ArrayList<>();
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;
}
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
world = selection.getWorld();
regions = Utils.getWERegionsInSelection(selection);
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.getWorldGuard().getRegionManager(world).getRegion(args[2]);
if(region == null) {
plugin.message(sender, "cmd-noRegion", args[2]);
return;
}
regions.add(region);
}
final boolean isRent = "rent".equals(args[1].toLowerCase());
final List<ProtectedRegion> finalRegions = regions;
final Player finalPlayer = player;
final World finalWorld = world;
AreaShop.debug("Starting add task with " + regions.size() + " regions");
new BukkitRunnable() {
private int current = 0;
private TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
private TreeSet<GeneralRegion> regionsAlready = new TreeSet<>();
private TreeSet<String> namesBlacklisted = new TreeSet<>();
private TreeSet<String> namesNoPermission = new TreeSet<>();
private TreeSet<String> namesExternal = new TreeSet<>();
@Override
public void run() {
for(int i=0; i<plugin.getConfig().getInt("adding.regionsPerTick"); i++) {
if(current < finalRegions.size()) {
ProtectedRegion region = finalRegions.get(current);
// 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, isRent ? GeneralRegion.RegionType.RENT : GeneralRegion.RegionType.BUY);
if(result == FileManager.AddResult.ALREADYADDED) {
regionsAlready.add(plugin.getFileManager().getRegion(region.getId()));
} else if(result == FileManager.AddResult.BLACKLISTED) {
namesBlacklisted.add(region.getId());
} else if(result == FileManager.AddResult.NOPERMISSION) {
namesNoPermission.add(region.getId());
} 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)));
if(isRent) {
RentRegion rent = new RentRegion(plugin, region.getId(), finalWorld);
// 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);
regionsSuccess.add(rent);
} else {
BuyRegion buy = new BuyRegion(plugin, region.getId(), finalWorld);
// 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);
regionsSuccess.add(buy);
}
}
current++;
}
}
if(current >= finalRegions.size()) {
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(!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");
}
this.cancel();
}
}
}.runTaskTimer(plugin, 1, 1);
}
@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.getWorldGuard().getRegionManager(player.getWorld()).getRegions().values()) {
result.add(region.getId());
}
}
}
}
return result;
}
}
@@ -1,149 +1,146 @@
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.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 AddfriendCommand extends CommandAreaShop {
public AddfriendCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop addfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.addfriendall")) {
return plugin.getLanguageManager().getLang("help-addFriendAll");
} else if(target.hasPermission("areashop.addfriend")) {
return plugin.getLanguageManager().getLang("help-addFriend");
}
return null;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length <= 2) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.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, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.addfriendall")) {
if((region.isRentRegion() && !((RentRegion)region).isRented())
|| (region.isBuyRegion() && !((BuyRegion)region).isSold())) {
plugin.message(sender, "addfriend-noOwner");
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1]);
return;
}
if(region.getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName());
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName());
return;
}
region.addFriend(friend.getUniqueId());
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "addfriend-successOther", friend.getName(), region.getName());
} else {
if(sender.hasPermission("areashop.addfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(friend.getLastPlayed() == 0 && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
plugin.message(sender, "addfriend-notVisited", args[1]);
return;
}
if(region.getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "addfriend-alreadyAdded", friend.getName());
return;
}
if(region.isOwner(friend.getUniqueId())) {
plugin.message(sender, "addfriend-self", friend.getName());
return;
}
region.addFriend(friend.getUniqueId());
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "addfriend-success", friend.getName(), region.getName());
} else {
plugin.message(sender, "addfriend-noPermissionOther");
}
} else {
plugin.message(sender, "addfriend-noPermission");
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 {
public AddfriendCommand(AreaShop plugin) {
super(plugin);
}
@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.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, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.addfriendall")) {
if((region.isRentRegion() && !((RentRegion)region).isRented())
|| (region.isBuyRegion() && !((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 && !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,132 +1,130 @@
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 = Utils.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);
} else {
plugin.message(sender, "addsign-successProfile", region, profile);
}
region.updateSigns();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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 com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
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 {
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 "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.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), region);
return;
}
}
SignsFeature.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,78 +1,74 @@
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.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 = Utils.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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
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 "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");
} else {
region.buy(player);
}
} else {
// get the region by location
List<BuyRegion> regions = Utils.getApplicableBuyRegions(((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;
}
}
@@ -1,66 +1,68 @@
package nl.evolutioncoding.areashop.commands;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
/**
* Abstract class for generalising command classes
*/
public abstract class CommandAreaShop {
AreaShop plugin;
/**
* Save the instance of the main plugin class
* @param plugin The main plugin
*/
public CommandAreaShop(AreaShop plugin) {
this.plugin = plugin;
}
public boolean canExecute(Command command, String[] args) {
String commandString = command.getName();
for(String argument : args) {
commandString += " " + argument;
}
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
* @return A collection with all the possibilities for argument to complete
*/
public abstract List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender);
/**
* Get the argument that comes after the base command that this command reacts to
* @return
*/
public abstract String getCommandStart();
/**
* Returns the correct help string for the reciever
* @param target The CommandSender that the help message is for
* @return The help message 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 commandAreaShop The command that has been executed
* @param args The arguments that are given
*/
public abstract void execute(CommandSender sender, Command command, String[] args);
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
/**
* Abstract class for generalising command classes
*/
public abstract class CommandAreaShop {
AreaShop plugin;
/**
* Save the instance of the main plugin class
* @param plugin The main plugin
*/
public CommandAreaShop(AreaShop plugin) {
this.plugin = plugin;
}
public boolean canExecute(Command command, String[] args) {
String commandString = command.getName();
for(String argument : args) {
commandString += " " + argument;
}
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);
}
@@ -1,138 +1,136 @@
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.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.sk89q.worldedit.bukkit.selections.Selection;
public class DelCommand extends CommandAreaShop {
public DelCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop del";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.destroyrent") || target.hasPermission("areashop.destroybuy")) {
return plugin.getLanguageManager().getLang("help-del");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getASRegionsInSelection(selection);
if(regions == null || regions.size() == 0) {
plugin.message(player, "cmd-noRegionsFound");
return;
}
// Start removing the region that he has permission for
ArrayList<String> namesSuccess = new ArrayList<String>();
ArrayList<String> namesFailed = new ArrayList<String>();
for(GeneralRegion region : regions) {
boolean isLandlord = sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId());
if(region.isRentRegion()) {
if(!sender.hasPermission("areashop.destroyrent") && !(isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
namesFailed.add(region.getName());
} else {
plugin.getFileManager().removeRent((RentRegion)region, true);
namesSuccess.add(region.getName());
}
} else if(region.isBuyRegion()) {
if(!sender.hasPermission("areashop.destroybuy") && !(isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
namesFailed.add(region.getName());
} 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.createCommaSeparatedList(namesFailed));
}
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
if(region == null) {
plugin.message(sender, "del-noRegion", args[1]);
return;
}
boolean isLandlord = sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId());
if(region.isRentRegion()) {
/* 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.getName());
} else {
plugin.message(sender, "destroy-noPermissionRent");
}
} else if(region.isBuyRegion()) {
/* 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.getName());
} else {
plugin.message(sender, "destroy-noPermissionBuy");
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.bukkit.selections.Selection;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 {
public DelCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop del";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.destroyrent") || target.hasPermission("areashop.destroybuy")) {
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;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getASRegionsInSelection(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.isRentRegion()) {
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.isBuyRegion()) {
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.isRentRegion()) {
// 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.isBuyRegion()) {
// 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;
}
}
@@ -1,131 +1,144 @@
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.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 DelfriendCommand extends CommandAreaShop {
public DelfriendCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop delfriend";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.delfriendall")) {
return plugin.getLanguageManager().getLang("help-delFriendAll");
} else if(target.hasPermission("areashop.delfriend")) {
return plugin.getLanguageManager().getLang("help-delFriend");
}
return null;
}
@SuppressWarnings("deprecation")
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length <= 2) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.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, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.delfriendall")) {
if((region.isRentRegion() && !((RentRegion)region).isRented())
|| (region.isBuyRegion() && !((BuyRegion)region).isSold())) {
plugin.message(sender, "delfriend-noOwner");
return;
}
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName());
return;
}
region.deleteFriend(friend.getUniqueId());
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "delfriend-successOther", friend.getName(), region.getName());
} else {
if(sender.hasPermission("areashop.delfriend") && sender instanceof Player) {
if(region.isOwner((Player)sender)) {
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
if(!region.getFriends().contains(friend.getUniqueId())) {
plugin.message(sender, "delfriend-notAdded", friend.getName());
return;
}
region.deleteFriend(friend.getUniqueId());
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "delfriend-success", friend.getName(), region.getName());
} else {
plugin.message(sender, "delfriend-noPermissionOther");
}
} else {
plugin.message(sender, "delfriend-noPermission");
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 {
public DelfriendCommand(AreaShop plugin) {
super(plugin);
}
@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.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, "cmd-notRegistered", args[2]);
return;
}
}
if(sender.hasPermission("areashop.delfriendall")) {
if((region.isRentRegion() && !((RentRegion)region).isRented())
|| (region.isBuyRegion() && !((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,85 +1,82 @@
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();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
return new ArrayList<String>();
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.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 {
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 "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;
}
SignsFeature.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<>();
}
}
@@ -1,200 +1,184 @@
package nl.evolutioncoding.areashop.commands;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.RegionGroup;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class FindCommand extends CommandAreaShop {
public FindCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop find";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.find")) {
return plugin.getLanguageManager().getLang("help-find");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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) {
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;
}
}
if(args[1].equalsIgnoreCase("buy")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
List<BuyRegion> results = new ArrayList<BuyRegion>();
for(BuyRegion region : regions) {
if(!region.isSold()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
BuyRegion region = results.get(new Random().nextInt(results.size()));
BigDecimal bigDecimal = new BigDecimal(balance);
bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP);
balance = bigDecimal.doubleValue();
String onlyInGroup = "";
if(group != null) {
onlyInGroup = plugin.getLanguageManager().getLang("find-onlyInGroup", args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-successMax", "buy", region.getName(), maxPrice, onlyInGroup);
} else {
plugin.message(player, "find-success", "buy", region.getName(), balance, onlyInGroup);
}
region.teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
BigDecimal bigDecimal = new BigDecimal(balance);
bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP);
balance = bigDecimal.doubleValue();
String onlyInGroup = "";
if(group != null) {
onlyInGroup = plugin.getLanguageManager().getLang("find-onlyInGroup", args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFound", "buy", maxPrice, onlyInGroup);
} else {
plugin.message(player, "find-noneFoundMax", "buy", balance, onlyInGroup);
}
}
} else {
List<RentRegion> regions = plugin.getFileManager().getRents();
List<RentRegion> results = new ArrayList<RentRegion>();
for(RentRegion region : regions) {
if(!region.isRented()
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
&& (group == null || group.isMember(region))) {
results.add(region);
}
}
if(!results.isEmpty()) {
// Draw a random one
RentRegion region = results.get(new Random().nextInt(results.size()));
BigDecimal bigDecimal = new BigDecimal(balance);
bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP);
balance = bigDecimal.doubleValue();
String onlyInGroup = "";
if(group != null) {
onlyInGroup = plugin.getLanguageManager().getLang("find-onlyInGroup", args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-successMax", "rent", region.getName(), maxPrice, onlyInGroup);
} else {
plugin.message(player, "find-success", "rent", region.getName(), balance, onlyInGroup);
}
region.teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
} else {
BigDecimal bigDecimal = new BigDecimal(balance);
bigDecimal = bigDecimal.setScale(2, RoundingMode.HALF_UP);
balance = bigDecimal.doubleValue();
String onlyInGroup = "";
if(group != null) {
onlyInGroup = plugin.getLanguageManager().getLang("find-onlyInGroup", args[3]);
}
if(maxPriceSet) {
plugin.message(player, "find-noneFound", "rent", maxPrice, onlyInGroup);
} else {
plugin.message(player, "find-noneFoundMax", "rent", balance, onlyInGroup);
}
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.add("buy");
result.add("rent");
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
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 {
public FindCommand(AreaShop plugin) {
super(plugin);
}
@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;
}
}
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))) {
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]);
}
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.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);
}
}
} 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))) {
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]);
}
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.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,123 +1,118 @@
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);
}
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 = Utils.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());
}
}
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));
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(toUpdate, player);
} 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());
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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 com.sk89q.worldedit.bukkit.selections.Selection;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
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 {
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 "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;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getASRegionsInSelection(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;
}
}
@@ -1,124 +1,119 @@
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 GroupdelCommand extends CommandAreaShop {
public GroupdelCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop groupdel";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.groupdel")) {
return plugin.getLanguageManager().getLang("help-groupdel");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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) {
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;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.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.removeMember(region)) {
namesSuccess.add(region.getName());
toUpdate.add(region);
} else {
namesFailed.add(region.getName());
}
}
if(namesSuccess.size() != 0) {
plugin.message(player, "groupdel-weSuccess", group.getName(), Utils.createCommaSeparatedList(namesSuccess));
}
if(namesFailed.size() != 0) {
plugin.message(player, "groupdel-weFailed", group.getName(), Utils.createCommaSeparatedList(namesFailed));
}
// Update all regions, this does it in a task, updating them without lag
plugin.getFileManager().updateRegions(toUpdate, player);
group.saveRequired();
} else {
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
if(region == null) {
plugin.message(sender, "groupdel-noRegion", args[2]);
return;
}
if(group.removeMember(region)) {
region.updateRegionFlags();
region.updateSigns();
plugin.message(sender, "groupdel-success", region.getName(), group.getName(), group.getMembers().size());
} else {
plugin.message(sender, "groupdel-failed", region.getName(), group.getName());
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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 com.sk89q.worldedit.bukkit.selections.Selection;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
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 {
public GroupdelCommand(AreaShop plugin) {
super(plugin);
}
@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) {
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;
Selection selection = plugin.getWorldEdit().getSelection(player);
if(selection == null) {
plugin.message(player, "cmd-noSelection");
return;
}
List<GeneralRegion> regions = Utils.getASRegionsInSelection(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,73 @@
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, CommandSender sender) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.RegionGroup;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
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 "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;
}
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, CommandSender sender) {
List<String> result = new ArrayList<>();
if(toComplete == 2) {
result = plugin.getFileManager().getGroupNames();
}
return result;
}
}
@@ -1,60 +1,58 @@
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, CommandSender sender) {
return new ArrayList<String>();
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
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 "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,29 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.command.CommandSender;
public class HelpCommand extends CommandAreaShop {
public HelpCommand(AreaShop plugin) {
super(plugin);
}
@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,529 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RegionGroup;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.Location;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.*;
public class InfoCommand extends CommandAreaShop {
public InfoCommand(AreaShop plugin) {
super(plugin);
}
@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
*/
private void showSortedPagedList(CommandSender sender, List<? extends GeneralRegion> regions, RegionGroup filterGroup, String keyHeader, String pageInput, String baseCommand) {
int MAX_ITEMS = 20;
int ITEMS_PER_PAGE = MAX_ITEMS-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) {
for(Iterator<? extends GeneralRegion> it = regions.iterator(); it.hasNext(); ) {
if(!filterGroup.isMember(it.next())) {
it.remove();
}
}
}
if(regions.isEmpty()) {
plugin.message(sender, "info-noRegions");
} else {
long start = Calendar.getInstance().getTimeInMillis();
// First sort by type, then by name
Collections.sort(regions, new Comparator<GeneralRegion>() {
@Override
public int compare(GeneralRegion one, GeneralRegion 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)ITEMS_PER_PAGE); // Clip page to correct boundaries, not much need to tell the user
if(regions.size() == ITEMS_PER_PAGE+1) { // 19 total items is mapped to 1 page of 19
ITEMS_PER_PAGE++;
totalPages = 1;
}
page = Math.max(1, Math.min(totalPages, page));
int linesPrinted = 1; // header
for(int i = (page-1)*ITEMS_PER_PAGE; i < page*ITEMS_PER_PAGE && i < regions.size(); i++) {
String state;
GeneralRegion region = regions.get(i);
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 < MAX_ITEMS-1; i++) {
sender.sendMessage(" ");
}
footer.send(sender);
long end = Calendar.getInstance().getTimeInMillis();
}
}
}
/**
* 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), "/areashop info all");
}
// Rented regions
else if(args[1].equalsIgnoreCase("rented")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
for(Iterator<RentRegion> it = regions.iterator(); it.hasNext(); ) {
if(!it.next().isRented()) {
it.remove();
}
}
showSortedPagedList(sender, regions, filterGroup, "info-rentedHeader", (args.length > 2 ? args[2] : null), "/areashop info rented");
}
// Forrent regions
else if(args[1].equalsIgnoreCase("forrent")) {
List<RentRegion> regions = plugin.getFileManager().getRents();
for(Iterator<RentRegion> it = regions.iterator(); it.hasNext(); ) {
if(it.next().isRented()) {
it.remove();
}
}
showSortedPagedList(sender, regions, filterGroup, "info-forrentHeader", (args.length > 2 ? args[2] : null), "/areashop info forrent");
}
// Sold regions
else if(args[1].equalsIgnoreCase("sold")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
for(Iterator<BuyRegion> it = regions.iterator(); it.hasNext(); ) {
if(!it.next().isSold()) {
it.remove();
}
}
showSortedPagedList(sender, regions, filterGroup, "info-soldHeader", (args.length > 2 ? args[2] : null), "/areashop info sold");
}
// Forsale regions
else if(args[1].equalsIgnoreCase("forsale")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
for(Iterator<BuyRegion> it = regions.iterator(); it.hasNext(); ) {
if(it.next().isSold()) {
it.remove();
}
}
showSortedPagedList(sender, regions, filterGroup, "info-forsaleHeader", (args.length > 2 ? args[2] : null), "/areashop info forsale");
}
// Reselling regions
else if(args[1].equalsIgnoreCase("reselling")) {
List<BuyRegion> regions = plugin.getFileManager().getBuys();
for(Iterator<BuyRegion> it = regions.iterator(); it.hasNext(); ) {
if(!it.next().isInResellingMode()) {
it.remove();
}
}
showSortedPagedList(sender, regions, filterGroup, "info-resellingHeader", (args.length > 2 ? args[2] : null), "/areashop 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), "/areashop 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.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 {
if(regions.get(0).isRentRegion()) {
rent = (RentRegion)regions.get(0);
} else if(regions.get(0).isBuyRegion()) {
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(rent.getMaxRentTime() != -1) {
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", signLocations.toArray());
}
// 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(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", signLocations.toArray());
}
// 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");
}
}
/**
* Create a comma-space separated list from a collection of strings
* @param list The collection with strings
* @return A comma-space separated list of the strings in the collection
*/
public String createCommaString(Collection<String> list) {
String result = "";
boolean first = true;
for(String part : list) {
if(first) {
result += part;
first = false;
} else {
result += ", " + part;
}
}
return result;
}
@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;
}
}
@@ -1,83 +1,88 @@
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 org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class LinksignsCommand extends CommandAreaShop {
public LinksignsCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop linksigns";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.linksigns")) {
return plugin.getLanguageManager().getLang("help-linksigns");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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];
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
if(!profiles.contains(profile)) {
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles));
return;
}
}
plugin.getSignlinkerManager().enterSignLinkMode(player, profile);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.messages.Message;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public class LinksignsCommand extends CommandAreaShop {
public LinksignsCommand(AreaShop plugin) {
super(plugin);
}
@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];
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").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,148 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 {
public MeCommand(AreaShop plugin) {
super(plugin);
}
@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() != null && 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,79 @@
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.messages.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 {
public MessageCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop message";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.message")) {
return "help-message";
}
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;
}
}
@@ -1,46 +1,34 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class ReloadCommand extends CommandAreaShop {
public ReloadCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop reload";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.reload")) {
return plugin.getLanguageManager().getLang("help-reload");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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");
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<String>();
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.command.CommandSender;
public class ReloadCommand extends CommandAreaShop {
public ReloadCommand(AreaShop plugin) {
super(plugin);
}
@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,78 +1,74 @@
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.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 = Utils.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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
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 "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");
} else {
rent.rent(player);
}
} else {
// get the region by location
List<RentRegion> regions = Utils.getApplicableRentRegions(((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,133 +1,127 @@
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.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 = Utils.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);
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);
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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
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") || 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;
}
BuyRegion buy;
if(args.length <= 2) {
if (sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.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, "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)) {
buy.enableReselling(price);
buy.update();
plugin.message(sender, "resell-success", buy);
} else {
plugin.message(sender, "resell-noPermissionOther", 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,91 +1,89 @@
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;
}
if(region.getRegion() == null) {
plugin.message(sender, "general-noRegion", region.getName());
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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
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 "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.isRentRegion()) {
result.addAll(Arrays.asList("created", "deleted", "rented", "unrented"));
} else if(region.isBuyRegion()) {
result.addAll(Arrays.asList("created", "deleted", "bought", "sold"));
}
}
}
return result;
}
}
@@ -1,115 +1,115 @@
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.BuyRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class SellCommand extends CommandAreaShop {
public SellCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop sell";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.sell")) {
return plugin.getLanguageManager().getLang("help-sell");
} else if(target.hasPermission("areashop.sellown")) {
return plugin.getLanguageManager().getLang("help-sellOwn");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.sell") && !sender.hasPermission("areashop.sellown")) {
plugin.message(sender, "sell-noPermission");
return;
}
BuyRegion buy = null;
if(args.length <= 1) {
if (sender instanceof Player) {
// get the region by location
List<BuyRegion> regions = Utils.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, "sell-notRegistered");
return;
}
if(!buy.isSold()) {
plugin.message(sender, "sell-notBought");
return;
}
if(sender.hasPermission("areashop.sell")) {
plugin.message(sender, "sell-sold", buy.getPlayerName());
buy.sell(true);
} else {
if(sender.hasPermission("areashop.sellown") && sender instanceof Player) {
if(buy.getBuyer().equals(((Player)sender).getUniqueId())) {
plugin.message(sender, "sell-soldYours");
buy.sell(true);
} else {
plugin.message(sender, "sell-noPermissionOther");
}
} else {
plugin.message(sender, "sell-noPermission");
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
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 SellCommand extends CommandAreaShop {
public SellCommand(AreaShop plugin) {
super(plugin);
}
@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.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, "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;
}
}
@@ -1,114 +1,110 @@
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.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class SetdurationCommand extends CommandAreaShop {
public SetdurationCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop setduration";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setduration")) {
return plugin.getLanguageManager().getLang("help-setduration");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length <= regionArgument) {
if (sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.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 {
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") && !rent.isLandlord(((Player)sender).getUniqueId())) {
plugin.message(sender, "setduration-noLandlord", rent);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
plugin.message(sender, "setduration-successRemoved", rent);
rent.setDuration(null);
rent.updateRegionFlags();
rent.updateSigns();
return;
}
try {
Integer.parseInt(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setduration-wrongAmount", args[1]);
return;
}
if(!plugin.checkTimeFormat(args[1] + " " + args[2])) {
plugin.message(sender, "setduration-wrongFormat", args[1]+" "+args[2]);
return;
}
rent.setDuration(args[1]+" "+args[2]);
rent.updateRegionFlags();
rent.updateSigns();
plugin.message(sender, "setduration-success", rent.getName(), rent.getDurationString());
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
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;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetdurationCommand extends CommandAreaShop {
public SetdurationCommand(AreaShop plugin) {
super(plugin);
}
@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.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 {
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;
}
}
@@ -1,93 +1,92 @@
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 org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class SetlandlordCommand extends CommandAreaShop {
public SetlandlordCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop setlandlord";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setlandlord")) {
return plugin.getLanguageManager().getLang("help-setlandlord");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length < 3) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.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, "setlandlord-noRegion", args[2]);
return;
}
String playerName = player.getName();
if(playerName == null || playerName.isEmpty()) {
playerName = args[1];
}
region.setLandlord(player.getUniqueId(), playerName);
plugin.message(sender, "setlandlord-success", playerName, region.getName());
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
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 {
public SetlandlordCommand(AreaShop plugin) {
super(plugin);
}
@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.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, "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,152 +1,138 @@
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.Utils;
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 = Utils.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);
rent.updateRegionFlags();
rent.updateSigns();
} 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();
}
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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 {
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 "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.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", region);
return;
}
if(region.isBuyRegion() && !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.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
rent.setRenter(uuid);
plugin.message(sender, "setowner-succesRent", region);
}
}
if(region.isBuyRegion()) {
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;
}
}
@@ -1,113 +1,108 @@
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.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class SetpriceCommand extends CommandAreaShop {
public SetpriceCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop setprice";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.setprice")) {
return plugin.getLanguageManager().getLang("help-setprice");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length < 3) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.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, "setprice-notRegistered", args[2]);
return;
}
if(!sender.hasPermission("areashop.setprice") && !region.isLandlord(((Player)sender).getUniqueId())) {
plugin.message(sender, "setprice-noLandlord", region);
return;
}
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
if(region.isRentRegion()) {
((RentRegion)region).removePrice();
} else if(region.isBuyRegion()) {
((BuyRegion)region).removePrice();
}
plugin.message(sender, "setprice-successRemoved", region);
region.updateSigns();
region.updateRegionFlags();
return;
}
double price = 0.0;
try {
price = Double.parseDouble(args[1]);
} catch(NumberFormatException e) {
plugin.message(sender, "setprice-wrongPrice", args[1]);
return;
}
AreaShop.debug("price: " + price + ", raw: " + args[1]);
if(region.isRentRegion()) {
((RentRegion)region).setPrice(price);
plugin.message(sender, "setprice-successRent", region);
} else if(region.isBuyRegion()) {
((BuyRegion)region).setPrice(price);
plugin.message(sender, "setprice-successBuy", region);
}
region.updateSigns();
region.updateRegionFlags();
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
if(toComplete == 3) {
result = plugin.getFileManager().getRegionNames();
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetpriceCommand extends CommandAreaShop {
public SetpriceCommand(AreaShop plugin) {
super(plugin);
}
@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.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, "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.isRentRegion()) {
((RentRegion)region).removePrice();
} else if(region.isBuyRegion()) {
((BuyRegion)region).removePrice();
}
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.isRentRegion()) {
((RentRegion)region).setPrice(price);
plugin.message(sender, "setprice-successRent", region);
} else if(region.isBuyRegion()) {
((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,79 +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.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;
}
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", region.getName(), valueString, args[3]);
} else {
plugin.message(sender, "setrestore-success", region.getName(), valueString);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.command.CommandSender;
import java.util.ArrayList;
import java.util.List;
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 "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;
}
}
@@ -1,116 +1,123 @@
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.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class SetteleportCommand extends CommandAreaShop {
public SetteleportCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop settp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.teleportall")) {
return plugin.getLanguageManager().getLang("help-setteleportAll");
} else if(target.hasPermission("areashop.teleport")) {
return plugin.getLanguageManager().getLang("help-setteleport");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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 = null;
if(args.length < 2) {
if (sender instanceof Player) {
// get the region by location
List<GeneralRegion> regions = Utils.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[1]);
}
boolean owner = false;
if(region == null) {
plugin.message(player, "setteleport-noRentOrBuy", args[1]);
return;
}
if(region.isRentRegion()) {
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");
return;
} else if(!owner && !player.hasPermission("areashop.setteleportall")) {
plugin.message(player, "setteleport-noPermissionOther");
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.setTeleport(null);
plugin.message(player, "setteleport-reset", region.getName());
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.getName());
return;
}
region.setTeleport(player.getLocation());
plugin.message(player, "setteleport-success", region.getName());
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("reset");
}
return result;
}
}
package me.wiefferink.areashop.commands;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SetteleportCommand extends CommandAreaShop {
public SetteleportCommand(AreaShop plugin) {
super(plugin);
}
@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.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 {
region = plugin.getFileManager().getRegion(args[1]);
}
boolean owner;
if(region == null) {
plugin.message(player, "setteleport-noRentOrBuy", args[1]);
return;
}
if(region.isRentRegion()) {
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.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.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;
}
}
@@ -1,229 +1,249 @@
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.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
import nl.evolutioncoding.areashop.regions.RegionGroup;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Location;
import org.bukkit.block.BlockFace;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
public class StackCommand extends CommandAreaShop {
public StackCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop stack";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.stack")) {
return plugin.getLanguageManager().getLang("help-stack");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, 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) {}
if(tempAmount <= 0) {
plugin.message(player, "stack-wrongAmount", args[1]);
return;
}
// Check gap
int gap = -1;
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 Selection selection = plugin.getWorldEdit().getSelection(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(!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST)) {
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
return;
}
final Location shift = new Location(selection.getWorld(), 0, 0, 0);
if(facing == BlockFace.SOUTH) {
shift.setZ(-selection.getLength() - gap);
} else if(facing == BlockFace.WEST) {
shift.setX(selection.getWidth() + gap);
} else if(facing == BlockFace.NORTH) {
shift.setZ(selection.getLength() + gap);
} else if(facing == BlockFace.EAST) {
shift.setX(-selection.getWidth() - gap);
}
AreaShop.debug(" calculated shift vector: " + shift + ", with facing=" + facing);
// Create regions and add them to AreaShop
final String namePrefix = 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;
String type = null;
if(rentRegions) {
type = "rent";
} else {
type = "buy";
}
String groupsMessage = "";
if(group != null) {
groupsMessage = plugin.getLanguageManager().getLang("stack-addToGroup", group.getName());
}
plugin.message(player, "stack-accepted", amount, type, gap, namePrefix, groupsMessage);
plugin.message(player, "stack-addStart", amount, regionsPerTick*20);
new BukkitRunnable() {
private int current = 0;
private RegionManager manager = AreaShop.getInstance().getWorldGuard().getRegionManager(selection.getWorld());
private int counter = 1;
@Override
public void run() {
for(int i=0; i<regionsPerTick; i++) {
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 = namePrefix + 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;
}
regionName = namePrefix + counterName;
}
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName,
new BlockVector(
selection.getMinimumPoint().getBlockX() + shift.getBlockX()*current,
selection.getMinimumPoint().getBlockY() + shift.getBlockY()*current,
selection.getMinimumPoint().getBlockZ() + shift.getBlockZ()*current
),
new BlockVector(
selection.getMaximumPoint().getBlockX() + shift.getBlockX()*current,
selection.getMaximumPoint().getBlockY() + shift.getBlockY()*current,
selection.getMaximumPoint().getBlockZ() + shift.getBlockZ()*current
)
);
manager.addRegion(region);
// Add the region to AreaShop
if(rentRegions) {
RentRegion rent = new RentRegion(plugin, region.getId(), selection.getWorld());
if(finalGroup != null) {
finalGroup.addMember(rent);
}
rent.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(RegionEvent.CREATED);
rent.updateRegionFlags();
rent.runEventCommands(RegionEvent.CREATED, false);
} else {
BuyRegion buy = new BuyRegion(plugin, region.getId(), selection.getWorld());
if(finalGroup != null) {
finalGroup.addMember(buy);
}
buy.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(RegionEvent.CREATED);
buy.updateRegionFlags();
buy.runEventCommands(RegionEvent.CREATED, false);
}
current++;
}
}
if(current >= amount) {
if(player.isOnline()) {
plugin.message(player, "stack-addComplete");
}
this.cancel();
}
}
}.runTaskTimer(plugin, 1, 1);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
if(toComplete == 5) {
result.add("rent");
result.add("buy");
} else if(toComplete == 6) {
result.addAll(plugin.getFileManager().getGroupNames());
}
return result;
}
}
package me.wiefferink.areashop.commands;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.messages.Message;
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.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 {
public StackCommand(AreaShop plugin) {
super(plugin);
}
@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 Selection selection = plugin.getWorldEdit().getSelection(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 namePrefix = 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, namePrefix, groupsMessage);
plugin.message(player, "stack-addStart", amount, regionsPerTick*20);
new BukkitRunnable() {
private int current = -1;
private RegionManager manager = AreaShop.getInstance().getWorldGuard().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 = namePrefix + 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;
}
regionName = namePrefix + 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(selection.getNativeMinimumPoint().add(finalShift.multiply(current)));
BlockVector maximum = new BlockVector(selection.getNativeMaximumPoint().add(finalShift.multiply(current)));
// Check for out of bounds
if (minimum.getBlockY() < 0) {
tooLow++;
continue;
} else if (maximum.getBlockY() > 256) {
tooHigh++;
continue;
}
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName, minimum, maximum);
manager.addRegion(region);
// Add the region to AreaShop
if(rentRegions) {
RentRegion rent = new RentRegion(plugin, region.getId(), selection.getWorld());
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(plugin, region.getId(), 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,122 +1,116 @@
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.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 = Utils.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();
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();
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, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.BuyRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
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") || 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.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, "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;
}
}
@@ -1,73 +1,86 @@
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;
import org.bukkit.entity.Player;
public class TeleportCommand extends CommandAreaShop {
public TeleportCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop tp";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.teleportall")) {
return plugin.getLanguageManager().getLang("help-teleportAll");
} else if(target.hasPermission("areashop.teleport")) {
return plugin.getLanguageManager().getLang("help-teleport");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.teleport") && !sender.hasPermission("areashop.teleportall") && !sender.hasPermission("areashop.teleportsign") && !sender.hasPermission("areashop.teleportsignall") && !sender.hasPermission("areashop.teleportfriend") && !sender.hasPermission("teleportfriendsign")) {
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.teleportPlayer(player, true);
} else {
region.teleportPlayer(player, false);
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.addAll(plugin.getFileManager().getRegionNames());
} else if(toComplete == 3) {
result.add("sign");
}
return result;
}
}
package me.wiefferink.areashop.commands;
import me.wiefferink.areashop.AreaShop;
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 {
public TeleportCommand(AreaShop plugin) {
super(plugin);
}
@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.teleportPlayer(player, true);
} else {
region.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;
}
}
@@ -1,107 +1,107 @@
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.RentRegion;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class UnrentCommand extends CommandAreaShop {
public UnrentCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop unrent";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.unrent")) {
return plugin.getLanguageManager().getLang("help-unrent");
} else if(target.hasPermission("areashop.unrentown")) {
return plugin.getLanguageManager().getLang("help-unrentOwn");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.unrent") && !sender.hasPermission("areashop.unrentown")) {
plugin.message(sender, "unrent-noPermission");
return;
}
RentRegion rent = null;
if(args.length <= 1) {
if (sender instanceof Player) {
// get the region by location
List<RentRegion> regions = Utils.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 {
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");
return;
}
if(sender.hasPermission("areashop.unrent")) {
plugin.message(sender, "unrent-other", rent.getPlayerName());
rent.unRent(true);
} else {
if(sender.hasPermission("areashop.unrentown") && sender instanceof Player) {
if(rent.getRenter().equals(((Player)sender).getUniqueId())) {
plugin.message(sender, "unrent-unrented");
rent.unRent(true);
} else {
plugin.message(sender, "unrent-noPermissionOther");
}
} else {
plugin.message(sender, "unrent-noPermission");
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
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.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class UnrentCommand extends CommandAreaShop {
public UnrentCommand(AreaShop plugin) {
super(plugin);
}
@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.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 {
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,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.entity.Player;
/**
* Broadcasted when a player tries to buy a region.
*/
public class BuyingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private Player 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, Player 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 Player 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.entity.Player;
/**
* Broadcasted when a player tries to rent a region
*/
public class RentingRegionEvent extends CancellableRegionEvent<RentRegion> {
private Player player;
private 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, Player 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 Player 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.entity.Player;
/**
* Broadcasted when a player tries to resell a region
*/
public class ResellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
private Player 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, Player 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 Player 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 OfflinePlayer friend;
private 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 OfflinePlayer friend;
private 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 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 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 UUID oldBuyer;
private 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,44 @@
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 RentRegion region;
private UUID oldRenter;
private 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,87 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.ask.*;
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
import me.wiefferink.areashop.events.notify.*;
import org.bukkit.event.EventHandler;
public class DebugFeature extends Feature {
@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,26 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
public class Feature implements Listener {
public AreaShop plugin = AreaShop.getInstance();
public YamlConfiguration config = plugin.getConfig();
/**
* Start listening to events
*/
public void listen() {
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Stop listening to events
*/
public void stopListen() {
HandlerList.unregisterAll(this);
}
}
@@ -0,0 +1,107 @@
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.*;
public class FriendsFeature extends Feature {
private GeneralRegion region;
public FriendsFeature(GeneralRegion region) {
this.region = 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(region, 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<>(region.getConfig().getStringList("general.friends"));
friends.add(player.toString());
List<String> list = new ArrayList<>(friends);
region.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(region, 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<>(region.getConfig().getStringList("general.friends"));
friends.remove(player.toString());
List<String> list = new ArrayList<>(friends);
if(list.isEmpty()) {
region.setSetting("general.friends", null);
} else {
region.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 : region.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) {
result.add(player.getName());
}
}
return result;
}
/**
* Remove all friends that are added to this region
*/
public void clearFriends() {
region.setSetting("general.friends", null);
}
}
@@ -0,0 +1,352 @@
package me.wiefferink.areashop.features;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
import me.wiefferink.areashop.messages.Message;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
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 org.bukkit.event.EventHandler;
import java.util.*;
public class SignsFeature extends Feature {
private static Map<String, RegionSign> allSigns = new HashMap<>();
private GeneralRegion region;
private Map<String, RegionSign> signs;
public SignsFeature() {
}
public SignsFeature(GeneralRegion region) {
this.region = 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(region, 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);
}
allSigns.putAll(signs);
}
}
/**
* 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();
}
/**
* 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));
}
@EventHandler
public void regionUpdate(UpdateRegionEvent event) {
event.getRegion().getSignsFeature().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 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(region.getConfig().isSet("general.signs."+i)) {
i++;
}
String signPath = "general.signs."+i+".";
region.setSetting(signPath+"location", Utils.locationToConfig(location));
region.setSetting(signPath+"facing", facing.name());
region.setSetting(signPath+"signType", signType.name());
if(profile != null && profile.length() != 0) {
region.setSetting(signPath+"profile", profile);
}
// Add to the map
RegionSign sign = new RegionSign(region, this, i+"");
signs.put(sign.getStringLocation(), sign);
allSigns.put(sign.getStringLocation(), 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(region.getConfig().getConfigurationSection("general.signs") == null) {
return false;
}
signs = region.getConfig().getConfigurationSection("general.signs").getKeys(false);
for(String sign : signs) {
Location signLocation = Utils.configToLocation(region.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;
}
/**
* Sign that is connected to a region to display information and interact with the region
*/
public class RegionSign {
private GeneralRegion region;
private SignsFeature signsFeature;
private String key;
public RegionSign(GeneralRegion region, SignsFeature signsFeature, String key) {
this.region = region;
this.signsFeature = signsFeature;
this.key = key;
}
/**
* Get the location of this sign
* @return The location of this sign
*/
public Location getLocation() {
return Utils.configToLocation(region.getConfig().getConfigurationSection("general.signs."+key+".location"));
}
/**
* Location string to be used as key in maps
* @return Location string
*/
public String getStringLocation() {
return locationToString(getLocation());
}
/**
* Get the region this sign is linked to
* @return The region this sign is linked to
*/
public GeneralRegion getRegion() {
return region;
}
/**
* Remove this sign from the region
*/
public void remove() {
getLocation().getBlock().setType(Material.AIR);
signs.remove(getStringLocation());
allSigns.remove(getStringLocation());
region.setSetting("general.signs."+key, null);
}
/**
* Get the ConfigurationSection defining the sign layout
* @return The sign layout config
*/
public ConfigurationSection getProfile() {
return region.getConfigurationSectionSetting("general.signProfile", "signProfiles", region.getConfig().get("general.signs."+key+".profile"));
}
/**
* Update this sign
* @return true if the update was successful, otherwise false
*/
public boolean update() {
if(region.isDeleted()) {
return false;
}
YamlConfiguration regionConfig = region.getConfig();
ConfigurationSection signConfig = getProfile();
Block block = getLocation().getBlock();
if(signConfig == null || !signConfig.isSet(region.getState().getValue())) {
block.setType(Material.AIR);
return true;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(region.getState().getValue());
// Get the lines
String[] signLines = new String[4];
boolean signEmpty = true;
for(int i = 0; i < 4; i++) {
signLines[i] = stateConfig.getString("line"+(i+1));
signEmpty &= (signLines[i] == null || signLines[i].isEmpty());
}
if(signEmpty) {
block.setType(Material.AIR);
return true;
}
Sign signState = null;
// Place the sign back (with proper rotation and type) after it has been hidden or (indirectly) destroyed
if(block.getType() != Material.WALL_SIGN && block.getType() != Material.SIGN_POST) {
Material signType;
try {
signType = Material.valueOf(regionConfig.getString("general.signs."+key+".signType"));
} catch(NullPointerException|IllegalArgumentException e) {
signType = null;
}
if(signType != Material.WALL_SIGN && signType != Material.SIGN_POST) {
AreaShop.debug("Setting sign", key, "of region", region.getName(), "failed, could not set sign block back");
return false;
}
block.setType(signType);
signState = (Sign)block.getState();
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
BlockFace signFace;
try {
signFace = BlockFace.valueOf(regionConfig.getString("general.signs."+key+".facing"));
} catch(NullPointerException|IllegalArgumentException e) {
signFace = null;
}
if(signFace != null) {
signData.setFacingDirection(signFace);
signState.setData(signData);
}
}
if(signState == null) {
signState = (Sign)block.getState();
}
// Save current rotation and type
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
if(!regionConfig.isString("general.signs."+key+".signType")) {
region.setSetting("general.signs."+key+".signType", signState.getType().toString());
}
if(!regionConfig.isString("general.signs."+key+".facing")) {
region.setSetting("general.signs."+key+".facing", signData.getFacing().toString());
}
// Apply replacements and color and then set it on the sign
for(int i = 0; i < signLines.length; i++) {
if(signLines[i] == null) {
signState.setLine(i, "");
continue;
}
signLines[i] = Message.fromString(signLines[i]).replacements(region).getSingle();
signLines[i] = Utils.applyColors(signLines[i]);
signState.setLine(i, signLines[i]);
}
signState.update();
return true;
}
/**
* 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(region.getState().getValue().toLowerCase())) {
return false;
}
ConfigurationSection stateConfig = signConfig.getConfigurationSection(region.getState().getValue().toLowerCase());
// Check the lines for the timeleft tag
for(int i = 1; i <= 4; i++) {
String line = stateConfig.getString("line"+i);
if(line != null && !line.isEmpty() && line.contains(Message.VARIABLESTART+AreaShop.tagTimeLeft+Message.VARIABLEEND)) {
return true;
}
}
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(region.getState().getValue().toLowerCase());
// Run player commands if specified
List<String> playerCommands = new ArrayList<>();
for(String command : stateConfig.getStringList(clickType.getValue()+"Player")) {
playerCommands.add(command.replace(Message.VARIABLESTART+AreaShop.tagClicker+Message.VARIABLEEND, clicker.getName()));
}
region.runCommands(clicker, playerCommands);
// Run console commands if specified
List<String> consoleCommands = new ArrayList<>();
for(String command : stateConfig.getStringList(clickType.getValue()+"Console")) {
consoleCommands.add(command.replace(Message.VARIABLESTART+AreaShop.tagClicker+Message.VARIABLEEND, clicker.getName()));
}
region.runCommands(Bukkit.getConsoleSender(), consoleCommands);
return !playerCommands.isEmpty() || !consoleCommands.isEmpty();
}
}
}
@@ -0,0 +1,212 @@
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.messages.Message;
import me.wiefferink.areashop.regions.GeneralRegion;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.event.EventHandler;
import java.util.Set;
public class WorldGuardRegionFlagsFeature extends Feature {
@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
*/
protected 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
String allPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+".ALL";
ConfigurationSection allFlags = flagProfileSection.getConfigurationSection("ALL");
if(allFlags != null) {
result = result && updateRegionFlags(region, allFlags);
}
// Region flags for the current state
String specificPath = "flagProfiles."+region.getStringSetting("general.flagProfile")+"."+region.getState().getValue();
ConfigurationSection stateFlags = flagProfileSection.getConfigurationSection(region.getState().getValue());
if(stateFlags != null) {
result = result && updateRegionFlags(region, stateFlags);
}
return result;
}
/**
* 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
*/
protected boolean updateRegionFlags(GeneralRegion region, ConfigurationSection flags) {
boolean result = true;
Set<String> flagNames = flags.getKeys(false);
WorldGuardPlugin worldGuard = plugin.getWorldGuard();
// Get the region
ProtectedRegion wRegion = region.getRegion();
if(wRegion == 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(wRegion, value);
//AreaShop.debug(" Flag " + flagName + " set: " + members.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("owners")) {
plugin.getWorldGuardHandler().setOwners(wRegion, value);
//AreaShop.debug(" Flag " + flagName + " set: " + owners.toUserFriendlyString());
} else if(flagName.equalsIgnoreCase("priority")) {
try {
int priority = Integer.parseInt(value);
wRegion.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 || worldGuard.getRegionManager(region.getWorld()) == null) {
continue;
}
ProtectedRegion parentRegion = worldGuard.getRegionManager(region.getWorld()).getRegion(value);
if(parentRegion != null) {
try {
wRegion.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()) {
wRegion.setFlag(foundFlag, null);
if(groupFlag != null) {
wRegion.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(wRegion, 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()) {
wRegion.setFlag(groupFlag, null);
//AreaShop.debug(" Group of flag " + flagName + " set to default: " + groupValue);
} else {
wRegion.setFlag(groupFlag, groupValue);
//AreaShop.debug(" Group of flag " + flagName + " set: " + groupValue);
}
}
}
}
}
// Indicate that the regions needs to be saved
plugin.getFileManager().saveIsRequiredForRegionWorld(region.getWorldName());
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 {
region.setFlag(flag, plugin.getWorldGuardHandler().parseFlagInput(flag, value));
}
/**
* 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
*/
public 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;
}
}
@@ -1,172 +1,170 @@
package nl.evolutioncoding.areashop.listeners;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RentRegion;
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 org.bukkit.scheduler.BukkitRunnable;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class PlayerLoginLogoutListener implements Listener {
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();
// Notify admins for plugin updates
if(plugin.updateAvailable() && player.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(player, "update-playerNotify", AreaShop.getInstance().getDescription().getVersion(), AreaShop.getInstance().getUpdater().getLatestName());
}
// Schedule task to check for notifications, prevents a lag spike at login
new BukkitRunnable() {
@Override
public void run() {
// Delay until all regions are loaded
if(!plugin.isReady()) {
return;
}
if(!player.isOnline()) {
this.cancel();
return;
}
// 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 = plugin.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);
}
}
}
this.cancel();
}
}.runTaskTimer(plugin, 25, 25);
// Check if the player has regions that use an old name of him and update them
final List<GeneralRegion> regions = new ArrayList<GeneralRegion>(plugin.getFileManager().getRegions());
new BukkitRunnable() {
private int current = 0;
@Override
public void run() {
// Delay until all regions are loaded
if(!plugin.isReady()) {
return;
}
// Check all regions
for(int i=0; i<plugin.getConfig().getInt("nameupdate.regionsPerTick"); i++) {
if(current < regions.size()) {
GeneralRegion region = regions.get(current);
if(region.isOwner(player)) {
if(region.isBuyRegion()) {
if(!player.getName().equals(region.getStringSetting("buy.buyerName"))) {
region.setSetting("buy.buyerName", player.getName());
region.updateRegionFlags();
region.updateSigns();
}
} else if(region.isRentRegion()) {
if(!player.getName().equals(region.getStringSetting("rent.renterName"))) {
region.setSetting("rent.renterName", player.getName());
region.updateRegionFlags();
region.updateSigns();
}
}
}
current++;
}
}
if(current >= regions.size()) {
this.cancel();
}
}
}.runTaskTimer(plugin, 22, 1); // Wait a bit before starting to prevent a lot of stress on the server when a player joins (a lot of plugins already do stuff then)
}
// 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
*/
public void updateLastActive(Player player) {
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.isOwner(player)) {
region.updateLastActiveTime();
}
}
}
}
package me.wiefferink.areashop.listeners;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.regions.GeneralRegion;
import me.wiefferink.areashop.regions.RentRegion;
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 org.bukkit.scheduler.BukkitRunnable;
import java.util.ArrayList;
import java.util.List;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class PlayerLoginLogoutListener implements Listener {
private 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();
// Notify admins for plugin updates
if(plugin.updateAvailable() && player.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(player, "update-playerNotify", AreaShop.getInstance().getDescription().getVersion(), AreaShop.getInstance().getUpdater().getLatestName());
}
// Schedule task to check for notifications, prevents a lag spike at login
new BukkitRunnable() {
@Override
public void run() {
// Delay until all regions are loaded
if(!plugin.isReady()) {
return;
}
if(!player.isOnline()) {
this.cancel();
return;
}
// 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);
}
}
}
this.cancel();
}
}.runTaskTimer(plugin, 25, 25);
// Check if the player has regions that use an old name of him and update them
final List<GeneralRegion> regions = new ArrayList<>(plugin.getFileManager().getRegions());
new BukkitRunnable() {
private int current = 0;
@Override
public void run() {
// Delay until all regions are loaded
if(!plugin.isReady()) {
return;
}
// Check all regions
for(int i=0; i<plugin.getConfig().getInt("nameupdate.regionsPerTick"); i++) {
if(current < regions.size()) {
GeneralRegion region = regions.get(current);
if(region.isOwner(player)) {
if(region.isBuyRegion()) {
if(!player.getName().equals(region.getStringSetting("buy.buyerName"))) {
region.setSetting("buy.buyerName", player.getName());
region.update();
}
} else if(region.isRentRegion()) {
if(!player.getName().equals(region.getStringSetting("rent.renterName"))) {
region.setSetting("rent.renterName", player.getName());
region.update();
}
}
}
current++;
}
}
if(current >= regions.size()) {
this.cancel();
}
}
}.runTaskTimer(plugin, 22, 1); // Wait a bit before starting to prevent a lot of stress on the server when a player joins (a lot of plugins already do stuff then)
}
// 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();
}
}
}
}
@@ -1,134 +1,131 @@
package nl.evolutioncoding.areashop.listeners;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class SignBreakListener implements Listener {
AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignBreakListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a block is broken
* @param event The event
*/
@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 */
GeneralRegion region = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(region == null) {
return;
}
/* Remove the sign of the rental region if the player has permission */
if(event.getPlayer().hasPermission("areashop.delsign")) {
region.removeSign(block.getLocation());
plugin.message(event.getPlayer(), "delsign-success", region.getName());
} else { /* Cancel the breaking of the sign */
event.setCancelled(true);
plugin.message(event.getPlayer(), "delsign-noPermission");
}
}
}
/**
* Called when the physics of a block change
* @param event The event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onIndirectSignBreak(BlockPhysicsEvent event){
Block block = event.getBlock();
if(event.isCancelled()) {
return;
}
if(block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN){
Sign sign = (Sign)block.getState();
Block attachedTo = block.getRelative(((org.bukkit.material.Sign)sign.getData()).getAttachedFace());
if(attachedTo.getType() == Material.AIR){
/* Check if the rent sign is really the same as a saved rent */
GeneralRegion region = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(region == null) {
return;
}
region.removeSign(block.getLocation());
plugin.getLogger().warning("A sign of region " + region.getName() + " has been removed by indirectly breaking it (block below/behind is destroyed)");
}
}
}
}
package me.wiefferink.areashop.listeners;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.SignsFeature;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.Sign;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class SignBreakListener implements Listener {
private AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignBreakListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a block is broken
* @param event The event
*/
@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
SignsFeature.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());
}
}
}
/**
* Called when the physics of a block change
* @param event The event
*/
@EventHandler(priority = EventPriority.HIGHEST)
public void onIndirectSignBreak(BlockPhysicsEvent event){
Block block = event.getBlock();
if(event.isCancelled()) {
return;
}
if(block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN){
Sign sign = (Sign)block.getState();
Block attachedTo = block.getRelative(((org.bukkit.material.Sign)sign.getData()).getAttachedFace());
if(attachedTo.getType() == Material.AIR){
// Check if the rent sign is really the same as a saved rent
SignsFeature.RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign != null) {
event.setCancelled(true); // Cancel the sign breaking, will create a floating sign but at least it is not disconnected/gone
}
}
}
}
}
@@ -1,370 +1,359 @@
package nl.evolutioncoding.areashop.listeners;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.managers.FileManager.AddResult;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.material.Sign;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldguard.protection.ApplicableRegionSet;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class SignChangeListener implements Listener {
AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignChangeListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a sign is changed
* @param event The event
*/
@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.getWorldGuard().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) {
// TODO move to version specific classes or use available method
ApplicableRegionSet regions = regionManager.getApplicableRegions(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.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} 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, "setup-wrongRegion");
return;
}
AddResult addResult = plugin.getFileManager().checkRegionAdd(player, regionManager.getRegion(secondLine), RegionType.RENT);
if(addResult == AddResult.BLACKLISTED) {
plugin.message(player, "setup-blacklisted", secondLine);
return;
} else if(addResult == AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign");
return;
} else if(addResult == AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
return;
} else if(thirdLine != null && thirdLine.length() != 0 && !plugin.checkTimeFormat(thirdLine)) {
plugin.message(player, "setup-wrongDuration");
return;
} 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(plugin, secondLine, event.getPlayer().getWorld());
boolean isMember = player != null && plugin.getWorldGuardHandler().containsMember(rent.getRegion(), player.getUniqueId());
boolean isOwner = player != null && 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);
}
Sign sign = (Sign)event.getBlock().getState().getData();
rent.addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
// Run commands
rent.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addRent(rent);
rent.handleSchematicEvent(RegionEvent.CREATED);
// Update the sign later because this event will do it first
new BukkitRunnable() {
@Override
public void run() {
rent.updateSigns();
}
}.runTaskLater(plugin, 1);
// Set the flags for the region
rent.updateRegionFlags();
plugin.message(player, "setup-rentSuccess", rent.getName());
// Run commands
rent.runEventCommands(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.getWorldGuard().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) {
ApplicableRegionSet regions = regionManager.getApplicableRegions(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.getParent() != null && pr.getParent().equals(candidate)) {
candidate = pr;
} else if(pr.getPriority() == candidate.getPriority()) {
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, "setup-wrongRegion");
return;
}
AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, RegionType.BUY);
if(addResult == AddResult.BLACKLISTED) {
plugin.message(player, "setup-blacklisted", secondLine);
return;
} else if(addResult == AddResult.ALREADYADDED) {
plugin.message(player, "setup-alreadyRentSign");
return;
} else if(addResult == AddResult.NOPERMISSION) {
plugin.message(player, "setup-noPermission", secondLine);
return;
} 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(plugin, secondLine, event.getPlayer().getWorld());
boolean isMember = player != null && plugin.getWorldGuardHandler().containsMember(buy.getRegion(), player.getUniqueId());
boolean isOwner = player != null && 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);
}
Sign sign = (Sign)event.getBlock().getState().getData();
buy.addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
// Run commands
buy.runEventCommands(RegionEvent.CREATED, true);
plugin.getFileManager().addBuy(buy);
buy.handleSchematicEvent(RegionEvent.CREATED);
// Update the sign later because this event will do it first
new BukkitRunnable() {
@Override
public void run() {
buy.updateSigns();
}
}.runTaskLater(plugin, 1);
// Set the flags for the region
buy.updateRegionFlags();
plugin.message(player, "setup-buySuccess", regionManager.getRegion(secondLine).getId());
// Run commands
buy.runEventCommands(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 = null;
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-noRegion", secondLine);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getASRegionsInSelection(new CuboidSelection(event.getBlock().getWorld(), event.getBlock().getLocation(), 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);
}
Sign sign = (Sign)event.getBlock().getState().getData();
if(thirdLine == null || thirdLine.length() == 0) {
region.addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
plugin.message(player, "addsign-success", region);
} else {
region.addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), thirdLine);
plugin.message(player, "addsign-successProfile", region, thirdLine);
}
// Update the sign later because this event will do it first
final GeneralRegion regionUpdate = region;
new BukkitRunnable() {
@Override
public void run() {
regionUpdate.updateSigns();
}
}.runTaskLater(plugin, 1);
}
}
}
package me.wiefferink.areashop.listeners;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
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 org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.material.Sign;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.List;
import java.util.Set;
/**
* Checks for placement of signs for this plugin
* @author NLThijs48
*/
public final class SignChangeListener implements Listener {
private AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignChangeListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a sign is changed
* @param event The event
*/
@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.getWorldGuard().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), 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.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(plugin, 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);
}
Sign sign = (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
new BukkitRunnable() {
@Override
public void run() {
rent.update();
}
}.runTaskLater(plugin, 1);
// 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.getWorldGuard().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, 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.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(plugin, 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);
}
Sign sign = (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
new BukkitRunnable() {
@Override
public void run() {
buy.update();
}
}.runTaskLater(plugin, 1);
// 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, "cmd-noRegion", secondLine);
return;
}
} else {
// Get region by sign position
List<GeneralRegion> regions = Utils.getASRegionsInSelection(new CuboidSelection(event.getBlock().getWorld(), event.getBlock().getLocation(), 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);
}
Sign sign = (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
final GeneralRegion regionUpdate = region;
new BukkitRunnable() {
@Override
public void run() {
regionUpdate.update();
}
}.runTaskLater(plugin, 1);
}
}
}
@@ -1,93 +1,94 @@
package nl.evolutioncoding.areashop.listeners;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.ClickType;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
public class SignClickListener implements Listener {
AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignClickListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a player interacts
* @param event The event
*/
@EventHandler(priority = EventPriority.HIGH)
public void onSignClick(PlayerInteractEvent event) {
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 */
GeneralRegion result = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(result == null) {
return;
}
String signName = result.getSignName(block.getLocation());
Player player = event.getPlayer();
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
return;
}
// Get the clicktype
ClickType clickType = null;
if(player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = ClickType.SHIFTLEFTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = ClickType.LEFTCLICK;
} else if(player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = ClickType.SHIFTRIGHTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = ClickType.RIGHTCLICK;
}
// Run the commands
boolean runned = result.runSignCommands(signName, player, clickType);
// Only cancel event if at least one command has been executed
event.setCancelled(runned);
}
}
}
package me.wiefferink.areashop.listeners;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion.ClickType;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent;
public class SignClickListener implements Listener {
private AreaShop plugin;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public SignClickListener(AreaShop plugin) {
this.plugin = plugin;
}
/**
* Called when a player interacts
* @param event The event
*/
@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
SignsFeature.RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
if(regionSign == null) {
return;
}
Player player = event.getPlayer();
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
return;
}
// Get the clicktype
ClickType clickType = null;
if(player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = ClickType.SHIFTLEFTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
clickType = ClickType.LEFTCLICK;
} else if(player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = ClickType.SHIFTRIGHTCLICK;
} else if(!player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
clickType = 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);
}
}
}
@@ -1,214 +1,186 @@
package nl.evolutioncoding.areashop.managers;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.commands.AddCommand;
import nl.evolutioncoding.areashop.commands.AddfriendCommand;
import nl.evolutioncoding.areashop.commands.AddsignCommand;
import nl.evolutioncoding.areashop.commands.BuyCommand;
import nl.evolutioncoding.areashop.commands.CommandAreaShop;
import nl.evolutioncoding.areashop.commands.DelCommand;
import nl.evolutioncoding.areashop.commands.DelfriendCommand;
import nl.evolutioncoding.areashop.commands.DelsignCommand;
import nl.evolutioncoding.areashop.commands.FindCommand;
import nl.evolutioncoding.areashop.commands.GroupaddCommand;
import nl.evolutioncoding.areashop.commands.GroupdelCommand;
import nl.evolutioncoding.areashop.commands.GroupinfoCommand;
import nl.evolutioncoding.areashop.commands.GrouplistCommand;
import nl.evolutioncoding.areashop.commands.HelpCommand;
import nl.evolutioncoding.areashop.commands.InfoCommand;
import nl.evolutioncoding.areashop.commands.LinksignsCommand;
import nl.evolutioncoding.areashop.commands.MeCommand;
import nl.evolutioncoding.areashop.commands.ReloadCommand;
import nl.evolutioncoding.areashop.commands.RentCommand;
import nl.evolutioncoding.areashop.commands.ResellCommand;
import nl.evolutioncoding.areashop.commands.SchematiceventCommand;
import nl.evolutioncoding.areashop.commands.SellCommand;
import nl.evolutioncoding.areashop.commands.SetdurationCommand;
import nl.evolutioncoding.areashop.commands.SetlandlordCommand;
import nl.evolutioncoding.areashop.commands.SetownerCommand;
import nl.evolutioncoding.areashop.commands.SetpriceCommand;
import nl.evolutioncoding.areashop.commands.SetrestoreCommand;
import nl.evolutioncoding.areashop.commands.SetteleportCommand;
import nl.evolutioncoding.areashop.commands.StackCommand;
import nl.evolutioncoding.areashop.commands.StopresellCommand;
import nl.evolutioncoding.areashop.commands.TeleportCommand;
import nl.evolutioncoding.areashop.commands.UnrentCommand;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabCompleter;
import org.bukkit.entity.Player;
public class CommandManager implements CommandExecutor, TabCompleter {
AreaShop plugin;
ArrayList<CommandAreaShop> commands;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public CommandManager(AreaShop plugin) {
this.plugin = plugin;
commands = new ArrayList<CommandAreaShop>();
commands.add(new HelpCommand(plugin));
commands.add(new RentCommand(plugin));
commands.add(new UnrentCommand(plugin));
commands.add(new BuyCommand(plugin));
commands.add(new SellCommand(plugin));
commands.add(new MeCommand(plugin));
commands.add(new InfoCommand(plugin));
commands.add(new TeleportCommand(plugin));
commands.add(new SetteleportCommand(plugin));
commands.add(new AddfriendCommand(plugin));
commands.add(new DelfriendCommand(plugin));
commands.add(new FindCommand(plugin));
commands.add(new ResellCommand(plugin));
commands.add(new StopresellCommand(plugin));
commands.add(new SetrestoreCommand(plugin));
commands.add(new SetpriceCommand(plugin));
commands.add(new SetownerCommand(plugin));
commands.add(new SetdurationCommand(plugin));
commands.add(new ReloadCommand(plugin));
commands.add(new GroupaddCommand(plugin));
commands.add(new GroupdelCommand(plugin));
commands.add(new GrouplistCommand(plugin));
commands.add(new GroupinfoCommand(plugin));
commands.add(new SchematiceventCommand(plugin));
commands.add(new AddCommand(plugin));
commands.add(new DelCommand(plugin));
commands.add(new AddsignCommand(plugin));
commands.add(new DelsignCommand(plugin));
commands.add(new LinksignsCommand(plugin));
commands.add(new StackCommand(plugin));
commands.add(new SetlandlordCommand(plugin));
/* 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) {
/* Add all messages to a list */
ArrayList<String> messages = new ArrayList<String>();
messages.add(plugin.getConfig().getString("chatPrefix") + plugin.getLanguageManager().getLang("help-header"));
messages.add(plugin.getConfig().getString("chatPrefix") + plugin.getLanguageManager().getLang("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) {
if(!plugin.getConfig().getBoolean("useColorsInConsole") && !(target instanceof Player)) {
target.sendMessage(ChatColor.stripColor(plugin.fixColors(message)));
} else {
target.sendMessage(plugin.fixColors(message));
}
}
}
@Override
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
if(!plugin.isReady()) {
plugin.message(sender, "general-notReady");
return true;
}
boolean executed = false;
for(int i=0; i<commands.size() && !executed; i++) {
if(commands.get(i).canExecute(command, args)) {
commands.get(i).execute(sender, command, 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<String>();
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();
for(int i=1; i<args.length; i++) {
start[i] = args[i-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<String>();
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;
}
}
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.commands.*;
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 implements CommandExecutor, TabCompleter {
private AreaShop plugin;
private ArrayList<CommandAreaShop> commands;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public CommandManager(AreaShop plugin) {
this.plugin = plugin;
commands = new ArrayList<>();
commands.add(new HelpCommand(plugin));
commands.add(new RentCommand(plugin));
commands.add(new UnrentCommand(plugin));
commands.add(new BuyCommand(plugin));
commands.add(new SellCommand(plugin));
commands.add(new MeCommand(plugin));
commands.add(new InfoCommand(plugin));
commands.add(new TeleportCommand(plugin));
commands.add(new SetteleportCommand(plugin));
commands.add(new AddfriendCommand(plugin));
commands.add(new DelfriendCommand(plugin));
commands.add(new FindCommand(plugin));
commands.add(new ResellCommand(plugin));
commands.add(new StopresellCommand(plugin));
commands.add(new SetrestoreCommand(plugin));
commands.add(new SetpriceCommand(plugin));
commands.add(new SetownerCommand(plugin));
commands.add(new SetdurationCommand(plugin));
commands.add(new ReloadCommand(plugin));
commands.add(new GroupaddCommand(plugin));
commands.add(new GroupdelCommand(plugin));
commands.add(new GrouplistCommand(plugin));
commands.add(new GroupinfoCommand(plugin));
commands.add(new SchematiceventCommand(plugin));
commands.add(new AddCommand(plugin));
commands.add(new DelCommand(plugin));
commands.add(new AddsignCommand(plugin));
commands.add(new DelsignCommand(plugin));
commands.add(new LinksignsCommand(plugin));
commands.add(new StackCommand(plugin));
commands.add(new SetlandlordCommand(plugin));
commands.add(new MessageCommand(plugin));
// 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();
for(int i=1; i<args.length; i++) {
start[i] = args[i-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;
}
}
@@ -1,225 +1,220 @@
package nl.evolutioncoding.areashop.managers;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
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;
public class SignLinkerManager implements Listener {
private AreaShop plugin = null;
private Map<UUID, SignLinker> signLinkers;
private boolean eventsRegistered;
public SignLinkerManager(AreaShop plugin) {
this.plugin = plugin;
signLinkers = new HashMap<UUID, SignLinker>();
eventsRegistered = false;
}
/**
* 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());
}
@EventHandler(priority = EventPriority.HIGH)
public void onPlayerInteract(PlayerInteractEvent event) {
AreaShop.debug("PlayerInteractEvent of " + event.getPlayer().getName() + ", " + signLinkers.size() + " signlinkers");
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.getASRegionsByLocation(next.getLocation());
if(regions.size() == 1) {
linker.setRegion(regions.get(0));
return;
} else if(regions.size() > 1) {
Set<String> names = new HashSet<String>();
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");
return;
} 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;
}
GeneralRegion signRegion = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
if(signRegion != null) {
plugin.message(player, "linksigns-alreadyRegistered", signRegion);
return;
}
Sign sign = (Sign)block.getState().getData();
linker.setSign(block.getLocation(), block.getType(), sign.getFacing());
return;
}
}
}
/**
* Handle disconnection players
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLeave(PlayerQuitEvent event) {
AreaShop.debug("PlayerQuitEvent of " + event.getPlayer().getName() + ", " + signLinkers.size() + " signlinkers");
signLinkers.remove(event.getPlayer().getUniqueId());
}
/**
* Class to keep track of the signlinking data
*/
private class SignLinker {
private boolean hasSign = false;
private boolean hasRegion = false;
public Player linker = null;
public String profile = null;
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);
}
finalize();
}
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());
}
finalize();
}
public void finalize() {
if(isComplete()) {
region.addSign(location, type, facing, profile);
if(profile == null) {
plugin.message(linker, "addsign-success", region);
} else {
plugin.message(linker, "addsign-successProfile", region, profile);
}
region.updateSigns();
reset();
plugin.message(linker, "linksigns-next");
}
}
public void reset() {
hasSign = false;
hasRegion = false;
}
public boolean isComplete() {
return hasSign && hasRegion;
}
}
}
package me.wiefferink.areashop.managers;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import me.wiefferink.areashop.features.SignsFeature;
import me.wiefferink.areashop.regions.GeneralRegion;
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.*;
public class SignLinkerManager implements Listener {
private AreaShop plugin = null;
private Map<UUID, SignLinker> signLinkers;
private boolean eventsRegistered;
public SignLinkerManager(AreaShop plugin) {
this.plugin = plugin;
signLinkers = new HashMap<>();
eventsRegistered = false;
}
/**
* 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.getASRegionsByLocation(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;
}
SignsFeature.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) {
signLinkers.remove(event.getPlayer().getUniqueId());
}
/**
* Class to keep track of the signlinking data
*/
private class SignLinker {
private boolean hasSign = false;
private boolean hasRegion = false;
public Player linker = null;
public String profile = null;
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,902 @@
package me.wiefferink.areashop.messages;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* FancyMessageFormat converter, a library that enables to convert
* messages in the FancyMessageFormat to Minecraft's bulky tellraw
* format.
* @author NLThijs48 | http://wiefferink.me
* @author Tobias aka Phoenix | http://www.phoenix-iv.de
*/
public class FancyMessageFormat {
private static final char TAG_BEFORE = '[';
private static final char TAG_AFTER = ']';
private static final char END_TAG_INDICATOR = '/';
/**
* The special character that prefixes all basic chat formatting codes.
*/
private static final char SIMPLE_FORMAT_PREFIX_CHAR = '§';
/**
* Resets all previous chat colors or formats.
*/
private static final char SIMPLE_FORMAT_RESET_CHAR = 'r';
/**
* Lookup table for all continuous tags (marked by [])
*/
private static final HashMap<String, Tag> BRACKET_TAG_LIST = new HashMap<>();
/**
* Lookup table for all interactive tags
*/
private static final HashMap<String, Tag> INTERACTIVE_TAG_LIST = new HashMap<>();
static {
// Enlist all possible tags
// (They go into a HashMap for lookup purposes)
cacheTags(BRACKET_TAG_LIST, Color.class);
cacheTags(BRACKET_TAG_LIST, FormatType.class);
cacheTags(BRACKET_TAG_LIST, FormatCloseTag.class);
cacheTags(BRACKET_TAG_LIST, ControlTag.class);
// Interactive tags
cacheTags(INTERACTIVE_TAG_LIST, ClickType.class);
cacheTags(INTERACTIVE_TAG_LIST, HoverType.class);
}
/**
* Puts all constants in the given Tag class into the given lookup table.
*/
private static <T extends Tag> void cacheTags(HashMap<String, Tag> tagList, Class<T> tags) {
for(Tag tag : tags.getEnumConstants()) {
for(String key : tag.getTags()) {
tagList.put(key, tag);
}
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------- Public / Interface -------------------------------
// ------------------------------------------------------------------------------------------
/**
* Parses the given FancyMessageFormat message to a JSON array that can be
* used with the tellraw command and the like.
* @param message The mesage to convert to JSON
* @return JSON strings that can be send to a player (multiple means line breaks have been used)
*/
public static List<String> convertToJSON(final String message) {
return convertToJSON(Collections.singleton(message));
}
/**
* Parses the given FancyMessageFormat message to a JSON array that can be
* used with the tellraw command and the like.
* @param inputLines Input message split at line breaks.
* @return JSON string that can be send to a player (multiple means line breaks have been used)
*/
public static List<String> convertToJSON(final Iterable<String> inputLines) {
ArrayList<String> lines = cleanInputString(inputLines);
LinkedList<InteractiveMessagePart> message = parse(lines);
List<String> result = new ArrayList<>();
List<InteractiveMessagePart> combine = new ArrayList<>(); // Part that are combined to a line
while(!message.isEmpty()) {
InteractiveMessagePart part = message.removeFirst();
combine.add(part);
if(part.newline || message.isEmpty()) {
if(combine.size() == 1) {
StringBuilder nextLine = new StringBuilder("[");
combine.get(0).toJSON(nextLine);
nextLine.append("]");
result.add(nextLine.toString());
} else if(combine.size() > 1) {
StringBuilder nextLine = new StringBuilder("[{\"text\":\"\",\"extra\":[");
for(int i = 0; i < combine.size(); i++) {
// Skip possibly last empty InteractiveMessagePart which has newline set
if(!combine.get(i).content.isEmpty()) {
if(i != 0) {
nextLine.append(",");
}
combine.get(i).toJSON(nextLine);
}
}
nextLine.append("]}]");
result.add(nextLine.toString());
}
combine.clear();
}
}
return result;
}
/**
* Parses the given FancyMessageFormat message to a String containing control characters
* for formatting that can be used for console outputs, but also for normal player
* messages.
* <p>
* The returned message will only contain colors, bold, italic, underlining and 'magic'
* characters. Hovers and other advanced tellraw tags will be skipped.
* @param message Input message split at line breaks.
* @return Plain message that can be send
*/
public static String convertToConsole(final String message) {
return convertToConsole(Collections.singleton(message));
}
/**
* Parses the given FancyMessageFormat message to a String containing control characters
* for formatting that can be used for console outputs, but also for normal player
* messages.
* <p>
* The returned message will only contain colors, bold, italic, underlining and 'magic'
* characters. Hovers and other advanced tellraw tags will be skipped.
* @param inputLines The raw message lines to process
* @return Plain message that can be send
*/
public static String convertToConsole(final Iterable<String> inputLines) {
if(inputLines == null) {
return null;
}
LinkedList<InteractiveMessagePart> parts = parse(inputLines, false);
StringBuilder result = new StringBuilder();
for(InteractiveMessagePart part : parts) {
part.toSimpleString(result);
}
return result.toString();
}
/**
* Insert a message at the specified position
* @param message The current message
* @param insert The message to insert
* @param line The line number to insert at
* @param start The start of the variable to replace
* @param end The end of the variable to replace
*/
public static void insertMessage(List<String> message, List<String> insert, int line, int start, int end) {
if(insert == null || line < 0 || line >= message.size() || start < 0 || end < 0) {
return;
}
String lineContent = message.remove(line);
if(start > lineContent.length() || end > lineContent.length()) {
message.add(line, lineContent); // Repair damage
return;
}
if(isTaggedInteractive(lineContent)) {
lineContent = lineContent.replace("", "");
message.add(line, lineContent.substring(0, start)+convertToConsole(insert)+lineContent.substring(end));
return;
}
// Find interactive lines meant for this message
List<String> interactives = new ArrayList<>();
while(line < message.size() && isTaggedInteractive(message.get(line))) {
interactives.add(message.remove(line));
}
// Split the line and add the parts
int at = line;
if(start > 0) {
message.add(line, lineContent.substring(0, start));
at++;
message.addAll(at, interactives);
at += interactives.size();
}
message.addAll(at, insert);
at += insert.size();
message.addAll(at, interactives);
at += interactives.size();
if(end < lineContent.length()) {
message.add(at, lineContent.substring(end));
at++;
message.addAll(at, interactives);
}
}
// ------------------------------------------------------------------------------------------
// ------------------------------- Private functions -------------------------------
// ------------------------------------------------------------------------------------------
/**
* <ul>
* <li>Splits lines at line breaks (creating a new line in the Array).
* <li>Removes empty lines at the beginning.
* <li>Removes lines with properties in front of the first text-line.
* </ul>
*/
private static ArrayList<String> cleanInputString(Iterable<String> inputLines) {
// Split lines at line breaks
// In the end we will have a list with one line per element
ArrayList<String> lines = new ArrayList<>();
for(String line : inputLines) {
lines.addAll(Arrays.asList(line.split("\\r?\\n")));
}
// Remove any special lines at the start (a real text line should be first)
while(!lines.isEmpty() && isTaggedInteractive(lines.get(0))) {
lines.remove(0);
}
return lines;
}
private static LinkedList<InteractiveMessagePart> parse(Iterable<String> inputLines) {
return parse(inputLines, true);
}
private static LinkedList<InteractiveMessagePart> parse(final Iterable<String> inputLines, boolean doInteractives) {
LinkedList<InteractiveMessagePart> message = new LinkedList<>();
Color currentColor = null;
Set<FormatType> currentFormatting = new HashSet<>();
lineLoop:
for(String line : inputLines) {
InteractiveMessagePart messagePart;
TaggedContent interactiveTag = getInteractiveTag(line);
boolean isTextLine = interactiveTag == null;
if(!doInteractives && !isTextLine) {
continue;
}
boolean isHoverLine = false;
if(isTextLine) {
messagePart = new InteractiveMessagePart();
message.add(messagePart);
} else /* if Interactive formatting */ {
if(message.isEmpty()) {
continue;
}
messagePart = message.getLast();
Tag tag = interactiveTag.tag;
if(tag instanceof ClickType) {
messagePart.clickType = (ClickType)interactiveTag.tag;
messagePart.clickContent = interactiveTag.subsequentContent;
} else if(tag instanceof HoverType) {
line = interactiveTag.subsequentContent;
isHoverLine = true;
if(messagePart.hoverType != tag) {
// Hover type changed
messagePart.hoverContent = new LinkedList<>();
messagePart.hoverType = (HoverType)tag;
}
// Add hover content below
}
}
if(isTextLine || isHoverLine) {
// Parse inline tags
Color currentLineColor = currentColor;
Set<FormatType> currentLineFormatting = currentFormatting;
LinkedList<TextMessagePart> targetList = messagePart.content;
boolean parseBreak = true;
if(isHoverLine) {
// Reset - use own
currentLineColor = null;
currentLineFormatting = new HashSet<>();
targetList = messagePart.hoverContent;
parseBreak = false;
// Add line break after previous hover line
if(!targetList.isEmpty()) {
targetList.getLast().text += '\n';
}
}
// Split into pieces at places where formatting changes
while(!line.isEmpty()) {
String textToAdd;
TaggedContent nextTag = getNextTag(line, parseBreak);
boolean tagged = nextTag != null;
if(!tagged) {
textToAdd = line;
line = "";
} else {
textToAdd = nextTag.precedingContent;
line = nextTag.subsequentContent;
}
// Add a text part with the correct formatting
if(!textToAdd.isEmpty()) {
TextMessagePart part = new TextMessagePart();
part.text = textToAdd;
part.formatTypes = new HashSet<>(currentLineFormatting);
part.color = currentLineColor;
targetList.add(part);
}
// Handle the change in formatting if a Tag has been detected (this needs to be after creating the InteractiveMessagePart)
if(tagged) {
// Handle the formatting tag
Tag tag = nextTag.tag;
if(tag instanceof Color) {
currentLineColor = (Color)tag;
} else if(tag instanceof FormatType) {
currentLineFormatting.add((FormatType)tag);
} else if(tag instanceof FormatCloseTag) {
currentLineFormatting.remove(((FormatCloseTag)tag).closes);
} else if(tag == ControlTag.BREAK) {
messagePart.newline = true;
currentLineFormatting.clear();
continue lineLoop;
} else if(tag == ControlTag.RESET) {
currentLineFormatting.clear();
currentLineColor = Color.WHITE;
}
}
}
if(!isHoverLine) {
// Adapt global attributes
currentColor = currentLineColor;
}
}
}
// Cleanup empty parts (some parts only affected the formatting of next parts, but do not have actual content)
Iterator<InteractiveMessagePart> it = message.iterator();
while(it.hasNext()) {
InteractiveMessagePart check = it.next();
if(check.content.size() == 0 && !check.newline) {
it.remove();
}
}
return message;
}
/**
* Searches and returns the first continuous tag found in the given String.
* @return The tag (plus its preceding and subsequent content) if found.
* Null if nothing is found.
*/
private static TaggedContent getNextTag(String line, boolean parseBreak) {
Pattern pattern = Pattern.compile("\\[[/a-zA-Z1-9]+\\]|[&"+SIMPLE_FORMAT_PREFIX_CHAR+"][1-9abcdeflonskr]");
Matcher matcher = pattern.matcher(line);
// TODO Fix for escape things, and something with parseBreak?
while(matcher.find()) {
Tag tag = null;
if(matcher.group().startsWith("&") || matcher.group().startsWith(SIMPLE_FORMAT_PREFIX_CHAR+"")) {
for(Color color : Color.class.getEnumConstants()) {
if(color.getNativeFormattingCode() == matcher.group().charAt(1)) {
tag = color;
}
}
for(FormatType format : FormatType.class.getEnumConstants()) {
if(format.getNativeFormattingCode() == matcher.group().charAt(1)) {
tag = format;
}
}
if(matcher.group().charAt(1) == SIMPLE_FORMAT_RESET_CHAR) {
tag = ControlTag.RESET;
}
} else {
tag = BRACKET_TAG_LIST.get(matcher.group().substring(1, matcher.group().length()-1).toLowerCase());
}
// Continue search if we found something like [abc] that is not a tag
if(tag != null) {
return new TaggedContent(line.substring(0, matcher.start()), tag, line.substring(matcher.end()));
}
}
return null;
/*
for(int startIndex = 0; startIndex < line.length(); startIndex++) {
int start = line.indexOf(TAG_BEFORE, startIndex);
if(start != -1) {
int end = line.indexOf(TAG_AFTER, start);
if(end != -1) {
String inBetween = line.substring(start+1, end).toLowerCase();
if(BRACKET_TAG_LIST.containsKey(inBetween)) {
Tag tag = BRACKET_TAG_LIST.get(inBetween);
if(tag == ControlTag.ESCAPE) {
// Ignore next char
line = line.substring(0, start)+line.substring(end+1);
startIndex = start;
} else if(!parseBreak && tag == ControlTag.ESCAPE) {
// Ignore break
startIndex = end+1;
} else {
String previousContent = line.substring(0, start);
String subsequentContent = line.substring(end+1);
return new TaggedContent(previousContent, tag, subsequentContent);
}
} else {
startIndex = start;
}
} else {
return null;
}
} else {
return null;
}
}
return null;
*/
}
/**
* If the given line defines an interactive property (e.g. "hover: myText")
* the tag / property will be returned. Otherwise null is returned.
*/
private static TaggedContent getInteractiveTag(String line) {
for(int index = 0; index < line.length(); index++) {
char c = line.charAt(index);
if(c == ' ' || c == '\t') {
// Ignore (Skip spacing)
} else {
int end = line.indexOf(": ", index);
if(end != -1) {
String inBetween = line.substring(index, end).toLowerCase();
if(INTERACTIVE_TAG_LIST.containsKey(inBetween)) {
Tag tag = INTERACTIVE_TAG_LIST.get(inBetween);
String subsequentContent = line.substring(end+2);
return new TaggedContent(null, tag, subsequentContent);
}
}
return null;
}
}
return null;
}
/**
* Check if a line is an advanced declaration like hover or command
* @param line The line to check
* @return true if the line is interactive, false when it is a text line
*/
public static boolean isTaggedInteractive(String line) {
return getInteractiveTag(line) != null;
}
/**
* Produce a string in double quotes with backslash sequences in all the
* right places.
* @param string A String
* @param sb The StringBuilder to add the quoted string to
* @return A String correctly formatted for insertion in a JSON text.
*/
/*
* Copyright (c) 2002 JSON.org
* Licensed under the Apache License, Version 2.0
*/
private static StringBuilder quoteStringJson(String string, StringBuilder sb) {
if(string == null || string.length() == 0) {
return new StringBuilder("\"\"");
}
char c;
int i;
int len = string.length();
String t;
sb.append('"');
for(i = 0; i < len; i += 1) {
c = string.charAt(i);
switch(c) {
case '\\':
case '"':
sb.append('\\');
sb.append(c);
break;
case '/':
sb.append('\\');
sb.append(c);
break;
case '\b':
sb.append("\\b");
break;
case '\t':
sb.append("\\t");
break;
case '\n':
sb.append("\\n");
break;
case '\f':
sb.append("\\f");
break;
case '\r':
sb.append("\\r");
break;
default:
if(c < ' ') {
t = "000"+Integer.toHexString(c);
sb.append("\\u");
sb.append(t.substring(t.length()-4));
} else {
sb.append(c);
}
}
}
sb.append('"');
return sb;
}
// ------------------------------------------------------------------------------------------
// ------------------------------- Helper classes -------------------------------
// ------------------------------------------------------------------------------------------
private static class TaggedContent {
final String precedingContent;
final Tag tag;
final String subsequentContent;
public TaggedContent(String pre, Tag tag, String sub) {
this.precedingContent = pre;
this.tag = tag;
this.subsequentContent = sub;
}
}
/**
* Holds a string with basic (non-interactive) formatting.
*/
private static class TextMessagePart {
String text = "";
Color color = null;
Set<FormatType> formatTypes = new HashSet<>();
/**
* Get a simple colored/formatted string
* @param sb The StringBuilder to append the result to
* @return StringBuilder with the message appended
*/
StringBuilder toSimpleString(StringBuilder sb) {
// Color
if(color != null) {
sb.append(SIMPLE_FORMAT_PREFIX_CHAR);
sb.append(color.getNativeFormattingCode());
}
// Formatting
for(FormatType format : formatTypes) {
sb.append(SIMPLE_FORMAT_PREFIX_CHAR);
sb.append(format.getNativeFormattingCode());
}
// Text
sb.append(text);
return sb;
}
/**
* Get a JSON component for this message part
* @param sb The StringBuilder to append the result to
* @return This part formatted in JSON
*/
StringBuilder toJSON(StringBuilder sb) {
sb.append('{');
sb.append("\"text\":");
quoteStringJson(text, sb);
if(color != null && color != Color.WHITE) {
sb.append(",\"color\":\"").append(color.jsonValue).append("\"");
}
for(FormatType formatting : formatTypes) {
sb.append(",\"");
sb.append(formatting.jsonKey).append("\":");
sb.append("true");
}
sb.append('}');
return sb;
}
boolean hasFormatting() {
return !(color == Color.WHITE && formatTypes.isEmpty());
}
@Override
public String toString() {
return "TextMessagePart(text:"+text+", color:"+color+", formatting:"+formatTypes.toString()+")";
}
}
/**
* Holds a string with interactive formatting.
*/
private static class InteractiveMessagePart {
LinkedList<TextMessagePart> content = new LinkedList<>();
boolean newline = false;
// Click
ClickType clickType = null;
String clickContent = "";
// Hover
HoverType hoverType = null;
LinkedList<TextMessagePart> hoverContent = null;
/**
* Append the message content to the StringBuilder
* @param sb The StringBuilder to append the message to
*/
StringBuilder toSimpleString(StringBuilder sb) {
for(TextMessagePart part : content) {
part.toSimpleString(sb);
}
return sb;
}
/**
* Get a JSON component for this message part
* @param sb The StringBuilder to append the result to
* @return This part formatted in JSON
*/
StringBuilder toJSON(StringBuilder sb) {
// Error case, should never happen, print something as safeguard
if(content.size() == 0) {
sb.append("{\"text\":\"\"}");
return sb;
}
if(content.size() == 1) {
// Add attributes to TextMessagePart object
content.getFirst().toJSON(sb);
sb.deleteCharAt(sb.length()-1);
} else {
sb.append('{');
sb.append("\"text\":\"\",\"extra\":[");
for(TextMessagePart textPart : content) {
textPart.toJSON(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
sb.append(']');
}
if(clickType != null) {
sb.append(',');
sb.append("\"clickEvent\":{");
sb.append("\"action\":\"").append(clickType.getJsonKey()).append("\",");
sb.append("\"value\":");
quoteStringJson(clickContent, sb);
sb.append('}');
}
if(hoverType != null) {
sb.append(',');
sb.append("\"hoverEvent\":{");
sb.append("\"action\":\"").append(hoverType.getJsonKey()).append("\",");
sb.append("\"value\":");
if(hoverContent.size() == 1) {
TextMessagePart hoverPart = hoverContent.getFirst();
if(hoverPart.hasFormatting()) {
hoverPart.toJSON(sb);
} else {
quoteStringJson(hoverPart.text, sb);
}
} else {
sb.append('[');
for(TextMessagePart hoverPart : hoverContent) {
hoverPart.toJSON(sb);
sb.append(',');
}
sb.deleteCharAt(sb.length()-1);
sb.append(']');
}
sb.append('}');
}
sb.append('}');
return sb;
}
@Override
public String toString() {
return "InteractiveMessagePart(textMessageParts:"+content+", clickType:"+clickType+", clickContent:"+clickContent+", hoverType:"+hoverType+", hoverContent:"+hoverContent+", newline:"+newline+")";
}
}
// --------------------------------------- Tags ---------------------------------------
interface Tag {
/**
* Tag text(s) used in the FancyMessageFormat (The text between '[' and ']')
*/
String[] getTags();
}
/**
* Indicates formatting that is applied until explicitly stopped.
* Can also be used in simple Minecraft messages (Non-JSON).
*/
interface ContinuousTag extends Tag {
/**
* The character that defines upcoming formatting in a native (non-JSON) Minecraft message.
*/
char getNativeFormattingCode();
}
/**
* Indicates formatting that allows cursor interaction. Requires the
* Minecraft JSON / tellraw format.
*/
interface InteractiveMessageTag extends Tag {
String getJsonKey();
}
enum Color implements ContinuousTag {
WHITE('f'),
BLACK('0'),
BLUE('9'),
DARK_BLUE('1', "darkblue"),
GREEN('a'),
DARK_GREEN('2', "darkgreen"),
AQUA('b'),
DARK_AQUA('3', "darkaqua"),
RED('c'),
DARK_RED('4', "darkred"),
LIGHT_PURPLE('d', "lightpurple"),
DARK_PURPLE('5', "darkpurple"),
YELLOW('e'),
GOLD('6'),
GRAY('7', "grey"),
DARK_GRAY('8', "dark_grey", "darkgray", "darkgrey");
final char bytecode;
final String jsonValue;
final String[] tags;
Color(char bytecode, String... extraTags) {
this.bytecode = bytecode;
this.jsonValue = this.name().toLowerCase();
this.tags = new String[extraTags.length+1];
this.tags[0] = this.name().toLowerCase();
System.arraycopy(extraTags, 0, this.tags, 1, extraTags.length);
}
@Override
public String[] getTags() {
return tags;
}
@Override
public char getNativeFormattingCode() {
return bytecode;
}
}
enum FormatType implements ContinuousTag {
BOLD('l', "bold", "b", "bold"),
ITALIC('o', "italic", "i", "italic"),
UNDERLINE('n', "underlined", "u", "underline"),
STRIKETHROUGH('s', "strikethrough", "s", "strike", "strikethrough"),
OBFUSCATE('k', "obfuscated", "obfuscate");
final char bytecode;
final String jsonKey;
final String[] tags;
FormatType(char bytecode, String jsonKey, String... tags) {
this.bytecode = bytecode;
this.jsonKey = jsonKey;
this.tags = tags;
}
@Override
public String[] getTags() {
return tags;
}
@Override
public char getNativeFormattingCode() {
return bytecode;
}
}
enum FormatCloseTag implements Tag {
BOLD_END(FormatType.BOLD),
ITALIC_END(FormatType.ITALIC),
UNDERLINE_END(FormatType.UNDERLINE),
STRIKETHROUGH_END(FormatType.STRIKETHROUGH),
OBFUSCATE_END(FormatType.OBFUSCATE);
/**
* Formatting that is stopped at this point
*/
final FormatType closes;
private final String[] tags;
FormatCloseTag(FormatType openingTag) {
this.closes = openingTag;
// Auto-generate close tags
tags = new String[closes.tags.length];
for(int i = 0; i < tags.length; i++) {
tags[i] = END_TAG_INDICATOR+closes.tags[i];
}
}
@Override
public String[] getTags() {
return tags;
}
}
enum ControlTag implements Tag {
BREAK("break"),
ESCAPE("esc"),
RESET("reset");
private final String[] tags;
ControlTag(String... tags) {
this.tags = tags;
}
@Override
public String[] getTags() {
return tags;
}
}
/**
* Types of clicking
*/
enum ClickType implements InteractiveMessageTag {
LINK("open_url", "link"),
COMMAND("run_command", "command"),
SUGGEST("suggest_command", "suggest");
private final String jsonKey;
private final String[] tags;
ClickType(String jsonKey, String... tags) {
this.jsonKey = jsonKey;
this.tags = tags;
}
@Override
public String[] getTags() {
return tags;
}
@Override
public String getJsonKey() {
return jsonKey;
}
}
enum HoverType implements InteractiveMessageTag {
HOVER;
@Override
public String[] getTags() {
return new String[]{"hover"};
}
@Override
public String getJsonKey() {
return "show_text";
}
}
}
@@ -0,0 +1,183 @@
package me.wiefferink.areashop.messages;
import com.google.common.base.Charsets;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.*;
import java.util.*;
public class LanguageManager {
private AreaShop plugin = null;
private String languages[] = {"EN", "NL", "FR", "DE", "RU", "SV", "NO"};
private Map<String, List<String>> currentLanguage, defaultLanguage;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public LanguageManager(AreaShop plugin) {
this.plugin = plugin;
this.saveDefaults();
currentLanguage = loadLanguage(plugin.getConfig().getString("language"));
defaultLanguage = loadLanguage(languages[0]);
}
/**
* Saves the default language files if not already present
*/
public void saveDefaults() {
// Create the language folder if it not exists
File langFolder;
langFolder = new File(plugin.getDataFolder()+File.separator+AreaShop.languageFolder);
if(!langFolder.exists()) {
if(!langFolder.mkdirs()) {
AreaShop.warn("Could not create language directory: "+langFolder.getAbsolutePath());
return;
}
}
// Create the language files, overwrites if a file already exists
// Overriding is necessary because otherwise with an update the new lang files would not be used
File langFile;
for(String language : languages) {
langFile = new File(plugin.getDataFolder()+File.separator+AreaShop.languageFolder+File.separator+language+".yml");
try(
InputStream input = plugin.getResource(AreaShop.languageFolder+"/"+language+".yml");
OutputStream output = new FileOutputStream(langFile)
) {
if(input == null) {
AreaShop.warn("Could not save default language to the '"+AreaShop.languageFolder+"' folder: "+language+".yml");
continue;
}
int read;
byte[] bytes = new byte[1024];
while((read = input.read(bytes)) != -1) {
output.write(bytes, 0, read);
}
input.close();
output.close();
} catch(IOException e) {
AreaShop.warn("Something went wrong saving a default language file: "+langFile.getPath());
}
}
}
/**
* Loads the specified language
* @param key The language to load
* @return Map with the messages loaded from the file
*/
public Map<String, List<String>> loadLanguage(String key) {
return loadLanguage(key, true);
}
/**
* Loads the specified language
* @param key The language to load
* @param convert try conversion or not
* @return Map with the messages loaded from the file
*/
private Map<String, List<String>> loadLanguage(String key, boolean convert) {
Map<String, List<String>> result = new HashMap<>();
// Load the strings
boolean isTransifexFile = false;
File file = new File(plugin.getDataFolder()+File.separator+AreaShop.languageFolder+File.separator+key+".yml");
try(
InputStreamReader reader = new InputStreamReader(new FileInputStream(file), Charsets.UTF_8)
) {
YamlConfiguration ymlFile = YamlConfiguration.loadConfiguration(reader);
// Detect empty language files, happens when the YAML parser prints an exception (it does return an empty YamlConfiguration though)
if(ymlFile.getKeys(false).isEmpty()) {
AreaShop.warn("Language file "+key+".yml has zero messages.");
return result;
}
// Detect language files downloaded from Transifex and convert them
if(ymlFile.getKeys(false).size() == 1) {
for(String languageKey : ymlFile.getKeys(false)) {
if(ymlFile.isConfigurationSection(languageKey)) {
isTransifexFile = convert;
}
}
}
// Retrieve the messages from the YAML file and create the result
if(!isTransifexFile) {
for(String messageKey : ymlFile.getKeys(false)) {
if(ymlFile.isList(messageKey)) {
result.put(messageKey, new ArrayList<>(ymlFile.getStringList(messageKey)));
} else {
result.put(messageKey, new ArrayList<>(Collections.singletonList(ymlFile.getString(messageKey))));
}
}
}
} catch(IOException e) {
AreaShop.warn("Could not load set language file: "+file.getAbsolutePath());
}
if(isTransifexFile) {
if(!Transifex.convertFrom(file)) {
AreaShop.warn("Failed to convert "+file.getName()+" from the Transifex layout to the AreaShop layout, check the errors above");
}
return loadLanguage(key, false);
}
return result;
}
/**
* Get the message for a certain key, without doing any processing
* @param key The key of the message to get
* @return The message as a list of strings
*/
public List<String> getRawMessage(String key) {
List<String> message;
if(key.equalsIgnoreCase(Message.CHATLANGUAGEVARIABLE)) {
message = plugin.getChatPrefix();
} else if(currentLanguage.containsKey(key)) {
message = currentLanguage.get(key);
} else {
message = defaultLanguage.get(key);
}
if(message == null) {
return new ArrayList<>();
}
return new ArrayList<>(message);
}
}
@@ -0,0 +1,468 @@
package me.wiefferink.areashop.messages;
import me.wiefferink.areashop.AreaShop;
import me.wiefferink.areashop.Utils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Message {
public static final String VARIABLESTART = "%";
public static final String VARIABLEEND = "%";
public static final String LANGUAGEVARIABLE = "lang:";
public static final String CHATLANGUAGEVARIABLE = "prefix";
public static final int REPLACEMENTLIMIT = 50; // Maximum number of replacement rounds (the replaced value can have variables again)
public static final int MAXIMUMJSONLENGTH = 30000; // Limit of the client is 32767 for the complete message
private static boolean fancyWorks = true;
private List<String> message;
private Object[] replacements;
private String key = null;
private boolean doLanguageReplacements = true;
/**
* Internal use only
*/
private Message() {
message = new ArrayList<>();
}
/**
* Empty message object
* @return this
*/
public static Message empty() {
return new Message();
}
/**
* Construct a message from a language key
* @param key The key of the message to use
* @return this
*/
public static Message fromKey(String key) {
return new Message().setMessageFromKey(key);
}
/**
* Construct a message from a string
* @param message The message to use
* @return this
*/
public static Message fromString(String message) {
return new Message().setMessage(message);
}
/**
* Construct a message from a string list
* @param message The message to use
* @return this
*/
public static Message fromList(List<String> message) {
return new Message().setMessage(message);
}
/**
* Get the message with all replacements done
* @return Message as a list
*/
public List<String> get() {
doReplacements();
return message;
}
/**
* Get the message with all replacements done
* @param limit the limit to hold to
* @return Message as a list
*/
private List<String> get(Limit limit) {
if(limit.reached()) {
return new ArrayList<>();
}
doReplacements(limit);
return message;
}
/**
* Get the message with all replacements done
* @return Message as a string
*/
public String getSingle() {
doReplacements();
return StringUtils.join(message, "");
}
/**
* Get the raw message without replacing anything
* @return The message
*/
public List<String> getRaw() {
return message;
}
/**
* Get raw message as string
* @return The raw message
*/
public String getSingleRaw() {
return StringUtils.join(message, "");
}
/**
* Get a plain string for the message (for example for using in the console)
* @return The message as simple string
*/
public String getPlain() {
doReplacements();
return FancyMessageFormat.convertToConsole(message);
}
/**
* Add the default prefix to the message
* @param doIt true if the prefix should be added, otherwise false
* @return this
*/
public Message prefix(boolean doIt) {
if(doIt) {
message.add(0, VARIABLESTART+LANGUAGEVARIABLE+CHATLANGUAGEVARIABLE+VARIABLEEND);
}
return this;
}
public Message prefix() {
return prefix(true);
}
/**
* Set the replacements to apply to the message
* @param replacements The replacements to apply
* - GeneralRegion: All region replacements are applied
* - Message: Message is inserted
* - other: index tag is replaced, like %0%
* @return this
*/
public Message replacements(Object... replacements) {
this.replacements = replacements;
return this;
}
/**
* Append lines to the message
* @param lines The lines to append
* @return this
*/
public Message append(List<String> lines) {
message.addAll(lines);
return this;
}
/**
* Append a message to this message
* @param message The message to append
* @return this
*/
public Message append(Message message) {
return append(message.get());
}
/**
* Append lines to the message
* @param line The line to append
* @return this
*/
public Message append(String line) {
message.add(line);
return this;
}
/**
* Turn off language replacements for this message
* @return this
*/
public Message noLanguageReplacements() {
doLanguageReplacements = false;
return this;
}
/**
* Send the message to a target
* @param target The target to send the message to (Player, CommandSender, Logger)
* @return this
*/
public Message send(Object target) {
if(message == null || message.size() == 0 || (message.size() == 1 && message.get(0).length() == 0) || target == null) {
return this;
}
doReplacements();
if(target instanceof Player) {
boolean sendPlain = true;
if(AreaShop.getInstance().getConfig().getBoolean("useFancyMessages") && fancyWorks) {
try {
boolean result = true;
List<String> jsonMessages = FancyMessageFormat.convertToJSON(message);
for(String jsonMessage : jsonMessages) {
if(jsonMessage.length() > MAXIMUMJSONLENGTH) {
AreaShop.error("Message with key", key, "could not be send, results in a JSON string that is too big to send to the client, start of the message:", Utils.getMessageStart(this, 100));
return this;
}
result &= Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "tellraw "+((Player)target).getName()+" "+jsonMessage);
}
sendPlain = !result;
fancyWorks = result;
} catch(Exception e) {
fancyWorks = false;
AreaShop.error("Sending fancy message did not work, falling back to plain messages. Message key:", key);
AreaShop.debug(ExceptionUtils.getStackTrace(e));
}
}
if(sendPlain) { // Fancy messages disabled or broken
((Player)target).sendMessage(FancyMessageFormat.convertToConsole(message));
}
} else {
String plainMessage = FancyMessageFormat.convertToConsole(message);
if(!AreaShop.getInstance().getConfig().getBoolean("useColorsInConsole")) {
plainMessage = ChatColor.stripColor(plainMessage);
}
if(target instanceof CommandSender) {
((CommandSender)target).sendMessage(plainMessage);
} else if(target instanceof Logger) {
((Logger)target).info(plainMessage);
} else {
AreaShop.warn("Could not send message, target is wrong: "+plainMessage);
}
}
return this;
}
// INTERNAL METHODS
/**
* Set the internal message
* @param message The message to set
* @return this
*/
private Message setMessage(List<String> message) {
this.message = message;
if(this.message == null) {
this.message = new ArrayList<>();
}
return this;
}
/**
* Set the internal message with a key
* @param key The message key to get the message for
* @return this
*/
private Message setMessageFromKey(String key) {
this.key = key;
return this.setMessage(AreaShop.getInstance().getLanguageManager().getRawMessage(key));
}
/**
* Set the internal message with a string
* @param message The message to set
* @return this
*/
private Message setMessage(String message) {
List<String> list = new ArrayList<>();
list.add(message);
return this.setMessage(list);
}
/**
* Apply all replacements to the message
* @return this
*/
public Message doReplacements() {
return doReplacements(new Limit(REPLACEMENTLIMIT, this));
}
private Message doReplacements(Limit limit) {
// Replace variables until they are all gone, or when the limit is reached
Pattern variable = Pattern.compile(Pattern.quote(VARIABLESTART)+"[a-zA-Z]+"+Pattern.quote(VARIABLEEND));
try {
boolean shouldReplace = true;
while(shouldReplace) {
List<String> original = new ArrayList<>(message);
limit.left--;
if(limit.reached()) {
if(!limit.notified) {
limit.notified = true;
AreaShop.error("Reached replacement limit, probably has replacements loops, problematic message key: "+limit.message.key+", first characters of the message: "+Utils.getMessageStart(limit.message, 100));
}
break;
}
replaceArgumentVariables(limit);
if(doLanguageReplacements) {
replaceLanguageVariables(limit);
}
shouldReplace = !message.equals(original);
}
} catch(StackOverflowError e) {
limit.left = 0;
limit.notified = true;
AreaShop.error("Too many recursive replacements for message with key: "+limit.message.key+" (probably includes itself as replacement), start of the message: "+Utils.getMessageStart(limit.message, 100));
}
return this;
}
/**
* Replace argument variables in a message
* The arguments to apply as replacements:
* - If it is a GeneralRegion the replacements of the region will be applied
* - Else the parameter will replace its number surrounded with VARIABLESTART and VARIABLEEND
*/
private void replaceArgumentVariables(Limit limit) {
if(message == null || message.size() == 0 || replacements == null || limit.reached()) {
return;
}
Pattern variablePattern = Pattern.compile(Pattern.quote(VARIABLESTART)+"[a-zA-Z]+"+Pattern.quote(VARIABLEEND));
for(int i = 0; i < message.size(); i++) {
int number = 0;
for(Object param : replacements) {
String line = message.get(i);
if(param != null) {
if(param instanceof ReplacementProvider) {
Matcher matcher = variablePattern.matcher(line);
if(matcher.find()) {
Object replacement = ((ReplacementProvider)param).provideReplacement(matcher.group().substring(1, matcher.group().length()-1));
if(replacement != null) {
String result = "";
if(matcher.start() > 0) {
result += line.substring(0, matcher.start());
}
result += replacement.toString();
if(matcher.end() < line.length()) {
result += line.substring(matcher.end());
}
message.set(i, result);
}
}
} else if(param instanceof Message) {
Pattern indexPattern = Pattern.compile(Pattern.quote(VARIABLESTART)+number+Pattern.quote(VARIABLEEND));
Matcher matcher = indexPattern.matcher(line);
if(matcher.find()) { // Only replaces one occurance of the variable, others will be done next round
int startDiff = message.size()-i;
List<String> insertMessage = ((Message)param).get(limit);
if(limit.reached()) {
return;
}
FancyMessageFormat.insertMessage(message, insertMessage, i, matcher.start(), matcher.end());
// Skip to end of insert
i = message.size()-startDiff;
}
number++;
} else {
message.set(i, message.get(i).replace(VARIABLESTART+number+VARIABLEEND, param.toString()));
number++;
}
}
}
}
}
/**
* Replace all language variables in a message
*/
private void replaceLanguageVariables(Limit limit) {
if(message == null || message.size() == 0 || limit.reached()) {
return;
}
Pattern variables = Pattern.compile(
Pattern.quote(VARIABLESTART)+
Pattern.quote(LANGUAGEVARIABLE)+"[a-zA-Z-]+"+ // Language key
"(\\|(.*?\\|)+)?"+ // Optional message arguments
Pattern.quote(VARIABLEEND)
);
for(int i = 0; i < message.size(); i++) {
Matcher matches = variables.matcher(message.get(i));
if(matches.find()) {
String variable = matches.group();
String key;
Object[] arguments = null;
if(variable.contains("|")) {
key = variable.substring(VARIABLESTART.length()+LANGUAGEVARIABLE.length(), variable.indexOf("|"));
arguments = variable.substring(variable.indexOf("|")+1, variable.length()-VARIABLEEND.length()).split("\\|");
} else {
key = variable.substring(VARIABLESTART.length()+LANGUAGEVARIABLE.length(), variable.length()-VARIABLEEND.length());
}
Message insert = Message.fromKey(key);
if(arguments != null) {
insert.replacements(arguments);
}
// Insert message
int startDiff = message.size()-i;
List<String> insertMessage = insert.get(limit);
if(limit.reached()) {
return;
}
FancyMessageFormat.insertMessage(message, insertMessage, i, matches.start(), matches.end());
// Skip to end of insert
i = message.size()-startDiff;
}
}
}
@Override
public String toString() {
return "Message(key:"+key+", message:"+message+")";
}
/**
* Class to store a limit
*/
private class Limit {
public int left = 0;
public boolean notified = false;
public Message message;
/**
* Set the initial limit
* @param count The limit to use
*/
public Limit(int count, Message message) {
left = count;
this.message = message;
}
/**
* Check if the limit is reached
* @return true if the limit is reached, otherwise false
*/
public boolean reached() {
return left <= 0;
}
}
/**
* Provide custom replacement for variables
*/
public interface ReplacementProvider {
/**
* Get the replacement for a variable
* @param variable The variable to replace
* @return The replacement for the variable, or null if empty
*/
Object provideReplacement(String variable);
}
}
@@ -0,0 +1,120 @@
package me.wiefferink.areashop.messages;
import me.wiefferink.areashop.AreaShop;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import java.io.*;
public class Transifex {
public static boolean convertFrom(File inputFile) {
if(inputFile == null || !inputFile.exists() || !inputFile.isFile()) {
warn("Could not convert Transifix file, it does not exist");
return false;
}
AreaShop.debug("Transifex conversion of", inputFile.getAbsolutePath());
File newFile = new File(inputFile.getAbsolutePath()+".new");
try(
BufferedReader reader = new BufferedReader(new FileReader(inputFile));
BufferedWriter writer = new BufferedWriter(new FileWriter(newFile))
) {
// Create target file
newFile.createNewFile();
// Add translation strings
String line = reader.readLine();
boolean first = true;
String lastLineStart = null;
while(line != null) {
// Skip line with the language on it
if(first) {
first = false;
line = reader.readLine();
continue;
}
// Skip comment lines (normally there are none)
if(line.startsWith("#")) {
line = reader.readLine();
continue;
}
// Strip whitespace at the front
if(line.length() > 2) {
line = line.substring(2);
}
// Add empty lines between messages of a different type (the part before - decides the type)
if(lastLineStart != null && !line.trim().isEmpty() && !line.startsWith(lastLineStart) && !line.trim().startsWith("-")) {
writer.newLine();
}
// Write line to the new file
if(!line.trim().isEmpty()) {
// Detect special fancyformat lines
if(line.contains("\\n")) {
String[] specials = line.split("\\\\n");
//print("Contains newline: "+line+", split into "+specials.length+" parts");
// Write identifier
writer.write(specials[0].substring(0, specials[0].indexOf(":")+1));
writer.newLine();
// Strip identifier from first part
specials[0] = specials[0].substring(specials[0].indexOf(":")+3);
// Write special lines
for(String special : specials) {
writer.write(" - \"");
if(special.startsWith("\\t")) {
special = special.substring(2);
writer.write(" ");
}
writer.write(special);
if(!special.endsWith("\"")) {
writer.write("\"");
}
writer.newLine();
}
} else {
// Simply copy the line
writer.write(line);
writer.newLine();
}
}
// Update last line start
String[] splittedLine = line.split("-");
if(splittedLine.length > 0 && !line.trim().isEmpty()) {
lastLineStart = splittedLine[0];
}
line = reader.readLine();
}
} catch(IOException e) {
warn("Could not convert Transifix file:", ExceptionUtils.getStackTrace(e));
newFile.delete();
return false;
}
// Move current file to .old, move new file to original location
File oldFile = new File(inputFile.getAbsolutePath()+".transifex");
if(oldFile.exists() && oldFile.isFile()) {
if(!oldFile.delete()) {
warn("Could not remove existing old file:", oldFile.getAbsolutePath());
return false;
}
}
if(!inputFile.renameTo(oldFile)) {
warn("Could not move input file to .old, from", inputFile.getAbsolutePath(), "to", oldFile.getAbsolutePath());
return false;
}
if(!newFile.renameTo(inputFile)) {
warn("Could not move new file to original file location, from", newFile.getAbsolutePath(), "to", inputFile.getAbsolutePath());
oldFile.renameTo(inputFile); // Try to recover original file
return false;
}
AreaShop.info("Converted "+inputFile.getName()+" from the Transifex layout to the AreaShop layout, original saved in "+oldFile.getName());
return true;
}
/**
* Print a warning to the console
* @param message The message to print
*/
private static void warn(String... message) {
AreaShop.warn("[Transifex language file conversion]", StringUtils.join(message, " "));
}
}
File diff suppressed because it is too large. Load diff
@@ -1,158 +1,171 @@
package nl.evolutioncoding.areashop.regions;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import org.bukkit.configuration.ConfigurationSection;
public class RegionGroup {
private AreaShop plugin;
private String name;
/**
* 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;
setSetting("name", name);
// Delete duplicates
List<String> members = getMembers();
int previousCount = members.size();
List<String> newMembers = new ArrayList<String>();
while(!members.isEmpty()) {
String member = members.remove(0);
// If the region has been deleted also clean it from the group
if(plugin.getFileManager().getRegion(member) != null) {
newMembers.add(member);
}
while(members.contains(member)) {
members.remove(member);
}
}
if(newMembers.size() != previousCount) {
setSetting("regions", newMembers);
AreaShop.debug("group save required because of changed member size");
saveRequired();
}
if(getMembers().size() == 0) {
plugin.getFileManager().removeGroup(this);
}
}
/**
* 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) {
List<String> members = getMembers();
if(members.contains(region.getLowerCaseName())) {
return false;
} else {
members.add(region.getName());
setSetting("regions", members);
this.saveRequired();
return true;
}
}
/**
* 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) {
List<String> members = getMembers();
boolean result = isMember(region);
members.remove(region.getName());
if(members.isEmpty()) {
plugin.getFileManager().removeGroup(this);
} else {
setSetting("regions", members);
}
if(result) {
this.saveRequired();
}
return result;
}
/**
* Get all members of the group
* @return A list with the names of all members of the group
*/
public List<String> getMembers() {
if(getSettings() == null || getSettings().getStringList("regions") == null) {
return new ArrayList<String>();
}
return getSettings().getStringList("regions");
}
/**
* 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() {
return plugin.getFileManager().getGroupSettings(name);
}
/**
* 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();
}
}
package me.wiefferink.areashop.regions;
import me.wiefferink.areashop.AreaShop;
import org.bukkit.configuration.ConfigurationSection;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class RegionGroup {
private AreaShop plugin;
private String name;
/**
* 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;
setSetting("name", name);
// Delete duplicates
List<String> members = getMembers();
int previousCount = members.size();
List<String> newMembers = new ArrayList<>();
while(!members.isEmpty()) {
String member = members.remove(0);
// If the region has been deleted also clean it from the group
if(plugin.getFileManager().getRegion(member) != null) {
newMembers.add(member);
}
while(members.contains(member)) {
members.remove(member);
}
}
if(newMembers.size() != previousCount) {
setSetting("regions", newMembers);
AreaShop.debug("group save required because of changed member size");
saveRequired();
}
if(getMembers().size() == 0) {
plugin.getFileManager().removeGroup(this);
}
}
/**
* 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) {
List<String> members = getMembers();
if(members.contains(region.getLowerCaseName())) {
return false;
} else {
members.add(region.getName());
setSetting("regions", members);
this.saveRequired();
return true;
}
}
/**
* 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) {
List<String> members = getMembers();
boolean result = isMember(region);
members.remove(region.getName());
if(members.isEmpty()) {
plugin.getFileManager().removeGroup(this);
} else {
setSetting("regions", members);
}
if(result) {
this.saveRequired();
}
return result;
}
/**
* Get all members of the group
* @return A list with the names of all members of the group
*/
public List<String> getMembers() {
if(getSettings() == null || getSettings().getStringList("regions") == null) {
return new ArrayList<>();
}
return getSettings().getStringList("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() {
return plugin.getFileManager().getGroupSettings(name);
}
/**
* 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();
}
}
@@ -1,914 +0,0 @@
package nl.evolutioncoding.areashop;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.UUID;
import java.util.logging.Logger;
import net.milkbowl.vault.economy.Economy;
import nl.evolutioncoding.areashop.Updater.UpdateResult;
import nl.evolutioncoding.areashop.Updater.UpdateType;
import nl.evolutioncoding.areashop.interfaces.AreaShopInterface;
import nl.evolutioncoding.areashop.interfaces.WorldEditInterface;
import nl.evolutioncoding.areashop.interfaces.WorldGuardInterface;
import nl.evolutioncoding.areashop.listeners.PlayerLoginLogoutListener;
import nl.evolutioncoding.areashop.listeners.SignBreakListener;
import nl.evolutioncoding.areashop.listeners.SignChangeListener;
import nl.evolutioncoding.areashop.listeners.SignClickListener;
import nl.evolutioncoding.areashop.managers.CommandManager;
import nl.evolutioncoding.areashop.managers.FileManager;
import nl.evolutioncoding.areashop.managers.LanguageManager;
import nl.evolutioncoding.areashop.managers.SignLinkerManager;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.permissions.Permission;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
/**
* Main class for the AreaShop plugin
* @author NLThijs48
*/
public final class AreaShop extends JavaPlugin implements AreaShopInterface {
/* General variables */
private static AreaShop instance = null;
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 boolean debug = false;
private String chatprefix = null;
private Updater updater = null;
private boolean updateAvailable = false;
private boolean ready = false;
/* Folders and file names */
public static final String languageFolder = "lang";
public static final String schematicFolder = "schem";
public static final String schematicExtension = ".schematic";
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 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 tagTimeLeft = "%timeleft%";
public static final String tagClicker = "%clicker%";
public static final String tagResellPrice = "%resellprice%";
public static final String tagRawResellPrice = "%rawresellprice%";
public static final String tagFriends = "%friends%";
public static final String tagFriendsUUID = "%friendsuuid%";
public static final String tagMoneyBackPercentage = "%moneybackpercent%";
public static final String tagMoneyBackAmount = "%moneyback%";
public static final String tagRawMoneyBackAmount = "%rawmoneyback%";
public static final String tagMaxExtends = "%maxextends%";
public static final String tagExtendsLeft = "%extendsleft%";
public static final String tagMaxRentTime = "%maxrenttime%";
public static final String tagMaxInactiveTime = "%inactivetime%";
public static final String tagLandlord = "%landlord%";
public static final String tagLandlordUUID = "%landlorduuid%";
public static final String tagDateTime = "%datetime%";
public static final String tagDateTimeShort = "%datetimeshort%";
public static final String tagYear = "%year%";
public static final String tagMonth = "%month%";
public static final String tagDay = "%day%";
public static final String tagHour = "%hour%";
public static final String tagMinute = "%minute%";
public static final String tagSecond = "%second%";
public static final String tagMillisecond = "%millisecond%";
public static final String tagEpoch = "%epoch%";
public static AreaShop getInstance() {
return AreaShop.instance;
}
/**
* Called on start or reload of the server
*/
public void onEnable() {
AreaShop.instance = this;
boolean error = false;
// Check if WorldGuard is present
String wgVersion = null;
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
if (plugin == null || !(plugin instanceof WorldGuardPlugin)) {
this.getLogger().severe("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)
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
wgVersion = "5";
} else {
wgVersion = "6";
}
try {
final Class<?> clazz = Class.forName("nl.evolutioncoding.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
this.worldGuardInterface = (WorldGuardInterface) clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch (final Exception e) {
e.printStackTrace();
this.getLogger().severe("Could not load the handler for WorldGuard (tried to load " + wgVersion + "), report this problem to the author.");
error = true;
wgVersion = null;
}
}
// Check if WorldEdit is present
String weVersion = null;
plugin = getServer().getPluginManager().getPlugin("WorldEdit");
if (plugin == null || !(plugin instanceof WorldEditPlugin)) {
this.getLogger().severe("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 {
weVersion = "6";
}
try {
final Class<?> clazz = Class.forName("nl.evolutioncoding.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
this.worldEditInterface = (WorldEditInterface) clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
}
} catch (final Exception e) {
e.printStackTrace();
this.getLogger().severe("Could not load the handler for WorldEdit (tried to load " + weVersion + "), report this problem to the author.");
error = true;
weVersion = null;
}
}
// Check if Vault is present
if(getServer().getPluginManager().getPlugin("Vault") == null) {
this.getLogger().severe("Vault plugin is not present or has not loaded correctly");
error = true;
}
// Load all data from files and check versions
fileManager = new FileManager(this);
error = error & !fileManager.loadFiles();
// Print loaded version of WG and WE in debug
if(wgVersion != null) {
AreaShop.debug("Loaded WorldGuardHandler" + wgVersion);
}
if(weVersion != null) {
AreaShop.debug("Loaded WorldEditHandler" + weVersion);
}
// Create a LanguageMananager
languageManager = new LanguageManager(this);
if(error) {
this.getLogger().severe("The plugin has not started, fix the errors listed above");
} else {
// Register the event listeners
this.getServer().getPluginManager().registerEvents(new SignChangeListener(this), this);
this.getServer().getPluginManager().registerEvents(new SignBreakListener(this), this);
this.getServer().getPluginManager().registerEvents(new SignClickListener(this), this);
this.getServer().getPluginManager().registerEvents(new PlayerLoginLogoutListener(this), this);
setupTasks();
// Startup the CommandManager (registers itself for the command)
commandManager = new CommandManager(this);
// Create a signLinkerManager
signLinkerManager = new SignLinkerManager(this);
// Enable Metrics if config allows it
if(this.getConfig().getBoolean("sendStats")) {
this.startMetrics();
}
// Register dynamic permission (things declared in config)
registerDynamicPermissions();
// Dont initialize the updatechecker if disabled in the config
if(this.getConfig().getBoolean("checkForUpdates")) {
new BukkitRunnable() {
@Override
public void run() {
try {
updater = new Updater(AreaShop.getInstance(), 76518, null, UpdateType.NO_DOWNLOAD, false);
AreaShop.debug("Result=" + updater.getResult().toString() + ", Latest=" + updater.getLatestName() + ", Type=" + updater.getLatestType());
updateAvailable = updater.getResult() == UpdateResult.UPDATE_AVAILABLE;
if(updateAvailable) {
AreaShop.getInstance().getLogger().info("Update from AreaShop V" + AreaShop.getInstance().getDescription().getVersion() + " to " + updater.getLatestName() + " available, get the latest version at http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/");
new BukkitRunnable() {
@Override
public void run() {
for(Player player : Bukkit.getOnlinePlayers()) {
if(player.hasPermission("areashop.notifyupdate")) {
AreaShop.getInstance().message(player, "update-playerNotify", AreaShop.getInstance().getDescription().getVersion(), AreaShop.getInstance().getUpdater().getLatestName());
}
}
}
}.runTask(AreaShop.getInstance());
}
} catch(Exception e) {
AreaShop.debug("Something went wrong with the Updater:");
AreaShop.debug(e.getMessage());
updateAvailable = false;
}
}
}.runTaskAsynchronously(this);
}
}
}
/**
* Called on shutdown or reload of the server
*/
public void onDisable() {
fileManager.saveRequiredFilesAtOnce();
Bukkit.getServer().getScheduler().cancelTasks(this);
/* set variables to null to prevent memory leaks */
worldGuard = null;
worldEdit = null;
fileManager = null;
languageManager = null;
commandManager = null;
chatprefix = null;
debug = false;
ready = false;
updater = null;
}
/**
* 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;
}
/**
* 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 like &1)
*/
public void setChatprefix(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;
}
/**
* 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;
}
public SignLinkerManager getSignlinkerManager() {
return signLinkerManager;
}
/**
* 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) {
this.getLogger().severe("There is no economy provider to support Vault, make sure you installed an economy plugin");
return null;
}
return economy.getProvider();
}
/**
* Get the current chatPrefix
* @return
*/
public String getChatPrefix() {
return chatprefix;
}
/**
* Method to get the FileManager (loads/save regions and can be used to get regions)
* @return The fileManager
*/
public FileManager getFileManager() {
return fileManager;
}
/**
* Get the updater (check the update result)
* @return The updater
*/
public Updater getUpdater() {
return updater;
}
/**
* Check if an update for AreaShop is available
* @return true if an update is available, otherwise false
*/
public boolean updateAvailable() {
return updateAvailable;
}
/**
* Register dynamic permissions controlled by config settings
*/
public 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) {
this.getLogger().warning("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
*/
public void setupTasks() {
// Rent expiration timer
long expirationCheck = Utils.millisToTicks(getDurationFromSecondsOrString("expiration.delay"));
final AreaShop finalPlugin = this;
if(expirationCheck > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().checkRents();
AreaShop.debug("Checking rent expirations...");
} else {
AreaShop.debug("Skipped checking rent expirations, plugin not ready");
}
}
}.runTaskTimer(this, 1, expirationCheck);
}
// Inactive unrenting/selling timer
long inactiveCheck = Utils.millisToTicks(getDurationFromMinutesOrString("inactive.delay"));
if(inactiveCheck > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().checkForInactiveRegions();
AreaShop.debug("Checking for regions with players that are inactive too long...");
} else {
AreaShop.debug("Skipped checking for regions of inactive players, plugin not ready");
}
}
}.runTaskTimer(this, inactiveCheck, inactiveCheck);
}
// Periodic updating of signs for timeleft tags
long periodicUpdate = Utils.millisToTicks(getDurationFromSecondsOrString("signs.delay"));
if(periodicUpdate > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().performPeriodicSignUpdate();
AreaShop.debug("Performing periodic sign update...");
} else {
AreaShop.debug("Skipped performing periodic sign update, plugin not ready");
}
}
}.runTaskTimer(this, periodicUpdate, periodicUpdate);
}
// Saving regions and group settings
long saveFiles = Utils.millisToTicks(getDurationFromMinutesOrString("saving.delay"));
if(saveFiles > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().saveRequiredFiles();
AreaShop.debug("Saving required files...");
} else {
AreaShop.debug("Skipped saving required files, plugin not ready");
}
}
}.runTaskTimer(this, saveFiles, saveFiles);
}
// Sending warnings about rent regions to online players
long expireWarning = Utils.millisToTicks(getDurationFromMinutesOrString("expireWarning.delay"));
if(expireWarning > 0) {
new BukkitRunnable() {
@Override
public void run() {
if(isReady()) {
finalPlugin.getFileManager().sendRentExpireWarnings();
AreaShop.debug("Sending rent expire warnings...");
} else {
AreaShop.debug("Skipped sending rent expire warnings, plugin not ready");
}
}
}.runTaskTimer(this, expireWarning, expireWarning);
}
// Update all regions on startup
if(getConfig().getBoolean("updateRegionsOnStartup")) {
new BukkitRunnable() {
@Override
public void run() {
finalPlugin.getFileManager().updateAllRegions();
AreaShop.debug("Updating all regions at startup...");
}
}.runTaskLater(this, 20L);
}
}
/**
* Method to send a message to a CommandSender, using chatprefix if it is a player
* @param target The CommandSender you wan't to send the message to (e.g. a player)
* @param key The key to get the translation
* @param prefix Specify if the message should have a prefix
* @param params The parameters to inject into the message string
*/
public void configurableMessage(Object target, String key, boolean prefix, Object... params) {
String langString = this.fixColors(languageManager.getLang(key, params));
if(langString == null || langString.equals("")) {
// Do nothing, message is not available or disabled
} else {
if(target instanceof Player) {
if(prefix) {
((Player)target).sendMessage(this.fixColors(chatprefix) + langString);
} else {
((Player)target).sendMessage(langString);
}
} else if(target instanceof CommandSender) {
if(!getConfig().getBoolean("useColorsInConsole")) {
langString = ChatColor.stripColor(langString);
}
((CommandSender)target).sendMessage(langString);
}
else if(target instanceof Logger) {
if(!getConfig().getBoolean("useColorsInConsole")) {
langString = ChatColor.stripColor(langString);
}
((Logger)target).info(langString);
} else {
langString = ChatColor.stripColor(langString);
this.getLogger().info("Could not send message, target is wrong: " + langString);
}
}
}
public void messageNoPrefix(Object target, String key, Object... params) {
configurableMessage(target, key, false, params);
}
public void message(Object target, String key, Object... params) {
configurableMessage(target, key, true, params);
}
/**
* 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 String fixColors(String input) {
String result = null;
if(input != null) {
result = ChatColor.translateAlternateColorCodes('&', input);
result = result.replaceAll("�", "\u20AC");
}
return result;
}
/**
* Format the currency amount with the characters before and after
* @return Currency character format string
* @param amount Amount of money to format
*/
public String formatCurrency(double amount) {
String before = this.getConfig().getString("moneyCharacter");
before = before.replace(currencyEuro, "\u20ac");
String after = this.getConfig().getString("moneyCharacterAfter");
after = after.replace(currencyEuro, "\u20ac");
String result;
// Check for infinite and NaN
if(Double.isInfinite(amount)) {
result = "\u221E"; // Infinite symbol
} else if(Double.isNaN(amount)) {
result = "NaN";
} else {
// Add metric
double metricAbove = getConfig().getDouble("metricSuffixesAbove");
if(metricAbove != -1 && amount >= metricAbove) {
if(amount >= 1000000000000000000000000.0) {
amount = amount/1000000000000000000000000.0;
after = "Y" + after;
} else if(amount >= 1000000000000000000000.0) {
amount = amount/1000000000000000000000.0;
after = "Z" + after;
} else if(amount >= 1000000000000000000.0) {
amount = amount/1000000000000000000.0;
after = "E" + after;
} else if(amount >= 1000000000000000.0) {
amount = amount/1000000000000000.0;
after = "P" + after;
} else if(amount >= 1000000000000.0) {
amount = amount/1000000000000.0;
after = "T" + after;
} else if(amount >= 1000000000.0) {
amount = amount/1000000000.0;
after = "G" + after;
} else if(amount >= 1000000.0) {
amount = amount/1000000.0;
after = "M" + after;
} else if(amount >= 1000.0) {
amount = amount/1000.0;
after = "k" + after;
}
BigDecimal bigDecimal = new BigDecimal(amount);
if(bigDecimal.toString().contains(".")) {
int frontLength = bigDecimal.toString().substring(0, bigDecimal.toString().indexOf('.')).length();
bigDecimal = bigDecimal.setScale(getConfig().getInt("fractionalNumbers") + (3-frontLength), RoundingMode.HALF_UP);
}
result = bigDecimal.toString();
} else {
BigDecimal bigDecimal = new BigDecimal(amount);
bigDecimal = bigDecimal.setScale(getConfig().getInt("fractionalNumbers"), RoundingMode.HALF_UP);
amount = bigDecimal.doubleValue();
result = bigDecimal.toString();
if(getConfig().getBoolean("hideEmptyFractionalPart") && (amount%1.0) == 0.0 && result.contains(".")) {
result = result.substring(0, result.indexOf('.'));
}
}
}
result = result.replace(".", getConfig().getString("decimalMark"));
return before + result + after;
}
/**
* Function for quitting the plugin, NOT USED ATM
*/
public void quit() {
this.getLogger().info("Plugin will be stopped");
Bukkit.getPluginManager().disablePlugin(this);
}
/**
* Return the config configured by the user or the default
*/
@Override
public YamlConfiguration getConfig() {
return fileManager.getConfig();
}
/**
* Start the Metrics stats collection
*/
private void startMetrics() {
try {
Metrics metrics = new Metrics(this);
metrics.start();
} catch (Exception e) {
AreaShop.debug("Could not start Metrics");
}
}
/**
* 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 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, time.length());
ArrayList<String> identifiers = new ArrayList<String>();
identifiers.addAll(this.getConfig().getStringList("minutes"));
identifiers.addAll(this.getConfig().getStringList("hours"));
identifiers.addAll(this.getConfig().getStringList("days"));
identifiers.addAll(this.getConfig().getStringList("months"));
identifiers.addAll(this.getConfig().getStringList("years"));
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 long durationStringToLong(String duration) {
if(duration == null) {
return 0;
} else if(duration.equalsIgnoreCase("disabled") || duration.equalsIgnoreCase("unlimited")) {
return -1;
} else if(duration.indexOf(' ') == -1) {
return 0;
}
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(0);
ArrayList<String> seconds = new ArrayList<String>(this.getConfig().getStringList("seconds"));
ArrayList<String> minutes = new ArrayList<String>(this.getConfig().getStringList("minutes"));
ArrayList<String> hours = new ArrayList<String>(this.getConfig().getStringList("hours"));
ArrayList<String> days = new ArrayList<String>(this.getConfig().getStringList("days"));
ArrayList<String> months = new ArrayList<String>(this.getConfig().getStringList("months"));
ArrayList<String> years = new ArrayList<String>(this.getConfig().getStringList("years"));
String durationString = duration.substring(duration.indexOf(' ')+1, duration.length());
int durationInt = 0;
try {
durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' ')));
} catch(NumberFormatException exception) {}
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(months.contains(durationString)) {
calendar.add(Calendar.MONTH, durationInt);
} else if(years.contains(durationString)) {
calendar.add(Calendar.YEAR, durationInt);
}
return calendar.getTimeInMillis();
}
/**
* 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 long getDurationFromSecondsOrString(String path) {
if(getConfig().isLong(path) || getConfig().isInt(path)) {
long setting = getConfig().getLong(path);
if(setting != -1) {
setting = setting*1000;
}
return setting;
} else {
return durationStringToLong(getConfig().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 long getDurationFromMinutesOrString(String path) {
if(getConfig().isLong(path) || getConfig().isInt(path)) {
long setting = getConfig().getLong(path);
if(setting != -1) {
setting = setting*60*1000;
}
return setting;
} else {
return durationStringToLong(getConfig().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 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 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);
}
}
/**
* Sends an debug message to the console
* @param message The message that should be printed to the console
*/
public static void debug(String message) {
if(AreaShop.getInstance().debug) {
AreaShop.getInstance().getLogger().info("Debug: " + message);
}
}
/**
* Non-static debug to use as implementation of the interface
*/
public void debugI(String message) {
AreaShop.debug(message);
}
/**
* Reload all files of the plugin and update all regions
* confirmationReceiver The CommandSender that should receive confirmation messages, null for nobody
*/
public void reload(final CommandSender confirmationReceiver) {
setReady(false);
fileManager.saveRequiredFilesAtOnce();
chatprefix = this.getConfig().getString("chatPrefix");
debug = this.getConfig().getBoolean("debug");
fileManager.loadFiles();
languageManager.startup();
message(confirmationReceiver, "reload-reloading");
fileManager.checkRents();
fileManager.updateAllRegions(confirmationReceiver);
}
/**
* Reload all files of the plugin and update all regions
*/
public void reload() {
reload(null);
}
/**
* Conversion to name by uuid
* @param uuid The uuid in string format
* @return the name of the player
*/
public String toName(String uuid) {
if(uuid == null) {
return "";
} else {
UUID parsed = null;
try {
parsed = UUID.fromString(uuid);
} catch(IllegalArgumentException e) {}
if(parsed == null) {
return "";
}
return this.toName(parsed);
}
}
/**
* Conversion to name by uuid object
* @param uuid The uuid in string format
* @return the name of the player
*/
public 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 String toUUID(String name) {
if(name == null) {
return null;
} else {
return Bukkit.getOfflinePlayer(name).getUniqueId().toString();
}
}
}
@@ -1,293 +0,0 @@
package nl.evolutioncoding.areashop;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionType;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.BlockFace;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import com.sk89q.worldedit.bukkit.selections.Selection;
import com.sk89q.worldguard.protection.managers.RegionManager;
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
public class Utils {
// Not used
private Utils() {}
/**
* Create a map from a location, to save it in the config
* @param location The location to transform
* @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;
}
public static ConfigurationSection locationToConfig(Location location) {
return locationToConfig(location, false);
}
/**
* Create a location from a map, reconstruction from the config values
* @param map The map 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")),
(Double)config.getDouble("x"),
(Double)config.getDouble("y"),
(Double)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
* @return Innput object concatenated with comma's in between
*/
public static String createCommaSeparatedList(Collection<? extends Object> input) {
String result = "";
boolean first = true;
for(Object object : input) {
if(object != null) {
if(first) {
first = false;
result += object.toString();
} else {
result += ", " + object.toString();
}
}
}
return result;
}
/**
* 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;
}
public 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> getASRegionsInSelection(Selection selection) {
ArrayList<GeneralRegion> result = new ArrayList<GeneralRegion>();
for(ProtectedRegion region : getWERegionsInSelection(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> getASRegionsByLocation(Location location) {
Selection selection = new CuboidSelection(location.getWorld(), location, location);
return getASRegionsInSelection(selection);
}
/**
* 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> getWERegionsInSelection(Selection selection) {
// Get all regions inside or intersecting with the WorldEdit selection of the player
World world = selection.getWorld();
RegionManager regionManager = AreaShop.getInstance().getWorldGuard().getRegionManager(world);
ArrayList<ProtectedRegion> result = new ArrayList<ProtectedRegion>();
Location selectionMin = selection.getMinimumPoint();
Location selectionMax = selection.getMaximumPoint();
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> getApplicableRegions(Location location) {
List<ProtectedRegion> result = new ArrayList<ProtectedRegion>();
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;
}
// Methods to get the most important AreaShop regions at a certain location
public static List<RentRegion> getApplicableRentRegions(Location location) {
List<RentRegion> result = new ArrayList<RentRegion>();
for(GeneralRegion region : getApplicableASRegions(location, RegionType.RENT)) {
result.add((RentRegion)region);
}
return result;
}
public static List<BuyRegion> getApplicableBuyRegions(Location location) {
List<BuyRegion> result = new ArrayList<BuyRegion>();
for(GeneralRegion region : getApplicableASRegions(location, RegionType.BUY)) {
result.add((BuyRegion)region);
}
return result;
}
public static List<GeneralRegion> getAllApplicableRegions(Location location) {
return getApplicableASRegions(location, null);
}
public static List<GeneralRegion> getApplicableASRegions(Location location, RegionType type) {
List<GeneralRegion> result = new ArrayList<GeneralRegion>();
// TODO move to version specific classes
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
if(regions != null) {
List<GeneralRegion> candidates = new ArrayList<GeneralRegion>();
for(ProtectedRegion pr : regions) {
GeneralRegion region = AreaShop.getInstance().getFileManager().getRegion(pr.getId());
if(region != null && (
(type == RegionType.RENT && region.isRentRegion())
|| (type == RegionType.BUY && region.isBuyRegion())
|| 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))) {
result.clear();
result.add(region);
} else {
result.add(region);
}
}
}
}
return new ArrayList<GeneralRegion>(result);
}
}
@@ -1,41 +0,0 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class HelpCommand extends CommandAreaShop {
public HelpCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop help";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.help")) {
return plugin.getLanguageManager().getLang("help-help");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
plugin.getCommandManager().showHelp(sender);
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
ArrayList<String> result = new ArrayList<String>();
return result;
}
}
@@ -1,488 +0,0 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.Utils;
import nl.evolutioncoding.areashop.regions.BuyRegion;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import nl.evolutioncoding.areashop.regions.RegionGroup;
import nl.evolutioncoding.areashop.regions.RentRegion;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class InfoCommand extends CommandAreaShop {
public InfoCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop info";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.info")) {
return plugin.getLanguageManager().getLang("help-info");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.info")) {
plugin.message(sender, "info-noPermission");
return;
}
if(args.length > 1 && args[1] != null) {
/* List of all regions */
if(args[1].equalsIgnoreCase("all")) {
String message = "";
/* Message for rents */
Iterator<RentRegion> itRent = plugin.getFileManager().getRents().iterator();
if(itRent.hasNext()) {
message = itRent.next().getName();
while(itRent.hasNext()) {
message += ", " + itRent.next().getName();
}
}
if(message.equals("")) {
plugin.message(sender, "info-all-noRents");
} else {
plugin.message(sender, "info-all-rents", message);
}
/* Message for buys */
message = "";
Iterator<BuyRegion> itBuy = plugin.getFileManager().getBuys().iterator();
if(itBuy.hasNext()) {
message = itBuy.next().getName();
while(itBuy.hasNext()) {
message += ", " + itBuy.next().getName();
}
}
if(message.equals("")) {
plugin.message(sender, "info-all-noBuys");
} else {
plugin.message(sender, "info-all-buys", message);
}
}
/* List of rented regions */
else if(args[1].equalsIgnoreCase("rented")) {
String message = "";
Iterator<RentRegion> it = plugin.getFileManager().getRents().iterator();
boolean first = true;
while(it.hasNext()) {
RentRegion next = it.next();
if(next.isRented()) {
if(!first) {
message += ", " + next.getName();
} else {
first = false;
message += next.getName();
}
}
}
if(message.equals("")) {
plugin.message(sender, "info-noRented");
} else {
plugin.message(sender, "info-rented", message);
}
}
/* List of unrented regions */
else if(args[1].equalsIgnoreCase("forrent")) {
String message = "";
Iterator<RentRegion> it = plugin.getFileManager().getRents().iterator();
boolean first = true;
while(it.hasNext()) {
RentRegion next = it.next();
if(!next.isRented()) {
if(!first) {
message += ", " + next.getName();
} else {
first = false;
message = next.getName();
}
}
}
if(message.equals("")) {
plugin.message(sender, "info-noUnrented");
} else {
plugin.message(sender, "info-unrented", message);
}
} else if(args[1].equalsIgnoreCase("sold")) {
String message = "";
Iterator<BuyRegion> it = plugin.getFileManager().getBuys().iterator();
boolean first = true;
while(it.hasNext()) {
BuyRegion next = it.next();
if(next.isSold()) {
if(!first) {
message += ", ";
} else {
first = false;
}
message += next.getName();
}
}
if(message.equals("")) {
plugin.message(sender, "info-noSold");
} else {
plugin.message(sender, "info-sold", message);
}
} else if(args[1].equalsIgnoreCase("forsale")) {
String message = "";
Iterator<BuyRegion> it = plugin.getFileManager().getBuys().iterator();
boolean first = true;
while(it.hasNext()) {
BuyRegion next =it.next();
if(!next.isSold()) {
if(!first) {
message += ", " + next.getName();
} else {
first = false;
message = next.getName();
}
}
}
if(message.equals("")) {
plugin.message(sender, "info-noForsale");
} else {
plugin.message(sender, "info-forsale", message);
}
} else if(args[1].equalsIgnoreCase("player")) {
if(args.length > 2 && args[2] != null) {
String message = "";
Iterator<RentRegion> itRent = plugin.getFileManager().getRents().iterator();
boolean first = true;
while(itRent.hasNext()) {
RentRegion next = itRent.next();
if(next.isRented() && next.getPlayerName().equalsIgnoreCase(args[2])) {
if(!first) {
message += ", " + next.getName();
} else {
first = false;
message = next.getName();
}
}
}
if(message.equals("")) {
plugin.message(sender, "info-playerNoRents", args[2]);
} else {
plugin.message(sender, "info-playerRents", args[2], message);
}
message = "";
Iterator<BuyRegion> itBuy = plugin.getFileManager().getBuys().iterator();
first = true;
while(itBuy.hasNext()) {
BuyRegion next = itBuy.next();
if(next.isSold() && next.getPlayerName().equalsIgnoreCase(args[2])) {
if(!first) {
message += ", ";
} else {
first = false;
}
message += next.getName();
}
}
if(message.equals("")) {
plugin.message(sender, "info-playerNoBuys", args[2]);
} else {
plugin.message(sender, "info-playerBuys", args[2], message);
}
} else {
plugin.message(sender, "info-playerHelp");
}
} 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.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 {
if(regions.get(0).isRentRegion()) {
rent = (RentRegion)regions.get(0);
} else if(regions.get(0).isBuyRegion()) {
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);
plugin.messageNoPrefix(sender, "info-regionMoneyBackRent", rent);
if(!rent.getFriendNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionFriends", rent);
}
} else {
plugin.messageNoPrefix(sender, "info-regionCanBeRented", rent);
}
if(rent.getLandlordName() != null) {
plugin.messageNoPrefix(sender, "info-regionLandlord", rent);
}
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(rent.getMaxRentTime() != -1) {
plugin.messageNoPrefix(sender, "info-regionMaxRentTime", rent);
}
if(rent.getInactiveTimeUntilUnrent() != -1) {
plugin.messageNoPrefix(sender, "info-regionInactiveUnrent", rent);
}
if(sender.hasPermission("areashop.teleport") || sender.hasPermission("areashop.teleportall")) {
Location teleport = rent.getTeleportLocation();
if(teleport == null) {
if(rent.isRented()) {
plugin.messageNoPrefix(sender, "info-regionNoTeleport", rent, plugin.getLanguageManager().getLang("info-regionTeleportHint", rent));
} else {
plugin.messageNoPrefix(sender, "info-regionNoTeleport", rent, "");
}
} else {
plugin.messageNoPrefix(sender, "info-regionTeleportAt", rent, teleport.getWorld().getName(), teleport.getBlockX(), teleport.getBlockY(), teleport.getBlockZ(), (int)teleport.getPitch(), (int)teleport.getYaw());
}
}
List<String> signLocations = new ArrayList<String>();
for(Location location : rent.getSignLocations()) {
signLocations.add(plugin.getLanguageManager().getLang("info-regionSignLocation", location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()));
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
if(sender.hasPermission("areashop.groupinfo") && !rent.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(rent.getGroupNames()));
}
if(rent.isRestoreEnabled()) {
if(sender.hasPermission("areashop.setrestore")) {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent, plugin.getLanguageManager().getLang("info-regionRestoringProfile", rent.getRestoreProfile()));
} else {
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent, "");
}
}
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);
}
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuy", buy);
if(!buy.getFriendNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionFriends", buy);
}
} 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);
}
if(sender.hasPermission("areashop.teleport") || sender.hasPermission("areashop.teleportall")) {
Location teleport = buy.getTeleportLocation();
if(teleport == null) {
if(buy.isSold()) {
plugin.messageNoPrefix(sender, "info-regionNoTeleport", buy, plugin.getLanguageManager().getLang("info-regionTeleportHint", buy));
} else {
plugin.messageNoPrefix(sender, "info-regionNoTeleport", buy, "");
}
} else {
plugin.messageNoPrefix(sender, "info-regionTeleportAt", buy, teleport.getWorld().getName(), teleport.getBlockX(), teleport.getBlockY(), teleport.getBlockZ(), (int)teleport.getPitch(), (int)teleport.getYaw());
}
}
List<String> signLocations = new ArrayList<String>();
for(Location location : buy.getSignLocations()) {
signLocations.add(plugin.getLanguageManager().getLang("info-regionSignLocation", location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()));
}
if(!signLocations.isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
}
if(sender.hasPermission("areashop.groupinfo") && !buy.getGroupNames().isEmpty()) {
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(buy.getGroupNames()));
}
if(buy.isRestoreEnabled()) {
if(sender.hasPermission("areashop.setrestore")) {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy, plugin.getLanguageManager().getLang("info-regionRestoringProfile", buy.getRestoreProfile()));
} else {
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy, "");
}
}
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");
}
}
/* List of regions without a group */
else if(args[1].equalsIgnoreCase("nogroup")) {
String message = "";
/* Message for rents */
List<String> rents = plugin.getFileManager().getRentNames();
// Remove regions that have a group
for(RegionGroup group : plugin.getFileManager().getGroups()) {
rents.removeAll(group.getMembers());
}
// Create the list message
Iterator<String> itRent = rents.iterator();
if(itRent.hasNext()) {
message = itRent.next();
while(itRent.hasNext()) {
message += ", " + itRent.next();
}
}
if(message.equals("")) {
plugin.message(sender, "info-nogroupNoRents");
} else {
plugin.message(sender, "info-nogroupRents", message);
}
/* Message for buys */
message = "";
// Remove regions that have a group
List<String> buys = plugin.getFileManager().getBuyNames();
for(RegionGroup group : plugin.getFileManager().getGroups()) {
buys.removeAll(group.getMembers());
}
// Create the list message
Iterator<String> itBuy = buys.iterator();
if(itBuy.hasNext()) {
message = itBuy.next();
while(itBuy.hasNext()) {
message += ", " + itBuy.next();
}
}
if(message.equals("")) {
plugin.message(sender, "info-nogroupNoBuys");
} else {
plugin.message(sender, "info-nogroupBuys", message);
}
} else {
plugin.message(sender, "info-help");
}
} else {
plugin.message(sender, "info-help");
}
}
/**
* Create a comma-space separated list from a collection of strings
* @param list The collection with strings
* @return A comma-space separated list of the strings in the collection
*/
public String createCommaString(Collection<String> list) {
String result = "";
boolean first = true;
for(String part : list) {
if(first) {
result += part;
first = false;
} else {
result += ", " + part;
}
}
return result;
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
if(toComplete == 2) {
result.addAll(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "player", "region", "nogroup"));
} else if(toComplete == 3) {
if(start[2].equalsIgnoreCase("player")) {
for(Player player : Bukkit.getOnlinePlayers()) {
result.add(player.getName());
}
} else if(start[2].equalsIgnoreCase("region")) {
result.addAll(plugin.getFileManager().getBuyNames());
result.addAll(plugin.getFileManager().getRentNames());
}
}
return result;
}
}
@@ -1,126 +0,0 @@
package nl.evolutioncoding.areashop.commands;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
public class MeCommand extends CommandAreaShop {
public MeCommand(AreaShop plugin) {
super(plugin);
}
@Override
public String getCommandStart() {
return "areashop me";
}
@Override
public String getHelp(CommandSender target) {
if(target.hasPermission("areashop.me")) {
return plugin.getLanguageManager().getLang("help-me");
}
return null;
}
@Override
public void execute(CommandSender sender, Command command, String[] args) {
if(!sender.hasPermission("areashop.me")) {
plugin.message(sender, "me-noPermission");
return;
}
if(!(sender instanceof Player)) {
plugin.message(sender, "me-notAPlayer");
return;
}
Player player = (Player)sender;
// Get the regions owned by the player
Set<RentRegion> rentRegions = new HashSet<RentRegion>();
for(RentRegion region : plugin.getFileManager().getRents()) {
if(region.isOwner(player)) {
rentRegions.add(region);
}
}
Set<BuyRegion> buyRegions = new HashSet<BuyRegion>();
for(BuyRegion region : plugin.getFileManager().getBuys()) {
if(region.isOwner(player)) {
buyRegions.add(region);
}
}
// Send messages
if(rentRegions.isEmpty()) {
plugin.message(player, "me-noRentRegions");
} else {
plugin.message(player, "me-rentRegions");
for(RentRegion region : rentRegions) {
plugin.messageNoPrefix(player, "me-rentLine", region);
}
}
if(buyRegions.isEmpty()) {
plugin.message(player, "me-noBuyRegions");
} else {
plugin.message(player, "me-buyRegions");
for(BuyRegion region : buyRegions) {
plugin.messageNoPrefix(player, "me-buyLine", region);
}
}
Set<GeneralRegion> friendRegions = new HashSet<GeneralRegion>();
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
if(region.getFriends() != null && region.getFriends().contains(player.getUniqueId())) {
friendRegions.add(region);
}
}
if(friendRegions.isEmpty()) {
plugin.message(player, "me-noFriendRegions");
} else {
plugin.message(player, "me-friendRegions");
for(GeneralRegion region : friendRegions) {
plugin.messageNoPrefix(player, "me-friendLine", region);
}
}
}
@Override
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
List<String> result = new ArrayList<String>();
// Nothing to complete
return result;
}
}
@@ -1,11 +0,0 @@
package nl.evolutioncoding.areashop.exceptions;
public class RegionCreateException extends Exception {
private static final long serialVersionUID = 1L;
public RegionCreateException(String message) {
super(message);
}
}
@@ -1,211 +0,0 @@
package nl.evolutioncoding.areashop.managers;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import nl.evolutioncoding.areashop.AreaShop;
import nl.evolutioncoding.areashop.regions.GeneralRegion;
import org.bukkit.configuration.file.YamlConfiguration;
import com.google.common.base.Charsets;
public class LanguageManager {
private AreaShop plugin = null;
private String languages[] = {"EN", "NL", "FI", "DE", "FR", "PL", "ZH_TW"};
private HashMap<String, String> currentLanguage, defaultLanguage;
/**
* Constructor
* @param plugin The AreaShop plugin
*/
public LanguageManager(AreaShop plugin) {
this.plugin = plugin;
startup();
}
/**
* Save the default language files and open the current and backup language file
*/
public void startup() {
this.saveDefaults();
this.loadLanguage();
}
/**
* Saves the default language files if not already present
*/
public void saveDefaults() {
/* Create the language folder if it not exists */
File langFolder;
langFolder = new File(plugin.getDataFolder() + File.separator + AreaShop.languageFolder);
if(!langFolder.exists()) {
langFolder.mkdirs();
}
/* Create the language files, overwrites if a file already exists */
/* Overriding is necessary because otherwise with an update the new lang */
/* files would not be used, when translating your own use another */
/* file name as the default */
File langFile;
for(int i=0; i<languages.length; i++) {
langFile = new File(plugin.getDataFolder() + File.separator + AreaShop.languageFolder + File.separator + languages[i] + ".yml");
InputStream input = null;
OutputStream output = null;
try {
input = plugin.getResource(AreaShop.languageFolder + "/" + languages[i] + ".yml");
if(input == null) {
plugin.getLogger().warning("Could not save default language to the '" + AreaShop.languageFolder + "' folder: " + languages[i] + ".yml");
continue;
}
output = new FileOutputStream(langFile);
int read = 0;
byte[] bytes = new byte[1024];
while ((read = input.read(bytes)) != -1) {
output.write(bytes, 0, read);
}
input.close();
output.close();
} catch(IOException e) {
try {
input.close();
output.close();
} catch (IOException e1) {} catch (NullPointerException e2) {}
plugin.getLogger().warning("Something went wrong saving a default language file: " + langFile.getPath());
}
}
}
/**
* Loads the current language file specified in the config
*/
public void loadLanguage() {
Map<String, Object> map;
Set<String> set;
YamlConfiguration ymlFile;
/* Save the current language file to the HashMap */
currentLanguage = new HashMap<String, String>();
File file = new File(plugin.getDataFolder() + File.separator + AreaShop.languageFolder + File.separator + plugin.getConfig().getString("language") + ".yml");
InputStreamReader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file), Charsets.UTF_8);
} catch (FileNotFoundException e1) {}
if(reader != null) {
ymlFile = YamlConfiguration.loadConfiguration(reader);
map = ymlFile.getValues(true);
set = map.keySet();
try {
for(String key : set) {
currentLanguage.put(key, (String)map.get(key));
}
} catch(ClassCastException e) {}
}
/* Save the default strings to the HashMap */
defaultLanguage = new HashMap<String, String>();
File standard = new File(plugin.getDataFolder() + File.separator + AreaShop.languageFolder + "/" + languages[0]+ ".yml");
InputStreamReader reader2 = null;
try {
reader2 = new InputStreamReader(new FileInputStream(standard), Charsets.UTF_8);
} catch (FileNotFoundException e1) {}
if(reader2 != null) {
ymlFile = YamlConfiguration.loadConfiguration(reader2);
map = ymlFile.getValues(true);
set = map.keySet();
try {
for(String key : set) {
defaultLanguage.put(key, (String)map.get(key));
}
} catch(ClassCastException e) {}
}
}
/**
* Function to get the string in the language that has been set
* @param key Key to the language string
* @param params The replacements for the %1% tags
* @return String The language string specified with the key
*/
public String getLang(String key, Object... params) {
String result = null;
/* Get the language string */
if(currentLanguage.containsKey(key)) {
result = currentLanguage.get(key);
} else {
result = defaultLanguage.get(key);
}
if(result == null) {
plugin.getLogger().info("Wrong key for getting translation: " + key + ", please contact the author about this");
} else {
/* Replace all tags like %0% and if given a GeneralRegion apply all replacements */
int number=0;
for (int i=0; i<params.length; i++) {
if(params[i] != null) {
if(params[i] instanceof GeneralRegion) {
result = ((GeneralRegion)params[i]).applyAllReplacements(result);
} else {
result = result.replace("%" + number + "%", params[i].toString());
number++;
}
}
}
}
return result;
}
}
File diff suppressed because it is too large. Load diff
+114 -312
View File
@@ -1,70 +1,77 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ 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 │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Chatprefix used for all messages in the chat, also changes the greeting messages.
chatPrefix: '&2[AreaShop]&r '
## The language file that should be used, check the 'lang' folder for build-in languages (use the filename without .yml here).
# 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 you need to write on the sign to trigger the plugin.
# The tags that need to be written on the first line of a sign to add it to AreaShop.
signTags:
## Tag for adding a rent region.
rent: '[rent]'
## Tag for adding a buy region.
buy: '[buy]'
## Tag for adding a sign to an existing region.
# Add a rental region.
rent: '[asrent]'
# Add a buy region.
buy: '[asbuy]'
# Add a sign to an existing region.
add: '[as]'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ NUMBERS: Options to change the output of prices. │
# │ ECONOMY: Options to change the display of prices. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## The characters displayed before a price, special characters like € can be used.
# The characters displayed before a price.
moneyCharacter: '$'
## The characters displayed after a price, special characters like € can be used.
# The characters displayed after a price.
moneyCharacterAfter: ''
## How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01').
# How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
fractionalNumbers: 2
## Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
# Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
hideEmptyFractionalPart: true
## Use metric suffixes if the price is above this number (use 1.00M instead of 1000000.00 etc.), use -1 for disable.
## Indications are used as defined on: http://en.wikipedia.org/wiki/Metric_prefix, implemented from 'k' to 'Y'.
# Use metric suffixes if the price is above this number (use 1.00M instead of 1000000.00 etc.), use -1 to disable.
# Indications are used as defined on: http://en.wikipedia.org/wiki/Metric_prefix, implemented from 'k' to 'Y'.
metricSuffixesAbove: 1000000.0
## The character(s) to use as decimal mark.
# The character(s) to use as decimal mark.
decimalMark: '.'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENTING: Options that apply to all rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
## Search for 'java SimpleDateFormat' for more options and documentation.
# Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatSign: 'dd-MM HH:mm'
## Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
## Search for 'java SimpleDateFormat' for more options and documentation.
# Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
# Search for 'java SimpleDateFormat' for more options and documentation.
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
## Time indicators, used for specifing time periods (for example rent duration).
## Be careful with deleting words, will break settings using those, adding is no problem.
# Time indicators, used for specifing time periods (for example rent duration).
seconds: [s, sec, secs, second, seconds]
minutes: [m, min, mins, minute, minutes, minuten, minuut]
hours: [h, hour, hours, uur, uren]
days: [d, day, days, dag, dagen]
months: [M, month, months, maanden, maand]
years: [y, year, years, jaar, jaren]
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' and ops have the unlimited group.
## All the groups applied to the player will be checked and only if they all allow an extra region it will be permitted.
## Add a 'worlds' or 'groups' list to a group to only count regions from those worlds and/or groups.
## This can be used to get different limits for other worlds or area's.
## Give players permissions globally and not per world! That would break limits when then try renting/buying from within another world.
# 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
@@ -72,297 +79,92 @@ limitGroups:
buys: 1
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ PROFILES: Assigned in general (default.yml), for a group (groups.yml) or individually (<region>.yml) │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Below is a list of tags that can be used with all the profiles below.
## If a tag has no value (for example when you use %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), will not get replaced if no renter/buyer.
## %uuid% The uuid of the player that rents/buys the region, will not get replaced if no renter/buyer.
## %friends% The names of friends added to this region separated by ', '.
## %friendsuuid% The UUID's of friends added to this region separated by ', '.
## %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 (amount of blocks on the x-axis).
## %depth% The depth of the region (amount of blocks on the z-axis).
## %height% The height of the region (amount 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, like '10.0' or '7.77'.
## %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency characters).
## %rawmoneyback% The moneyback without formatting, like '10.0' or '7.77'.
## %moneybackpercent% The percentage of the price the player will get back when unrenting (only the number between 0-100).
## %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).
## Below are profiles for the signs, you can assign profiles to regions
## by setting 'general.signProfile' in default.yml, groups or individual regions.
signProfiles:
default:
## 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 clicking player and 'Console' ones from the console.
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'areashop rent %region%'
leftClickPlayer:
- 'areashop info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'areashop rent %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop unrent %region%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
resell:
line1: '&9&l[Resale]'
line2: '%region%'
line3: '%resellprice%'
line4: '&8%player%'
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop stopresell %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop sell %region%'
## Option to run certain commands when one of these events happen.
## Commands at a 'before' section will execute before the region details are changed in the AreaShop system
## and before any other actions occurred (changing signs, saving/loading schematics, etc.),
## the 'after' commands will be run when all changes are done.
## After 'before' or 'after' you can create a list of commands (see example at the created event).
eventCommandProfiles:
default:
created:
before:
after:
## - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
resell:
before:
after:
## For the following events you can specify if you want to restore or save the region to a schematic.
## After 'save:' or 'restore:' you enter the name of the file to restore from/to.
## If you want your regions all looking the same then you can leave out the %region% part to use the same schematic for all.
## Be carefull with these options, it could crash your server or destroy (parts of) your world if used wrong!
## The limit 'maximumBlocks' applies to restoring/saving schematics, be sure your regions are below the limit.
schematicProfiles:
default:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: ''
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: ''
restore: ''
sold:
save: ''
restore: '%type%-%region%'
resell:
save: ''
restore: ''
## Flag profiles to specify what flags should be set on the WorldGuard regions.
## All normal region flags as present in WorldGuard can be used, and also members, owners, priority and parent.
## Each line represents a WorldGuard setting that should be set to a certain value when the region is in the specified state.
## The members and owners flag normally take a list of UUID's separated by 'comma space', adding by name is possible with 'n:<name>'.
## You can add groups by using 'g:<groupname>', so in total you could use: '%uuid%, %friendsuuid%, g:vip, n:cool-guy'.
## For flags like 'entry' and 'exit' you can add group setting by using 'g:<scope>' behind it, <scope> is one of the following:
## members, non_members, owners, non_owners, all. Example, only owners can enter the region:
## entry: 'deny g:non_owners'
## Use '' for a flag to reset it.
flagProfiles:
default:
forrent:
members: ''
greeting: '%lang:prefix%%lang:greeting-forrent%'
rented:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-rented%'
forsale:
members: ''
greeting: '%lang:prefix%%lang:greeting-forsale%'
sold:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-bought%'
resale:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-resale%'
## Profiles that specify when players should get messages about rent that almost run out.
## The numbers that start sections in the profile specify how time before it actually runs out it should be executed.
## When warnPlayer is set to true a message will be send that is specified in the language file.
## All commands in the list below 'commands:' will execute together with the warning, all normal variables can be used.
expirationWarningProfiles:
default:
"1 day":
warnPlayer: true
commands:
## - "say %region% is about to expire for %player%: %timeleft% left"
"1 hour":
warnPlayer: true
commands:
"5 minutes":
warnPlayer: true
commands:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ ADVANCED AND DEBUG: Specific options to tweak the plugin precisely and check if it functions correctly. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
## for 'java regex pattern' to find documentation about how to use it. The case-insensitive option is enabled because
## WorldGuard will return the correct region no matter what the casing is.
## Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
## The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
## This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
# Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
# for 'java regex pattern' to find documentation about how to use it.
# Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
# The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
# This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
blacklist:
- '__global__'
## Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
## When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
# Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
# When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
stackRegionNumberLength: 3
# Allow/disallow adding players that did not visit the server yet as friend of a region
# Allow/disallow adding players that did not visit the server yet as friend of a region.
addFriendNotExistingPlayers: false
## Enable sending stats to http://mcstats.org/ (Metrics plugin).
## This information will give me an indication about how much the plugin is used and encourages me to continue development.
# Enable sending stats to http://mcstats.org/ (Metrics plugin).
# This information will give me an indication about how much the plugin is used and encourages me to continue development.
sendStats: true
## If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it
## A message will be printed in the console when an update is available and OPs will be notified when joining the server.
# If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it.
checkForUpdates: true
## Use colors when sending messages to console and log files.
# Use colors when sending messages to console and log files.
useColorsInConsole: false
## Post error messages in the console when a command run from the config fails (from the 'runCommands' section for example).
postCommandErrors: true
## Update all region flags and signs after starting the plugin (uses the 'regionsPerTick' setting from the 'update' section).
## This ensures that changes to the config are directly visible after restarting the server.
# 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.
# Enables / disables debug messages in the console, could be useful to figure out where errors come from.
debug: false
## Version of the config, do not change!
# Version of the config, do not change!
version: ${project.version}
# Maximum number of blocks to save to or restore from a .schemetic file.
maximumBlocks: 1000000
# Maximum number of locations the teleport function should check to find a safe spot.
maximumTries: 50000
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ LIMITS AND TIMINGS: Options for limits and the frequencies for certain functions (be very careful with these!). │
# │ VARIABLES: Variables that can be used in messages and settings where a region is available. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
## Maximum number of blocks to save to or restore from a .schemetic.
maximumBlocks: 1000000
## Maximum number of locations the teleport function should check to find a safe spot.
maximumTries: 50000
## Setting the 'delay' setting to 0 or lower will prevent the taks from runnning, if you don't use a certain feature you
## could switch the task off this way.
## The 'delay' settings are specified using a number followed by one of the identifiers as defined above in the config.
## 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:
## Time between saving files that need to be saved (not all files will be saved by default).
delay: '10 minutes'
## How many regions per tick will be saved.
regionsPerTick: 1
## Timings for rent expiration checking.
expiration:
## Time between checking if rent regions have been expired.
delay: '59 seconds'
## Number of rent regions to check per tick.
regionsPerTick: 5
## Timings for expiration warning to online players.
expireWarning:
## The time between checking if expiration warning need to be sent.
delay: '5 minutes'
## Number of regions to update per tick.
regionsPerTick: 3
## Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
update:
## Number of regions to update per tick.
regionsPerTick: 5
## Time between checking if any regions need to be unrented because the player was not online for the specified time period.
inactive:
## Time between checking if a regions needs to be unrented/sold because of inactivity by the player.
delay: '15 minutes'
## Number of rent regions to check per tick.
regionsPerTick: 5
## Timings for the periodic updating of signs (for timeleft tags etc).
signs:
## Time between updates of all signs.
delay: '60 seconds'
## Number of regions to update signs for per tick.
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:
## Number of regions to update signs for per tick.
regionsPerTick: 5
## Timings for adding regions to AreaShop ('/as stack').
adding:
## Number of regions to add per tick.
regionsPerTick: 2
# If a tag has no value (for example %player% when the region is not rented/bought) then the tag will not get replaced.
# %region% The region name (with correct capitalization).
# %player% The name of the player that rents/buys the region (with correct capitalization).
# %uuid% The UUID of the player that rents/buys the region.
# %friends% The names of friends added to this region separated by ', '.
# %friendsuuid% The UUID's of friends added to this region separated by ', '.
# $landlord$ The name of the landlord.
# %landlorduuid% The UUID of the landlord.
# %price% The price of the region formatted with the configured characters before and after the number.
# %rawprice% The price without formatting, like '10.0' or '7.77'.
# %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years'.
# %world% The name of the world that the region is in.
# %type% The type of the region, 'rent' or 'buy'.
# %until% The end time of a rent formatted as configured with 'timeFormatChat'.
# %untilshort% The end time of a rent formatted as configured with 'timeFormatSign'.
# %width% The width of the region (number of blocks on the x-axis).
# %depth% The depth of the region (number of blocks on the z-axis).
# %height% The height of the region (number of blocks on the y-axis).
# %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes).
# %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section).
# %resellprice% The price of a region when it is in resell mode.
# %rawresellprice% The resellprice without formatting.
# %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency layout).
# %rawmoneyback% The moneyback without formatting.
# %moneybackpercent% The percentage of the price the player will get back when unrenting the region.
# %maxextends% The maximum number of extends a player can do on the region.
# %extendsleft% The number of extends that are left (maxextends - timesextended).
# %maxrenttime% The maximum time you can rent a region in advance (human readable).
# %inactivetime% The maximum time a player may be inactive before unrent/sell (human readable).
# %year% The current year.
# %month% The current month in the year.
# %day% The current day in the month.
# %hour% The current hour in the day (0-23).
# %minute% The current minute of the hour.
# %second% The current second of the minute.
# %millisecond% The current millisecond of the second.
# %epoch% The number of milliseconds since January 1, 1970 (Unix Epoch).
# %tpx% The exact x coordinate of the location that the teleport is set to
# %tpy% The exact y coordinate of the location that the teleport is set to
# %tpz% The exact z coordinate of the location that the teleport is set to
# %tpblockx% The rounded x coordinate of the location that the teleport is set to
# %tpblocky% The rounded y coordinate of the location that the teleport is set to
# %tpblockz% The rounded z coordinate of the location that the teleport is set to
# %tppitch% The exact pitch of the teleport location
# %tppitchround% The rounded pitch of the teleport location
# %tpyaw% The exact yaw of the teleport location
# %tpyawround% The rounded yaw of the teleport location
# %tpworld% The world name of the teleport location
# %lang:<languageKey>|Optional arguments|% Insert a message from EN.yml, for example: '%lang:timeleft-ended%' or '%lang:timeleft-years|15|%'
+230 -79
View File
@@ -1,79 +1,230 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ 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. ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ GENERAL: Options for all regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
general:
## Set this to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
enableRestore: false
## The schematic profile as specified in the config.
schematicProfile: 'default'
## The event commands profile as specified in the config.
eventCommandProfile: 'default'
## The profile for the format of the sign as specified in the config.
signProfile: 'default'
## The profile for the WorldGuard flags as specified in the config.
flagProfile: 'default'
## The y location within the region to start searching for safe teleport spots (x and z will be in the middle of the region).
## Possible values: bottom, middle, top.
teleportLocationY: bottom
## If true the teleportation algorithm only allows telportation to inside the region, otherwise it will expand algorithm
## a cube from the starting point to check for safe spots (then it could end outside the region).
## If you set a teleport location outside of the region with /as settp then setting this to true breaks that teleport (players cannot use it).
teleportIntoRegion: true
## Same as above, but then for when you teleport to the sign of a region instead of the region itself.
teleportToSignIntoRegion: false
## Set where the '/as find' command should teleport the player to, set to true for the first sign of the region and set to
## false to teleport to the location set by '/as settp' or the default location (if not set).
findTeleportToSign: true
## Restricts the /as buy and /as rent commands to the world of the region .
## Useful if you have diffrent economies for different worlds.
restrictedToWorld: false
## Restricts the /as buy and /as rent commands to the region itself (player needs to be inside).
restrictedToRegion: false
## The UUID of the landlord, this player will receive all money from rents/buys (but not reselling with '/as resell').
## If you use this value be sure that you set 'moneyBack' to 0, because money will not be substracted from the account
## of the landlord and the player would get money 'out of thin air'.
landlord: ""
## Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead
landlordName: ""
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENT: Options for rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
rent:
## The default price of a renting region.
price: 1000
## The default duration of a renting region, you can find all time indicators in config.yml below the RENTING header.
duration: '1 day'
## The percentage of the renting price you get back if you unrent the region (price of time left will be multiplied by this/100).
moneyBack: 100
## Maximum number of extends a player can do (-1 for infinite, 0 for no extending).
maxExtends: -1
## The Maximum time they can have the region rented in advance (use times like '1 day' etc, or 'unlimited' for no limit).
## If you set this lower then the rent duration then players will not be able to rent the region
## (because it always exceeds the maxRentTime in that case).
maxRentTime: 'unlimited'
## Automatically unrent the region after the specified number of minutes 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 warning.
## You can find all time indicators in config.yml below the RENTING header, change to '' to disable.
warningOnLoginTime: '1 day'
## The profile for the expiration warnings as specified in the config.
expirationWarningProfile: 'default'
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ BUY: Options for buy regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
buy:
## The default price of a buying region.
price: 1000
## The percentage of the buying price you get back if you sell the region.
moneyBack: 100
## Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
## -1 mean never, 1440 is one day, 43200 is one month, 525600 is one year.
inactiveTimeUntilSell: -1
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ 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
# 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: ''
##### Set the layout and functions of the signs.
# The following sections can be added for performing certain commands when the sign is clicked:
# rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
# leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole.
# Sections with 'Player' at the end will be run by the player that clicks the sign and 'Console' ones from the console.
signProfile:
forrent:
line1: '&2&l[For Rent]'
line2: '%region%'
line3: '%duration%'
line4: '%price%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-rent|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
rented:
line1: '&4&l[Rented]'
line2: '%region%'
line3: '%player%'
line4: '%untilshort%'
rightClickPlayer:
- 'areashop rent %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-extend|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-unrent|%region%|%'
forsale:
line1: '&2&l[For Sale]'
line2: '%region%'
line3: '%price%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
resell:
line1: '&9&l[Resale]'
line2: '%region%'
line3: '%resellprice%'
line4: '&8%player%'
rightClickPlayer:
- 'areashop buy %region%'
rightClickConsole:
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickPlayer:
- 'areashop stopresell %region%'
sold:
line1: '&4&l[Sold]'
line2: '%region%'
line3: '%player%'
line4:
rightClickPlayer:
- 'areashop buy %region%'
leftClickPlayer:
- 'areashop info region %region%'
shiftRightClickConsole:
- 'areashop message %clicker% %lang:confirm-sell|%region%|%'
##### Set WorldGuard regions flags depending on the region state.
# All normal region flags as present in WorldGuard can be used, in addition to 'members', 'owners', 'priority' and 'parent'.
# The members and owners flag normally take a list of UUID's separated by a comma, adding by name is possible with 'n:<name>'.
# You can add groups by using 'g:<groupname>', so an example woul be: '%uuid%, %friendsuuid%, g:vip, n:coolGuy'.
# For allow/deny flags like 'entry' and 'exit' you can set the group setting by using 'g:<scope>', <scope> is one of the following:
# members, non_members, owners, non_owners, all. Example, only members can enter the region:
# entry: 'deny g:non_members'
# '' will remove the flag from the region.
flagProfile:
ALL: # Flags that should always be applied
priority: 10
members: ''
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
build: 'deny g:non_members'
forrent:
greeting: '%lang:prefix%%lang:greeting-forrent%'
rented:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-rented%'
forsale:
greeting: '%lang:prefix%%lang:greeting-forsale%'
sold:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-bought%'
resale:
members: '%uuid%, %friendsuuid%'
greeting: '%lang:prefix%%lang:greeting-resale%'
##### Save and restore schematics to clean up regions.
# After 'save:' or 'restore:' you enter the name of the file to restore from/to (.schematic is added automatically).
# Set to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
enableRestore: false
schematicProfile:
created:
save: '%type%-%region%'
restore: ''
deleted:
save: ''
restore: '%type%-%region%'
rented:
save: '%type%-%region%'
restore: ''
unrented:
save: ''
restore: '%type%-%region%'
bought:
save: '%type%-%region%'
restore: ''
sold:
save: ''
restore: '%type%-%region%'
resell:
save: ''
restore: ''
##### Run commands when an event happens.
# Commands at a 'before' section will execute before the region details are changed in the AreaShop system
# and before any other actions occurred (setting the owner, saving/loading schematics, etc.),
# the 'after' commands will be run when all changes are done.
# You can add a list of commands to 'before' and 'after'.
eventCommandProfile:
created:
before:
after:
# - "say An AreaShop region has been created: %region%"
deleted:
before:
after:
rented:
before:
after:
extended:
before:
after:
unrented:
before:
after:
bought:
before:
after:
sold:
before:
after:
resell:
before:
after:
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
# │ RENT: Settings that apply to rent regions. │
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
rent:
# The default price of a rental region.
price: 1000
# The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
duration: '1 day'
# The percentage of the rent price you get back if you unrent the region (price of time left will be multiplied by this/100).
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.
price: 1000
# The percentage of the price you get back if you sell the region.
moneyBack: 100
# Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
# Use times like '1 day' etc, or 'disabled' for never.
inactiveTimeUntilSell: 'disabled'
@@ -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: '29 seconds'
regionsPerTick: 5
# Timings for expiration warning to online players.
expireWarning:
delay: '61 seconds'
regionsPerTick: 5
# Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
update:
regionsPerTick: 5
# Time between checking if any regions need to be unrented because the player was not online for the specified time period.
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:
+552 -413
View File
@@ -1,413 +1,552 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: German, Version: V2.2.0, Percentage translated: 100% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "Du kannst nicht mehr als %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')."
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 mit AreaShop registrierten Regionen gefunden."
cmd-noWERegionsFound: "Es wurden keine WorldEdit-Regionen gefunden, die sich mit deiner Selektion überschneiden."
cmd-notRegistered: "Die angegebene Region ist nicht eingetragen: %0%."
cmd-noRegionsAtLocation: "Keine Regionen an deiner Stelle 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: "Automatische Auswahl einer Region ist nur für Spieler möglich, gibt die Region als Argument an."
help-header: "Hilfeseite mit Befehlen, die du ausführen kannst."
help-alias: "Befehlsaliase: /areashop, /as."
help-help: "&6/as help &7-&r Zeigt diese Hilfeseite."
help-info: "&6/as info &7-&r Zeigt Informationen über die aktuellen Regionen."
help-rent: "&6/as rent &7-&r Miete eine Region oder verlängere die Mietzeit."
help-buy: "&6/as buy &7-&r Kaufe eine Region."
help-unrent: "&6/as unrent &7-&r Kündige den Mietvertrag einer Region."
help-unrentOwn: "&6/as unrent &7-&r Kündige den Mietvertrag deiner Region."
help-sell: "&6/as sell &7-&r Verkaufe eine Region."
help-sellOwn: "&6/as sell &7-&r Verkaufe deine Region."
help-reload: "&6/as reload &7-&r Lädt alle Dateien neu ein und updatet die Regionen."
help-setrestore: "&6/as setrestore &7-&r Setze Wiederherstellung an/aus und wähle Profil."
help-setprice: "&6/as setprice &7-&r Ändere den Preis einer Region."
help-setduration: "&6/as setduration &7-&r Ändere die Mietdauer einer Region."
help-teleport: "&6/as tp &7-&r Teleportiere zu deiner gekauften/gemieteten Region."
help-teleportAll: "&6/as tp &7-&r Teleportiere zu einer gekauften/gemieteten Region."
help-setteleport: "&6/as settp &7-&r Erstelle einen Teleport-Punkt für eine gekaufte/gemietete Region."
help-setteleportAll: "&6/as settp &7-&r Erstellt einen Teleportpunkt für eine Region."
help-find: "&6/as find &7-&r Finde eine Region, welche gekauft oder gemietet werden kann."
help-groupadd: "&6/as groupadd &7-&r Füge eine Region einer Gruppe hinzu."
help-groupdel: "&6/as groupdel &7-&r Entferne eine Region aus einer Gruppe."
help-grouplist: "&6/as grouplist &7-&r Zeige alle momentan existierenden Gruppen an."
help-groupinfo: "&6/as groupinfo &7-&r Zeige Informationen über eine Gruppe an."
help-schemevent: "&6/as schemevent &7-&r Starte ein Schematic-Event für eine Region."
help-add: "&6/as add &7-&r Definiere eine Region als zu verkaufen oder zu vermieten."
help-del: "&6/as del &7-&r Entferne eine Region aus AreaShop."
help-addsign: "&6/as addsign &7-&r Füge einer Region ein Schild hinzu."
help-delsign: "&6/as delsign &7-&r Lösche das Schild einer Region, welches du gerade ansiehst."
help-me: "&6/as me &7-&r Überprüfe, welche Regionen du besitzt (+Verfallsdatum)."
help-setowner: "&6/as setowner &7-&r Lege den Besitzer der Region fest oder verlängere die Mietdauer."
help-resell: "&6/as resell &7-&r Aktiviere den Weiterverkaufs-Modus für eine deiner Regionen."
help-resellAll: "&6/as resell &7-&r Aktiviere den Weiterverkaufs-Modus für eine Region."
help-stopResell: "&6/as stopresell &7-&r Stoppe den Weiterverkauf deiner Region."
help-stopResellAll: "&6/as stopresell &7-&r Stoppe den Weiterverkauf einer Region."
help-addFriend: "&6/as addfriend &7-&r Füge einen Freund zu deiner Region hinzu."
help-addFriendAll: "&6/as addfriend &7-&r Füge einen Spieler zu einer Region hinzu."
help-delFriend: "&6/as delfriend &7-&r Entferne einen Freund von deiner Region."
help-delFriendAll: "&6/as delfriend &7-&r Entferne einen Spieler von einer Region."
help-linksigns: "&6/as linksigns &7-&r Benutze Schilder Massenverlinkungsmodus"
help-stack: "&6/as stack &7-&r Erstellt mehrere Regionen und fügt sie hinzu."
rent-help: "/as rent [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
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-payError: "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
rent-rented: "Du hast %0% von %1% gemietet."
rent-extended: "Du hast die Miete verlängert von %0% bis %1%."
rent-extend: "Du kannst die Miete verlängern, indem du mit rechts noch einmal auf das Schild klickst oder den Befehl /as rent nutzt."
rent-lowMoneyExtend: "Du hast nicht genug Geld, um die Miete zu verlängern (Du hast %0%, benötigst aber %1%)."
rent-lowMoneyRent: "Du hast nicht genug Geld, um diese Region zu mieten (Du hast %0%, benötigst aber %1%)."
rent-someoneElse: "Diese Region ist bereits vermietet."
rent-notRentable: "Diese Region ist nicht mietbar."
rent-maxExtends: "Du kannst die Miete nicht verlängern (Die Miete ist maximal %0% mal verlängerbar), du kannst die Region allerdings neu mieten, sobald sie wieder zu vermieten ist."
rent-maxRentTime: "Du kannst die Mietdauer dieser Region nicht erneut verlängern. Die maximale Zeit beträgt %0% Minuten und du hast sie bereits für %1% Minuten gemietet."
rent-restrictedToWorld: "Du musst dich in der '%0%' Welt befinden, um diese Region mieten zu können (Du bist in '%1%')."
rent-restrictedToRegion: "Du musst innerhalb von '%0%' sein, um es zu mieten."
rent-expireWarning: "Deine Region %region% hat %timeleft% übrig. Gehe sicher, dass du es rechtzeitig verlängerst, wenn du sie behalten willst."
buy-help: "/as buy [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
buy-noPermission: "Du bist nicht berechtigt, eine Region zu kaufen."
buy-notBuyable: "Diese Region steht nicht zum Verkauf bereit."
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 %0% erfolgreich gekauft."
buy-successResale: "Du hast %0% erfolgreich von %1% gekauft."
buy-successSeller: "Deine Region %0% wurde an %1% für %2% verkauft."
buy-lowMoney: "Du hast nicht genug Geld, um diese Region zu kaufen. (Du hast %0% benötigst aber %1%)."
buy-yours: "Du besitzt diese Region bereits."
buy-someoneElse: "Jemand anderes hat diese Region bereits gekauft."
buy-restrictedToWorld: "Du musst in der Welt '%0%' sein, um diese Region kaufen zu können (Du befindest dich in '%1%')."
buy-restrictedToRegion: "Du musst innerhalb von '%0%' sein, um es zu kaufen."
unrent-help: "/as unrent [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
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: "Der Mietvertrag wurde gekündigt."
unrent-other: "Der Mietvertrag dieser Region wurde von %0% gekündigt."
unrent-expired: "Dein Mietvertrag von %0% ist abgelaufen."
sell-help: "/as sell [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
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: "Diese Region wurde verkauft an %0%."
sell-soldYours: "Region erfolgreich verkauft."
sell-noPermission: "Du bist nicht berechtigt, diese Region zu verkaufen."
sell-noPermissionOther: "Du bist nicht berechtigt, eine Region zu verkaufen."
reload-reloaded: "Alle Dateien wurden erfolgreich neu geladen."
reload-updateStart: "&Aktualisiere %0% Regionen mit %1% Regionen pro Sekunde."
reload-updateComplete: "&7Regionen erfolgreich aktualisiert."
reload-noPermission: "Du hast keine Berechtigungen um die Konfigurationsdateien neu zu laden."
reload-updateCommandChanged: "'/as updaterents' und '/as updatebuys' wurden entfernt, bitte benutze '/as reload' um die Regionen neu zu laden."
info-help: "/as info <all|rented|forrent|sold|forsale|player|region|nogroup>."
info-noPermission: "Du hast keine Berechtigung, Informationen über Regionen zu erhalten."
info-all-rents: "Mietbare Regionen: &7%0%."
info-all-noRents: "Es gibt momentan keine mietbaren Regionen."
info-all-buys: "Regionen zum Verkauf: &7%0%."
info-all-noBuys: "Es gibt momentan keine verkauften Regionen."
info-nogroupRents: "Miete Regionen ohne Gruppe: &7%0%."
info-nogroupBuys: "Kaufe Regionen ohne Gruppe: &7%0%."
info-nogroupNoRents: "Es gibt keine Miet-Regionen ohne eine Gruppe."
info-nogroupNoBuys: "Es gibt keine Kauf-Regionen ohne eine Gruppe."
info-rented: "Vermietete Regionen: &7%0%."
info-noRented: "Momentan sind keine Regionen vermietet."
info-unrented: "Nicht vermietete Regionen: &7%0%."
info-noUnrented: "Sämtliche Regionen sind vermietet."
info-sold: "Verkaufte Regionen: &7%0%."
info-noSold: "Es sind momentan keine Regionen verkauft."
info-forsale: "Zum Verkauf stehende Regionen: &7%0%."
info-noForsale: "Sämtliche Regionen sind verkauft."
info-playerHelp: "/as info player <Spielername>."
info-playerRents: "Von %0% gemietete Regionen: &7%1%."
info-playerNoRents: "%0% hat bisher keine Region(en) gemietet."
info-playerBuys: "Von %0% verkaufte Regionen: &7%1%."
info-playerNoBuys: "%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: "&2Informationen über %region%:"
info-regionHeaderBuy: "&2Informationen über %region%:"
info-regionRented: "&2&l►&r Gemietet von %player% bis: &7%until%."
info-regionBought: "&2&l►&r Gekauft von %player%."
info-regionReselling: "&2&l►&r Gekauft von %player%, derzeit Weiterverkauf."
info-regionExtending: "&2&l►&r Preis zum Verlängern: &7%price% für %duration%."
info-regionCanBeRented: "&2&l►&r Preis zum Mieten: &7%price% für %duration%."
info-regionCanBeBought: "&2&l►&r Kaufpreis: &7%price%."
info-regionReselPrice: "&2&l►&r Weiterverkaufspreis: &7%resellprice% (Du kannst es von %player% kaufen)."
info-regionFriends: "&2&l►&r Freunde hinzugefügt: &7%friends%."
info-regionMoneyBackBuy: "&2&l►&r Verkaufpreis: &7%moneyback% (%moneybackpercent%% des Kaufpreises)."
info-regionMoneyBackRent: "&2&l►&r Rückzahlung bei Mietkündigung: &7%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
info-regionMaxExtends: "&2&l►&r Maximale Anzahl an Mietverlängerungen: &7%maxextends% mal."
info-regionNoExtending: "&2&l►&r Miete kann nicht verlängert werden."
info-regionExtendsLeft: "&2&l►&r Verbleibende Mietverlängerungen: &7%extendsleft% von %maxextends% mal."
info-regionMaxRentTime: "&2&l►&r Miete im Voraus: &7Maximal %maxrenttime%."
info-regionNoTeleport: "&2&l►&r Teleport-Position nicht gesetzt%0%."
info-regionTeleportHint: " &7(Benutze '/as settp' für einen bessere Position)"
info-regionTeleportAt: "&2&l►&r Teleport-Punkt bei: &7(%0%, %1%, %2%, %3%, Neigung:%4%, Drehung:%5%)."
info-regionSigns: "&2&l►&r Verbundene Schilder: &7%0%."
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Zugewiesene Gruppen: &7%0%."
info-regionInactiveUnrent: "&2&l►&r Automatische Mietkündigung nach: &7%inactivetime% Inaktivität des Spielers."
info-regionInactiveSell: "&2&l►&r Automatischer Verkauf nach: &7%inactivetime% Inaktivität des Spielers."
info-regionRestrictedRegionRent: "&2&l►&r Du musst dich in der Region befinden, um sie mieten zu können."
info-regionRestrictedWorldRent: "&2&l►&r Du musst in der Welt '%world%' sein, um diese Region mieten zu können."
info-regionRestrictedRegionBuy: "&2&l►&r Du musst sich in der Region befinden, um sie kaufen zu können."
info-regionRestrictedWorldBuy: "&2&l►&r Du musst in der Welt '%world%' sein, um diese Region kaufen zu können."
info-regionRestoringRent: "&2&l►&r Die Wiederherstellung ist aktiviert. &7(Region wird bei Mietkündigung zurückgesetzt)%0%."
info-regionRestoringBuy: "&2&l►&r Die Wiederherstellung ist aktiviert. &7(Region wird beim Verkauf zurückgesetzt)%0%."
info-regionRestoringProfile: " (Profil: %0%)"
info-regionNoSign: "Für diese Region gibt es bisher kein Schild."
info-regionPriceDuration: "Preis: &7%0% pro %1%."
info-regionPrice: "Preis: &7%0%."
info-regionRestore: "Wiederherstellung aktiviert: &7%0%."
info-regionRestoreProfile: "Wiederherstellungs-Profil: &7%0%."
info-regionTPLocation: "Teleport-Adresse: &7Welt=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%."
info-regionNoTP: "Keine Teleport-Adressen vorhanden."
info-regionNotExisting: "Die angegebene Region ist nicht registriert: %0%."
setrestore-help: "/as setrestore <Region> <true|false|general> [Profil]."
setrestore-noPermission: "Du bist nicht berechtigt, die Wiederherstellungs-Einstellungen zu verändern."
setrestore-notRegistered: "Die angegebene Region ist nicht registriert: %0%."
setrestore-invalidSetting: "'%0%' ist kein gültiger Status, kann true sein, false oder general."
setrestore-success: "Wiederherstellungs-Einstellungen erfolgreich von %0% zu '%1%' geändert."
setrestore-successProfile: "Wiederherstellungs-Einstellung erfolgreich von %0% zu '%1%' und das Profil zu '%2%' geändert."
setprice-noPermission: "Du bist nicht berechtigt, den Preis einer Region zu ändern."
setprice-help: "/as setprice <Preis> [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
setprice-notRegistered: "Die angegebene Region ist nicht registriert: %0%."
setprice-wrongPrice: "'%0%' ist kein gültiger Preis."
setprice-successRent: "Preis der Region %0% geändert auf %1% von %2%."
setprice-successBuy: "Preis der Region %0% geändert auf %1%."
setduration-noPermission: "Du hast keine Berechtigung, die Mietdauer zu verändern."
setduration-help: "/as setduration <Anzahl> <Zeiteinheit> [Region], wählt automatisch die Region, in der du dich gerade befindest, wenn nichts angegeben wird."
setduration-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 %0% geändert zu '%1%'."
setup-noRegion: "Du hast in der zweiten Zeile keine Region angegeben."
setup-wrongRegion: "Die angegebene Region existiert nicht."
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-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 von %0% ist korrekt erfolgt."
setup-buySuccess: "Der Kauf von %0% ist korrekt erfolgt."
setup-noPermissionRent: "Du hast keine Berechtigungen um mietbare Regionen aufzusetzen."
setup-noPermissionBuy: "Du hast keine Berechtigungen um kaufbare Regionen aufzusetzen."
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: %0% und %1%)."
setup-blacklisted: "%0% ist auf der Blacklist und kann nicht in AreaShop eingefügt werden."
destroy-noPermissionRent: "Du hast keine Berechtigungen um eine mietbare Region zu deregistrieren. "
destroy-noPermissionBuy: "Du hast keine Berechtigungen um eine kaufbare Region zu deregistrieren. "
destroy-successRent: "%0% erfolgreich als mietbare Region abgemeldet."
destroy-successBuy: "%0% 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 fehlt die Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren."
teleport-noPermissionFriend: "Du hast keine Berechtigungen zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-noPermissionFriendSign: "Du hast keine Berechtigungen um zu dem Schild einer Region zu teleporten, in denen du als Freund hinzugefügt worden bist."
teleport-success: "Du wurdest zu %0% teleportiert."
teleport-successSign: "Du wurdest zu %0% teleportiert."
teleport-noSafe: "Keine sichere Position in %0% gefunden, kein Boden vorhanden oder maximale Anzahl an Versuchen erreicht (%1%/%2%)."
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."
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 %0% erfolgreich gesetzt."
setteleport-notInside: "Der Teleportpunkt muss sich innerhalb einer Region befinden."
setteleport-reset: "Teleport-Punkt von %0% 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: %1%, bei Suche nach max. Preis in Höhe deines Guthabens: %2%%3%."
find-successMax: "%0% Region gefunden: %1%, bei Suche nach max. Preis in Höhe von %2%%3%."
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-noRegion: "Die angegebene Region ist nicht eingetragen: %0%."
groupadd-success: "Region %0% wurde zu Gruppe '%1%' hinzugefügt, diese Gruppe hat nun %2% Mitglied(er)."
groupadd-failed: "Region %0% ist bereits Mitglied der Gruppe '%1%'."
groupadd-weSuccess: "Zu Gruppe %0% hinzugefügt: &7%1%."
groupadd-weFailed: "Ist bereits in Gruppe %0%: &7%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-noRegion: "Die angegebene Region ist nicht eingetragen: %0%."
groupdel-success: "Region %0% ist aus Gruppe '%1%' entfernt worden. Diese Gruppe hat nun %2% Mitglied(er)."
groupdel-failed: "Region %0% gehört nicht zur Gruppe '%1%'."
groupdel-weSuccess: "Entfernt aus Gruppe %0%: &7%1%."
groupdel-weFailed: "Ist nicht länger in Gruppe %0%: &7%1%."
grouplist-noPermission: "Du bist nicht berechtigt, die eingetragenen Gruppen abzurufen."
grouplist-noGroups: "Momentan sind keine Gruppen vorhanden."
grouplist-success: "Folgende Gruppen sind vorhanden: &7%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%: &7%1%."
groupinfo-noMembers: "Gruppe %0% hat keine Mitglieder."
schemevent-help: "/as schemevent <Region> <created|deleted|rented|unrented|bought|sold>."
schemevent-noRegion: "Folgende angegebene Region ist nicht eingetragen: %0%."
schemevent-wrongEvent: "Das angegebene Event '%0%' existiert nicht, bitte benutze eines der folgenden: &7%1%."
schemevent-success: "'%0%'-Event wurde erfolgreich für Region %1% 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%: &7%1%."
add-failed: "Bereits eingetragen: &7%0%."
add-blacklisted: "Auf der Blacklist: &7%0%."
add-specifyWorld: "Bei Verwendung der Konsole bitte Welt der Region eintragen."
add-incorrectWorld: "Welt '%0%' nicht gefunden, versuche es bitte noch einmal (Groß- und Kleinschreibung beachten)."
add-noRegion: "Region '%0%' existiert nicht in dieser Welt."
del-noRegion: "Die angegebene Region ist nicht registriert: %0%."
del-noPermission: "Du bist nicht berechtigt, Regionen zu entfernen."
del-success: "Entfernte Region(en): &7%0%."
del-failed: "Keine Berechtigung zum Entfernen oder nicht in AreaShop eingetragen: &7%0%."
addsign-help: "/as addsign [Region] [Profil]."
addsign-noSign: "Du schaust gerade nicht auf ein Schild."
addsign-noRegion: "Region '%0%' nicht gefunden."
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: %0% und %1%)."
addsign-couldNotDetectSign: "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region in die zweite Zeile eintragen (zwei der gefundenen Regionen: %0% und %1%)."
addsign-wrongProfile: "Das eingetragene Profil existiert nicht. Bitte benutze eines der folgenden (überprüfe config): &7%0%."
addsign-success: "Das Schild wurde hinzugefügt zu %region%."
addsign-successProfile: "Das Schild wurde zu %region% mit dem Profil %0% hinzugefügt."
addsign-alreadyRegistered: "Dieses Schild gehört zur Region %0%."
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: "Schild von Region %0% erfolgreich entfernt."
me-noPermission: "Dir fehlt die Berechtigung einzusehen, welche Regionen du besitzt."
me-notAPlayer: "Du bist kein Spieler, darum können dir keine Regionen gehören."
me-noRentRegions: "Du hast aktuell keine Regionen angemietet."
me-noBuyRegions: "Du hast aktuell keine Regionen im Besitz."
me-rentRegions: "Du hast die folgenden Regionen angemietet:"
me-buyRegions: "Du bist Eigentümer der folgenden Regionen:"
me-rentLine: "&2&l►&r %region% bis %until% &7(noch %timeleft% verbleibend)."
me-buyLine: "&2&l►&r %region%."
me-noFriendRegions: "Du wurdest noch nicht als Freund zu einer Region hinzugefügt."
me-friendRegions: "Du bist in folgenden Regionen als Freund hinzugefügt:"
me-friendLine: "&2&l►&r %region% &7(Besitzer: %player%)."
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 %region% erfolgreich geändert zu %player%, gemietet bis %until% (%timeleft% verbleibend)."
setowner-succesRentExtend: "%player% ist bereits Besitzer, Miete verlängert um '%duration%', nun gemietet bist %until% (%timeleft% verbleibend)."
setowner-succesBuy: "Besitzer von %region% erfolgreich geändert zu %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-noRegionFound: "Keine AreaShop-Region an deiner Stelle gefunden, gib die Region als Argument an."
resell-notBought: "Du kannst %region% nicht weiterverkaufen, weil sie noch nicht erworben wurde."
resell-success: "Weiterverkauf für %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."
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-noRegionFound: "Keine AreaShop-Region an deiner Stelle gefunden, gib die Region als Argument an."
stopresell-notResell: "Du kannst den Weiterverkauf von %region% nicht stoppen, weil sie bisher nicht weiterverkauft werden soll."
stopresell-success: "Weiterverkauf von %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 deiner Region hinzuzufügen."
addfriend-noPermission: "Du hast keine Berechtigung, Spieler zu einer Region hinzuzufügen."
addfriend-successOther: "%0% wurde als Freund zu Region %1% hinzugefügt."
addfriend-success: "%0% wurde als Freund zu deiner Region %1% hinzugefügt."
addfriend-alreadyAdded: "&0% wurde bereits als Freund zu dieser 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: "%0% wurde als Freund der Region %1% entfernt."
delfriend-success: "%0% wurde als Freund deiner Region %1% entfernt."
delfriend-notAdded: "%0% ist nicht als Freund dieser Region eingetragen."
delfriend-noOwner: "Du kannst keine Freunde von einer Region ohne Besitzer entfernen."
linksigns-multipleRegions: "Mehrere Regionen gefunden: &7%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. &7(Maximale Reichweite 100 Blöcke)"
linksigns-regionFound: "Region %region% wurde gefunden, mach einen Linksklick auf ein Schild um die Region mit dem Schild zu verbinden."
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 &7(Maximale Reichweite 100 Blöcke)."
linksigns-alreadyRegistered: "Dieses Schild ist bereits auf die Region %region% registriert, klicke erneut um ein anderes Schild zu wählen."
linksigns-first: "Du bist nun im Schilderverbindungsmodus."
linksigns-next: "&7Linksklicke 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].\n&7 <Menge> Nummer der Regionen, die erstellt werden.\n <Abstand> Block-Abstand zwischen den Regionen.\n <Name> Namen der Regionen (Nummer wird dahinter sein).\n <rent|buy> Macht die Regionen zu kauf- oder Mietregionen\n [Gruppe] Eine Gruppe, die zu den erstellten Regionen hinzugefügt wird.\n 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: "&7Füge %0% Regionen mit %1% Regionen pro Sekunde hinzu."
stack-addComplete: "&7Regionen erfolgreich hinzugefügt."
stack-unclearDirection: "Bitte gucke nur nach Norden, Osten, Süden oder Westen. Du guckst im Moment nach %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 %player% für %resaleprice% abgekauft werden."
update-playerNotify: "&2Es ist ein Update von AreaShop V%0% auf %1% verfügbar, lade die neuste Version hier herunter: http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/."
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: German, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|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%')."
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-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: "Diese Region ist nicht mietbar."
rent-maxExtends: "Du kannst diese Miete nicht weiter verlängern. (Zulässig sind %maxextends% Verlängerungen). Nachdem die Miete abgelaufen ist, kannst du die Region %lang:region% erneut mieten."
rent-maxRentTime: "Du kannst die Region%lang:region% nicht noch mehr im Voraus mieten. Die maximale Zeit beträgt %maxrenttime% und du hast diese Region für %timeleft% gemietet."
rent-restrictedToWorld: "Du musst dich in der Welt '%world%' befinden, um die Region %lang:region% mieten zu können (Du befindest Dich in der Welt '%0%')."
rent-restrictedToRegion: "Du musst innerhalb der Region %lang:region% sein, um diese mieten zu können."
rent-expireWarning: "Deine Region %lang:region% hat %timeleft% übrig. Beachte, dass du sie rechtzeitig verlängerst, wenn du sie behalten willst."
rent-alreadyAtFull: "Die Region %lang:region% ist bereits auf oder über der maximalen Mietzeit, Du kannst diese noch nicht verlängern."
buy-help: "/as buy [Regionname], 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: "Die Region %lang:region% ist nicht zum Kaufen verfügbar."
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."
reload-reloading: "Alle Dateien wurden neu geladen, nun werden alle Mieten überprüft und alle Regionen aktualisiert."
reload-updateStart: "[gray]Aktualisiere %0% Regionen mit %1% Regionen pro Sekunde."
reload-updateComplete: "[gray]Regionen erfolgreich aktualisiert."
reload-noPermission: "Du hast keine Berechtigungen um die Konfigurationsdateien neu zu laden."
reload-updateCommandChanged: "'/as updaterents' und '/as updatebuys' wurden entfernt, bitte benutze '/as reload' um die Regionen neu zu laden."
info-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-pagePrevious:
- " [gold][bold]◄Vorherige[/bold] "
- " hover: %lang:action|Zeige vorherige Seite|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Vorherige[/bold] "
- " hover: Das ist bereits die erste Seite."
info-pageNext:
- " [gold][bold]Nächste►[/bold]"
- " hover: %lang:action|Zeige nächste Seite|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Nächste►[/bold]"
- " hover: Das ist bereits die letzte Seite."
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-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-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-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."
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."
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 %player% für %resaleprice% abgekauft werden."
File diff suppressed because it is too large. Load diff
-413
View File
@@ -1,413 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Finnish, Version: V2.2.0, Percentage translated: 100% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "Et voi vuokrata tai ostaa yhteensä enempää kuin %0% alueen(aluetta) (sinulla on jo %1% ryhmässä '%2%')"
cmd-notValid: "Tuo komento ei ole käytettävissä, käytä '/as help' saadaksesi lisätietoja."
cmd-onlyByPlayer: "Tämän komennon voi suorittaa vain pelaaja."
cmd-weOnlyByPlayer: "Käytetään WorldEditin valintaa ainoastaan pelaajan toimesta, lisäksi erittele alueen nimi,"
cmd-noSelection: "Sinulla ei ole WorldEditin valintaa."
cmd-noRegionsFound: "Rekisteröityjä alueita ei löytynyt AreaShopista sinun valinnoillasi."
cmd-noWERegionsFound: "WorldEditin risteäviä alueita sinun valinnallasi ei löytynyt."
cmd-notRegistered: "Määritetty alue ei ole rekisteröity: %0%."
cmd-noRegionsAtLocation: "Alueita ei löytynyt sinun sijainnissasi, erittele alueen nimi."
cmd-moreRegionsAtLocation: "Enemmän kuin yksi alue on löydetty sinun sijainnissasi, erittele alueen nimi jota haluat tarkastella."
cmd-automaticRegionOnlyByPlayer: "Alueen automaattinen määrittäminen on vain mahdollinen pelaajille, erittele alueen nimi."
help-header: "Apusivu, komennot joita sinä voit suorittaa"
help-alias: "Komennon aliakset: /areashop, /as."
help-help: "&6/as help &7-&r Näyttää sinulle apusivun."
help-info: "&6/as info &7-&r Saadaksesi lisätietoa alueesta."
help-rent: "&6/as rent &7-&r Vuokrataksesi regionin tai laajentaaksesi nykyistä aluetta."
help-buy: "&6/as buy &7-&r Ostaa alueen."
help-unrent: "&6/as unrent &7-&r Lopettaa alueen vuokraamisen."
help-unrentOwn: "&6/as unrent &7-&r Lopettaa alueesi vuokraamisen."
help-sell: "&6/as sell &7-&r Myy alueen."
help-sellOwn: "&6/as sell &7-&r Myy alueesi."
help-reload: "&6/as reload &7-&r Päivittää kaikki tiedostot ja päivittää alueet."
help-setrestore: "&6/as setrestore &7-&r Asetta palauttaminen ON/OFF ja valitse profiili."
help-setprice: "&6/as setprice &7-&r Vaihda alueen hintaa."
help-setduration: "&6/as setduration &7-&r Vaihda vuokrattavan alueen vuokra-aikaa."
help-teleport: "&6/as tp &7-&r Teleporttaa sinun omistamalle/vuokraamalle alueelle."
help-teleportAll: "&6/as tp &7-&r Teleporttaa vuokrattavalle/ostettavalle alueelle."
help-setteleport: "&6/as settp &7-&r Aseta teleporttaus-paikka ostetulle/vuokratulle alueelle."
help-setteleportAll: "&6/as settp &7-&r Aseta teleporttaus-paikka alueelle."
help-find: "&6/as find &7-&r Etsi tyhjä vuokrattava tai ostettava alue."
help-groupadd: "&6/as groupadd &7-&r Lisää alue ryhmään."
help-groupdel: "&6/as groupdel &7-&r Poista alue ryhmästä."
help-grouplist: "&6/as grouplist &7-&r Näyttääksesi kaikki rekisteröidyt ryhmät."
help-groupinfo: "&6/as groupinfo &7-&r Näyttääksesi ryhmän tiedot."
help-schemevent: "&6/as schemevent &7-&r Aloittaa kaavamaisen tapahtuman alueelle."
help-add: "&6/as add &7-&r Rekisteröi alue vuokrattavaksi tai ostettavaksi."
help-del: "&6/as del &7-&r Poistaa rekisteröidyn alueen AreaShopista."
help-addsign: "&6/as addsign &7-&r Lisää kyltin jo olemassa olevalle alueelle."
help-delsign: "&6/as delsign &7-&r Poistaa kyltin jota katsot."
help-me: "&6/as me &7-&r Tarkastaaksesi mitä alueita sinulla on (+vanhentuminen)"
help-setowner: "&6/as setowner &7-&r Asettaa alueen omistajan tai pidentää alueen vuokrausta."
help-resell: "&6/as resell &7-&r Laittaa yhden sinun alueistasi jälleenmyynti tilaan."
help-resellAll: "&6/as resell &7-&r Laittaa alueen jäälleenmyynti tilaan."
help-stopResell: "&6/as stopresell &7-&r Laittaa sinun alueen takaisin myyntitilaan."
help-stopResellAll: "&6/as stopresell &7-&r Laittaa alueen takaisin myyntitilaan."
help-addFriend: "&6/as addfriend &7-&r Lisää kaveri sinun alueellesi."
help-addFriendAll: "&6/as addfriend &7-&r Lisää kaveri alueelle."
help-delFriend: "&6/as delfriend &7-&r Poista kaveri sinun alueeltasi."
help-delFriendAll: "&6/as delfriend &7-&r Poista kaveri alueelta."
help-linksigns: "&6/as linksigns &7-&r Käytä irtokylttiä yhdistämiseen."
help-stack: "&6/as stack &7-&r Luo useita alueita ja lisää ne."
rent-help: "/as rent [alueennimi], alue jolla seisot valitaan jos et käytä alueen nimeä."
rent-noPermission: "Sinulla ei ole oikeuksia alueen vuokraamiseen."
rent-maximum: "Et voi vuokrata enempää kuin %0% alueen(aluetta) (sinulla on jo %1% ryhmässä '%2%')"
rent-payError: "Jokin meni pieleen maksamisessa, kokeile myöhemmin uudestaan."
rent-rented: "Vuokrasit %0%:n %1% asti."
rent-extended: "Pidensit vuokra-aikaa %0%, joka kestää %1% asti."
rent-extend: "Voit laajentaa vuokra-aluettasi klikkaamalla oikealla hiiren napilla kylttiä uudestaan tai käyttämällä /as rent"
rent-lowMoneyExtend: "Sinulla eiole tarpeeksi rahaa laajentaaksesi vuokra-aluetta (sinulla on %0% ja tarvitset %1%)"
rent-lowMoneyRent: "Sinulla ei ole tarpeeksi rahaa vuokrata tätä alueetta (sinulla on %0% ja tarvtiset %1%)"
rent-someoneElse: "Joku muu on jo vuokraamassa tätä aluetta."
rent-notRentable: "Tuo alue ei ole saatavissa vuokraamiselle."
rent-maxExtends: "Et voi enään laajentaa tätä vuokra-aluetta (maksimi on %0% kertaa), kuitenkin vuokra-ajan päättymisen jälkeen voit vuokrata tämän uudestaan."
rent-maxRentTime: "Et voi vuokrata tätä aluetta pidemmäksi ajaksi kerrallaan, maksimi aika on %0% minuuttia ja sinulla on nyt vuokra-aikaa jäljellä %1% minuuttia."
rent-restrictedToWorld: "Sinun pitää olla '%0%' maailmassa vuokrataksesi tuon alueen (olet nyt '%1%')"
rent-restrictedToRegion: "Sinun pitää olla alueen '%0%' sisässä vuokrataksesi sen."
rent-expireWarning: "Sinun alueessa %region% on aikaa jäljellä %timeleft%, muista pidentää vuokra-aikaa jos haluat pitää sen."
buy-help: "/as buy [alueenNimi], alueen jonka päällä seisot, ostetaan jos se ei ole käytössä."
buy-noPermission: "Sinulla ei ole oikeuksia ostaa aluetta."
buy-notBuyable: "Tuo alue ei ole juuri nyt ostettavissa."
buy-maximum: "Sinä et voi ostaa enempää kuin %0% alueen(aluetta) (sinulla on jo %1% ryhmässä '%2%')"
buy-payError: "Jokun meni pieleen maksamisessa, kokeile myöhemmin uudestaan."
buy-succes: "Ostit onnistuneesti %0%."
buy-successResale: "Ostit onnistuneesti %0% pelaajalta %1%."
buy-successSeller: "Sinun alueesi %0% on myyty pelaajalle %1% hintaan %2%."
buy-lowMoney: "Sinulla ei ole tarpeeksi rahaa ostaaksesi tätä aluetta (sinulla on %0% ja tarvitset %1%)."
buy-yours: "Sinä omistat jo tuon alueen."
buy-someoneElse: "Joku muu on jo ostanut tämän alueen."
buy-restrictedToWorld: "Sinun pitää olla '%0%' maailmassa ostaaksesi tämän alueen (sinä olet '%1%' maailmassa)"
buy-restrictedToRegion: "Sinun pitää olla alueen '%0%' sisässä ostaaksesi sen."
unrent-help: "/as unrent [AlueenNimi], alue missä seisot valitaan jos et erittele alueen nimeä."
unrent-noPermission: "Sinulla ei ole oikeuksia lopettaa alueen vuokrausta keskenkaiken."
unrent-noPermissionOther: "Sinulla ei ole oikeuksia lopettaa vuokrausta toisen alueelta."
unrent-notRegistered: "Tämän alueen vuokrausta ei voi lopettaa sillä pelaaja ei ole rekisteröitynyt vuokraamiseen."
unrent-notRented: "Alueen vuokrausta ei voi lopettaa sillä se ei ole edes vuokrattuna."
unrent-unrented: "Alueesi vuokraaminen on lopetettu."
unrent-other: "Alueen vuokraaminen on lopetettu pelaajalla %0%."
unrent-expired: "Sinun vuokra alueella %0% on vanhentunut."
sell-help: "/as sell [alueenNimi], alue jolla seisot valitaan jos et erittele alueen nimeä."
sell-notRegistered: "Tätä aluetta ei voida myydä koska omistaja ei myy sitä."
sell-notBought: "Aluetta ei voi myydä koska se on jonkun toisen omaisuutta."
sell-sold: "Alue on myyty pelaajalle %0%."
sell-soldYours: "Sinun alueesi on myyty."
sell-noPermission: "Sinulla ei ole oikeuksia myydä aluetta."
sell-noPermissionOther: "Sinulla ei ole oikeuksia myydä jonkun toisen aluetta."
reload-reloaded: "Kaikki tiedostot on päivitetty onnistuneesti."
reload-updateStart: "&7Päivitetään %0% aluetta vauhdilla %1% per sekunti."
reload-updateComplete: "&7Alueiden päivitys on valmis."
reload-noPermission: "Sinulla ei ole oikeuksia päivittää config-tiedostoja."
reload-updateCommandChanged: "'/as updaterents' ja '/as updatebuys' ovat poistettu, '/as reload' päivittää alueet joten voit käyttää sitä komentoa."
info-help: "/as info <all|rented|forrent|sold|forsale|player|region|nogroup>"
info-noPermission: "Sinulla ei ole oikeuksia saada lisätietoja alueista."
info-all-rents: "Alueet jotka ovat tehty vuokrattaviksi: &7%0%."
info-all-noRents: "Vuokrattavissa olevia alueita ole."
info-all-buys: "Alueet jotka on tehty ostettaviksi: &7%0%."
info-all-noBuys: "Ostettavia alueita ei ole."
info-nogroupRents: "Vuokraa alueita ilman ryhmää: &7%0%."
info-nogroupBuys: "Osta alueita ilman ryhmää: &7%0%."
info-nogroupNoRents: "Ilman ryhmää, vuokrattavia alueita ei ole."
info-nogroupNoBuys: "Ilman ryhmää, ostettavia alueita ei ole."
info-rented: "Vuokratut alueet: &7%0%."
info-noRented: "Alueita ei ole vuokrattuna."
info-unrented: "Vuokraamattomat alueet: &7%0%."
info-noUnrented: "Kaikki alueet on vuokrattu."
info-sold: "Myydyt alueet: &7%0%."
info-noSold: "Myytyjä alueita ei ole."
info-forsale: "Alueet, jotka on myytävissä: &7%0%."
info-noForsale: "Kaikki alueet on myyty."
info-playerHelp: "/as info player <nimi>"
info-playerRents: "Alueet, jotka on vuokrannut pelaaja %0%: &7%1%."
info-playerNoRents: "%0% ei ole vuokrannut aluetta."
info-playerBuys: "Alueet, jotka on ostanut pelaaja %0%: &7%1%."
info-playerNoBuys: "%0% ei ole ostanut alueita."
info-regionHelp: "/as info region [nimi], alue jolla seisot valitaan jos et erittele nimeä."
info-regionHeaderRent: "&2Lisätiedot alueesta %region%."
info-regionHeaderBuy: "&2Lisätiedot alueesta %region%."
info-regionRented: "&2&l►&r Vuokrannut pelaaja %player%: &7%until% asti."
info-regionBought: "&2&l►&r Tämän alueen on ostanut %player%."
info-regionReselling: "&2&l►&r Tämän alueen on ostanut %player%, ja hän on jälleenmyymässä tätä."
info-regionExtending: "&2&l►&r Hinta vuokran pidentämiseen: &7%price% per %duration%."
info-regionCanBeRented: "&2&l►&r Hinta vuokraamiselle: &7%price% per %duration%."
info-regionCanBeBought: "&2&l►&r Hinta ostamiselle: &7%price%."
info-regionReselPrice: "&2&l►&r Jälleenmyynnin hinta: &7%resellprice% (voit ostaa sen pelaajalta %player%)"
info-regionFriends: "&2&l►&r Lisätty kaverit: &7%friends%."
info-regionMoneyBackBuy: "&2&l►&r Myydään takaisinmaksulla: &7%moneyback% (%moneybackpercent%% hinnasta)."
info-regionMoneyBackRent: "&2&l►&r Lopetetaan vuokraaminen takaisinmaksuun: &7%moneyback% (%moneybackpercent%% jäljellä olevasta ajasta)"
info-regionMaxExtends: "&2&l►&r Maksimi määrä pidennyksille: &7%maxextends% kerta(a)."
info-regionNoExtending: "&2&l►&r `Vuokraa ei voida pidentää."
info-regionExtendsLeft: "&2&l►&r Pidennyksiä jäljellä: &7%extendsleft% kerta(a) määrästä %maxextends%."
info-regionMaxRentTime: "&2&l►&r Etukäteen vuokrataan: &7%maxrenttime% maksimista."
info-regionNoTeleport: "&2&l►&r Teleporttaus paikkaa ei ole asetettu: %0%."
info-regionTeleportHint: "&7(käytä '/as settp' paremmalle paikalle)"
info-regionTeleportAt: "&2&l►&r Teleport asetettu: &7(%0%, %1%, %2%, %3%, pitch:%4%, yaw:%5%)."
info-regionSigns: "&2&l►&r Liitetyt kyltit: &7%0%."
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Määritetyt ryhmät: &7%0%."
info-regionInactiveUnrent: "&2&l►&r Automaattinen vuokran purkaminen: &7%inactivetime% epäaktiivisuudesta pelaajalla."
info-regionInactiveSell: "&2&l►&r Automaattinen myynti jälkeen: &7%inactivetime% epäaktiivisuudesta pelaajalla."
info-regionRestrictedRegionRent: "&2&l►&r Sinun täytyy olla alueen sisässä vuokrataksesi sen."
info-regionRestrictedWorldRent: "&2&l►&r Sinun pitää olla oikeassa maailmassa '%world%' vuokrataksesi tämän alueen."
info-regionRestrictedRegionBuy: "&2&l►&r Sinun täytyy seistä alueen sisässä ostaaksesi sen."
info-regionRestrictedWorldBuy: "&2&l►&r Sinun täytyy olla maailmassa '%world%' ostaaksesi tuon alueen."
info-regionRestoringRent: "&2&l►&r Palautus päällä &7(alue nollaantuu vuokran lopettamisen yhteydessä)%0%."
info-regionRestoringBuy: "&2&l►&r Palautus on päällä &7(alue nollaantuu myynnin jälkeen)%0%."
info-regionRestoringProfile: "(profiili: %0%)"
info-regionNoSign: "Kylttiä ei ole tehty tuolle alueelle."
info-regionPriceDuration: "Hinta: &7%0% jokaista %1% kohtaan."
info-regionPrice: "Hinta: &7%0%."
info-regionRestore: "Palautus päällä: &7%0%."
info-regionRestoreProfile: "Palautetaan profiili: &7%0%."
info-regionTPLocation: "Teleporttaus-paikka: &7Maailma=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%."
info-regionNoTP: "Teleporttaus-paikkaa ei ole asetettu."
info-regionNotExisting: "Aluetta ei ole olemassa: %0%."
setrestore-help: "/as setrestore <alue> <true|false|general> [profiili]."
setrestore-noPermission: "Sinulla ei ole oikeuksia vaihtaa palautusasetuksia."
setrestore-notRegistered: "Aluetta ei ole olemassa: %0%."
setrestore-invalidSetting: "'%0%' ei ole kelvollinen tila, pitäisi olla true, false tai general."
setrestore-success: "Onnistuneesti asetettu palautus-asetus %0% > '%1%'."
setrestore-successProfile: "Onnistuneesti asetettu palautus-asetus %0% > '%1%' ja profiili '%2%':ksi."
setprice-noPermission: "Sinulla ei ole oikeuksia vaihtaa hintaa millä alue myydään tai vuokrataan."
setprice-help: "/as set price <hinta> [alue], alue jolla seisot valitaan, jos et käytä alueen nimeä."
setprice-notRegistered: "Aluetta ei ole olemassa: %0%."
setprice-wrongPrice: "'%0%' ei ole kelvollinen hinta."
setprice-successRent: "Alueen %0% hinta vaihdettu %1% per %2%."
setprice-successBuy: "Alueen %0% hinta vaihdettu %1%."
setduration-noPermission: "Sinulla ei ole oikeuksia vaihtaa vuokran pituutta."
setduration-help: "/as setduration <määrä> <tunniste> [alue], alue jolla seisot valitaan, jos et käytä alueen nimeä."
setduration-notRegistered: "%0% aluetta ei ole tehty vuokraamiseen."
setduration-wrongAmount: "'%0%' ei ole pätevä määrä, käytä kokonaisia numeroita."
setduration-wrongFormat: "'%0%' ei ole asianmukainen aikamuoto, tarkista asiakirjat Bukkitista."
setduration-success: "Alueen %0% kesto vaihdettu '%1%'."
setup-noRegion: "Et määritellyt alueen nimeä toiselle riville."
setup-wrongRegion: "Alue, jonka määrittelit, ei ole olemassa."
setup-alreadyRentSign: "Alue, jonka määrittelit on jo lisätty AreaShoppiin vuokra-alueena, lisää kyltti käyttäen [as] ensimmäisellä rivillä tai '/as addsign'."
setup-alreadyBuySign: "Alue, jonka määrittelit on jo lisätty AreaShoppiin osto-alueena, lisää kyltti käyttäen [as] ensimmäisellä rivillä tai '/as addsign'."
setup-noDuration: "Et määrittänyt kuinka pitkäksi aikaa alueen voi vuokrata, laita tämä kolmannelle riville."
setup-wrongDuration: "Määritelty aika ei ole oikeassa muodossa, esimerkiksi: 1 day."
setup-noPrice: "Et määritellyt hintaa neljännelle riville."
setup-wrongPrice: "Et määrittänyt hintaa oikealla tavalla, käytä vain numeroita."
setup-rentSuccess: "Alueen %0% vuokraaminen on asetettu onnistuneesti."
setup-buySuccess: "Alueen %0% ostaminen on asetettu onnistuneesti."
setup-noPermissionRent: "Sinulla ei ole oikeuksia asettaa vuokrattavia alueita."
setup-noPermissionBuy: "Sinulla ei ole oikeuksia asettaa myytäviä alueita."
setup-couldNotDetect: "Löydetty moninkertaisia alueita samalla tärkeystasolla ja/tai parent/child suhteella, määritä yksi alue toiselle riville (2 aluettta jotka löydettiin: %0% ja %1%)"
setup-blacklisted: "%0% on mustalistattuna eikä sitä voi lisätä AreaShoppiin."
destroy-noPermissionRent: "Sinulla ei ole oikeuksia poistaa vuokrattavaa aluetta."
destroy-noPermissionBuy: "Sinulla ei ole oikeuksia poistaa ostettavaa aluetta."
destroy-successRent: "%0% vuokra-alue poistettu onnistuneesti."
destroy-successBuy: "%0% osto-alue poistettu onnistuneesti."
teleport-help: "/as tp <alue> [kyltti]."
teleport-noRentOrBuy: "Määritettyä aluetta ei ole rekisteröity: %0%."
teleport-noPermission: "Sinulla ei ole oikeuksia teleportata omalle alueellesi."
teleport-noPermissionOther: "Sinulla ei ole oikeuksia teleportata alueelle joka ei ole sinun omistuksessasi."
teleport-noPermissionSign: "Sinulla ei ole oikeuksia teleportata sinun alueesi kyltille."
teleport-noPermissionOtherSign: "Sinulla ei ole oikeuksia teleportata toisen alueen kyltille, jota sinä et omista."
teleport-noPermissionFriend: "Sinulla ei ole oikeuksia teleportata alueille, joilla sinä olet vain kaverina."
teleport-noPermissionFriendSign: "Sinulla ei ole oikeuksia teleportata alueiden kylteille, joilla sinä olet vain kaverina."
teleport-success: "Teleporttasit %0%:lle."
teleport-successSign: "Teleporttasit kyltille: %0%."
teleport-noSafe: "Turvallista paikkaa ei löydetty alueella %0%, ei paikkoja alueella vapaana tai maksimi yritykset ylitetty (%1%/%2%)"
teleport-blocked: "Et voi teleportata, koska paikka on alueen ulkopuolella ja sinä olet pakotettu teleporttamaan sen sisään."
setteleport-help: "/as settp [alue] [reset], alue jolla seisot valitaan, jos et määrittele alueen nimeä."
setteleport-noPermission: "Sinulla ei ole oikeuksia asettaa teleporttaus-paikkaa."
setteleport-noPermissionOther: "Sinulla ei ole oikeuksia asettaa teleporttaus-paikkaa alueelle, jota sinä et omista."
setteleport-noRentOrBuy: "Aluetta ei ole rekisteröity: %0%."
setteleport-success: "Teleporttaus-paikka %0% asetettu."
setteleport-notInside: "Teleporttaus-paikan pitää olla alueen sisällä."
setteleport-reset: "Teleporttaus-paikka alueelle %0% on resetoitu."
find-help: "/as find <buy|rent> [maksimiHinta] [ryhmä]"
find-noPermission: "Sinulla ei ole oikeuksia etsiä alueita ja teleportata niihin."
find-success: "Löydetty %0% alue: %1%, kun etsitty alueista sinun maksimi saldollasi: %2%%3%."
find-successMax: "Löydetty %0% alue: %1%, kun etsitty alueista maksimihinnalla %2%%3%."
find-wrongMaxPrice: "Määritetty maksimihinta ei ole oikea numero: %0%."
find-wrongGroup: "Määriteltyä ryhmää ei ole olemassa: %0%."
find-noneFound: "Ei %0% aluetta löydetty, kun etsittiin sinun saldosi hinnalla: %1%%2%."
find-noneFoundMax: "Ei %0% aluetta löydetty, kun etsittiin hinnalla: %1%%2%."
find-onlyInGroup: ", vain etsitty alueita ryhmällä: %0%."
groupadd-help: "/as groupadd <ryhmä> [alue], jos aluetta ei määritelty, kaikki alueet sinun WorldEdit valinnaltasi valitaan."
groupadd-noPermission: "Sinulla ei ole oikeuksia lisätä alueita ryhmille."
groupadd-noRegion: "Määritelty alue ei ole rekisteröity: %0%."
groupadd-success: "Alue %0% on lisätty ryhmään '%1%', tällä ryhmällä on nyt %2% jäsen(tä)."
groupadd-failed: "Alue %0% on jo ryhmän '%1%' osa."
groupadd-weSuccess: "Lisätty ryhmään %0%: &7%1%."
groupadd-weFailed: "Oli jo ryhmässä %0%: &7%1%."
groupdel-help: "/as groupdel <ryhmä> [alue], jos aluetta ei määritelty, kaikki alueet WorldEdit valinnaltasi käytetään."
groupdel-noPermission: "Sinulla ei ole oikeuksia poistaa alueita ryhmiltä."
groupdel-noRegion: "Määritelty alue ei ole rekisteröity: %0%."
groupdel-success: "Alue %0% on poistettu ryhmästä '%1%', tällä ryhmällä on nyt %2% jäsen(tä)."
groupdel-failed: "Alue %0% ei ole osa ryhmää '%1%'."
groupdel-weSuccess: "Poistettu ryhmä %0%: &7%1%."
groupdel-weFailed: "Eivät olleet ryhmässä %0% kuitenkin: &7%1%."
grouplist-noPermission: "Sinulla ei ole oikeuksia katsoa rekisteröityjä ryhmiä."
grouplist-noGroups: "Yhtään rekisteröityä ryhmää ei ole."
grouplist-success: "Seuraavat ryhmät ovat rekisteröityjä: &7%0%."
groupinfo-help: "/as groupinfo <ryhmä>"
groupinfo-noPermission: "Sinulla ei ole oikeuksia katsoa lisätietoja ryhmästä."
groupinfo-noGroup: "Ryhmää nimellä '%0%' ei ole olemassa, käytä /as grouplist nähdäksesi kaikki ryhmät."
groupinfo-members: "Seuraavat alueet ovat jäsenien omistamia ryhmästä %0%: &7%1%."
groupinfo-noMembers: "Ryhmässä %0% ei ole yhtään jäsentä."
schemevent-help: "/as schemevent <alue> <created|deleted|rented|unrented|bought|sold>."
schemevent-noRegion: "Määritelty alue ei ole rekisteröity: %0%."
schemevent-wrongEvent: "Määriteltyä tapahtumaa '%0%' ei ole olemassa, käytä yhtä seuraavista: &7%1%."
schemevent-success: "Tapahtuma '%0%' on onnistuneesti laukaistu alueelle %1%."
schemevent-noPermission: "Sinulla ei ole oikeuksia tehdä kaavamaisia tapahtumia."
add-help: "/as add <rent|buy> [alue] [maailma]."
add-noPermission: "Sinulla ei ole oikeuksia lisätä aluetta AreaShoppiin."
add-success: "Lisätty %0%: &7%1%."
add-failed: "On jo rekisteröitynä: &7%0%."
add-blacklisted: "Mustalistattu: &7%0%."
add-specifyWorld: "Määrittele maailma, jossa alue on kun käytät konsolia."
add-incorrectWorld: "Maailmaa '%0%' ei löydetty, kokeile uudestaan (KirjainKoko)"
add-noRegion: "Aluetta '%0%' ei ole olemassa tässä maailmassa."
del-noRegion: "Määritelty alue ei ole rekisteröity: %0%."
del-noPermission: "Sinulla ei ole oikeuksia poistaa alueita."
del-success: "Poistetut alueet: &7%0%."
del-failed: "Ei oikeuksia poistaa tai ei ole rekisteröitynä: &7%0%."
addsign-help: "/as addsign [alue] [profiili]"
addsign-noSign: "Et katso kylttiä."
addsign-noRegion: "Aluetta '%0%' ei löytynyt."
addsign-noRegions: "Aluetta ei löytynyt kyltin olinpaikassa."
addsign-couldNotDetect: "Löydettiin moninkertaisia alueita kyltin ympäriltä, määrittele alue paremmin (2 aluetta jotka löydettiin: %0% ja %1%)"
addsign-couldNotDetectSign: "Löydettiin moninkertaisia alueita kyltin ympäriltä, määrittele alue toiselle riville (2 aluetta jotka löydettiin: %0% ja %1%)"
addsign-wrongProfile: "Määriteltyä profiilia ei ole olemassa, käytä jotain seuraavista (katso configit): &7%0%."
addsign-success: "Kyltti on lisätty alueelle %region%"
addsign-successProfile: "Kyltti on lisätty alueelle %region% profiililla %0%."
addsign-alreadyRegistered: "Kyltti on jo rekisteröitynä alueelle %0%."
addsign-noPermission: "Sinulla ei ole oikeutta lisätä kylttiä."
delsign-noSign: "Et katso kylttiä."
delsign-noPermission: "Sinulla ei ole oikeuksia poistaa kylttiä."
delsign-noRegion: "Tuo kyltti ei ole AreaShopin-alueen kyltti."
delsign-success: "Kyltti on poistettu alueesta: %0%."
me-noPermission: "Sinulla ei ole oikeuksia katsoa mitä alueita omistat."
me-notAPlayer: "Sinä et ole pelaaja, joten et voi omistaa yhtään aluetta."
me-noRentRegions: "Et ole vuokrannut yhtään vuokrattavaa aluetta."
me-noBuyRegions: "Et ole ostanut yhtään ostettavaa aluetta."
me-rentRegions: "Olet vuokrannut seuraavat alueet:"
me-buyRegions: "Olet ostanut seuraavat alueet:"
me-rentLine: "&2&l►&r %region% %until% asti &7(%timeleft% jäljellä)"
me-buyLine: "&2&l►&r %region%."
me-noFriendRegions: "Sinua ei ole lisätty kaveriksi yhdellekkään alueelle."
me-friendRegions: "Sinut on lisätty kaveriksi seuraaville alueille:"
me-friendLine: "&2&l►&r %region% &7(Omistaja: %player%)"
setowner-help: "/as setowner <pelaaja> [alue], alue millä seisot valitaan jos et erittele alueen nimeä."
setowner-noPermission: "Sinulla ei ole oikeuksia asettaa alueen omistajaa."
setowner-noPermissionRent: "Sinulla ei ole oikeuksia asettaa vuokrattujen alueiden omistajia."
setowner-noPermissionBuy: "Sinulla ei ole oikeuksia asettaa ostettujen alueiden omistajaa."
setowner-notRegistered: "Alueen nimi ei ole rekisteröity, omistajaa ei voitu asettaa."
setowner-noPlayer: "Pelaajan UUID:n saaminen epäonnistui pelaajalla: %0%."
setowner-succesRent: "Alueen %region% omistajaksi asetettu onnistuneesti %player%, vuokrattu %until% asti (%timeleft% jäljellä)"
setowner-succesRentExtend: "Omistajana oli jo pelaaja %player%, vuokraa pidennetty '%duration%', nyt vuokrattuna %until% asti (%timeleft% jäljellä)"
setowner-succesBuy: "Alueen %region% omistaja vaihdettu onnistuneesti pelaajalle %player%."
resell-help: "/as resell <hinta> [alue], alue jolla seisot valitaan, jos et määrittele alueen nimeä."
resell-wrongPrice: "'%0%' ei ole pätevä hinta."
resell-notRegistered: "Aluetta ei ole rekisteröity: %0%."
resell-noRegionFound: "AreaShopin aluetta ei löydetty sijainnistasi, kokeile määrittämällä alueen nimi komentoon."
resell-notBought: "Sinä et voi jälleenmyydä aluetta %region% koska se ei ole myytynä."
resell-success: "%region% on onnistuneesti laitettu jälleenmyynti-tilaan hinnalla %resellprice%."
resell-noPermission: "Sinulla ei ole oikeuksia asettaa aluettasi jälleenmyyntitilaan."
resell-noPermissionOther: "Sinulla ei ole oikeuksia asettaa alueita jälleenmyyntitilaan."
stopresell-help: "/as stopresell [alue], alue jolla seisot valitaan, jos et määritä alueen nimeä."
stopresell-notRegistered: "Alue ei ole rekisteröity: %0%."
stopresell-noRegionFound: "AreaShopin aluetta ei löytynyt sijainnistasi, kokeile määrittämällä alueen nimi komentoon."
stopresell-notResell: "Et voi lopettaa alueen %region% jälleenmyyntiä sillä se ei ole jälleenmyynti-tilassa."
stopresell-success: "%region% on onnistuneesti laitettu takaisin myynti-tilaan."
stopresell-noPermission: "Sinulla ei ole oikeuksia asettaa sinun aluettasi takaisin myyty-tilaan."
stopresell-noPermissionOther: "Sinulla ei ole oikeuksia asettaa alueita takaisin myyty-tilaan."
addfriend-help: "/as addfriend <pelaaja> [alue], alue jolla seisot valitaan jos alueen nimeä ei ole määritelty."
addfriend-noPermissionOther: "Sinulla ei ole oikeuksia lisätä kavereita alueille, jotka eivät ole sinun."
addfriend-noPermission: "Sinulla ei ole oikeuksia lisätä kavereita sinun alueellesi."
addfriend-successOther: "%0% on lisätty kaveriksi alueelle %1%."
addfriend-success: "%0% on lisätty kaveriksi sinun alueellesi: %1%."
addfriend-alreadyAdded: "%0% on jo lisätty kaveriksi tällä alueella."
addfriend-self: "Lisäämällä omistajan alueen kaveriksi olisi järetöntä."
addfriend-noOwner: "Et voi lisätä kavereita alueelle ilman omistajaa."
addfriend-notVisited: "Sinä et voi lisätä pelaajaa %0% koska hän ei ole vielä edes käynyt serverillä."
delfriend-help: "/as delfriend <pelaaja> [alue], alue jolla seisot valitaan jos alueen nimeä ei ole määritelty."
delfriend-noPermissionOther: "Sinulla ei ole oikeuksia poistaa kavereita alueilta, jotka eivät ole sinun."
delfriend-noPermission: "Sinulla ei ole oikeutta poistaa kaveria sinun alueeltasi."
delfriend-successOther: "%0% on poistettu kavereista alueella %1%."
delfriend-success: "%0% on poistettu kavereista sinun alueelta %1%."
delfriend-notAdded: "%0% ei ole lisätty kavereihin tällä alueella."
delfriend-noOwner: "Et voi poistaa kavereita tältä alueelta ilman omistajaa."
linksigns-multipleRegions: "Löydetty moninkertaisia alueita: &7%0%."
linksigns-multipleRegionsAdvice: "Klikkaa uudemman kerran kokeillaksesi uudestaan tai käytä '/as linksigns' lopettaaksesi."
linksigns-noRegions: "AreaShopin alueita ei löydetty kursorisi suunnasta, olethan varma että alue on lisätty AreaShoppiin &7(maksimi etäisyys 100 palikkaa)"
linksigns-regionFound: "Alue %region% on löydetty, nyt osoita kylttiä ja vasen-klikkaa sitä linkataksesi sen."
linksigns-signFound: "Löydetty kyltti paikassa (%0%, %1%, %2%), nyt osoita suoraan alueelle ja oikea-klikkaa linkataksesi sen."
linksigns-noSign: "Kylttiä ei löydetty kursorisi suunnasta, olethjan varma että sinulla on suora näkyvyys kylttiin ja klikkaa uudestaan &7(maksimi etäisyys 100 palikkaa)"
linksigns-alreadyRegistered: "Tuo kyltti on jo rekisteröity alueelle %region%, klikkaa uudestaan valitaksesi toisen kyltin."
linksigns-first: "Olet nyt kylttien-linkkaus tilassa."
linksigns-next: "&7Vasen-klikkaa valitaksesi kyltin, oikea-klikkaa valitaksesi alueen, käytä /as linksigns lopettaaksesi."
linksigns-noPermission: "Sinulla ei ole oikeuksia siirtä kylttien-linkkaus tilaan."
linksigns-stopped: "Kylttien-linkkaus lopetettu."
stack-help: "/as stack <määrä> <gap> <nimi> <rent|buy> [ryhmä].\n&7 <määrä> Alueiden määrä, jotka luodaan.\n<gap> Palikoiden etäisyys alueiden välissä.\n<nimi> Alueiden nimet (numero tulee olemaan perässä)\n<rent|buy> Tee niistä vuokrattavia tai ostettavia.\n[ryhmä] Ryhmä, jolle alueet tehdään.\nAlueet luodaan siihen suuntaan johon katsot."
stack-accepted: "Aloitetaan luomaan %0% %1% aluetta %2% palikoita niiden välissä, nimet alkavat %3% ja niiden perässä on alueiden numero. %4%."
stack-addToGroup: "Luodut alueet lisätään ryhmälle '%0%'."
stack-noPermission: "Sinulla ei ole oikeuksia luoda ja lisätä alueita AreaShoppiin."
stack-wrongAmount: "'%0%' ei ole oikea määrä alueita."
stack-wrongGap: "'%0%' ei ole oikea numero numeroidessa palikoita alueiden väliseen väliin."
stack-noSelection: "Sinulla ei ole valintaa, joka osoittaa missä ensimmäinen alue pitäisi tehdä."
stack-addStart: "&7Lisätään %0% aluetta, %1% per sekunti."
stack-addComplete: "&7Alueiden lisäys valmis."
stack-unclearDirection: "Katso tarkasti pohjoiseen, itään, etelään tai länteen, tällä hetkellä havaittu %0%."
timeleft-years: "%0% vuotta"
timeleft-months: "%0% kuukautta"
timeleft-days: "%0% päivää"
timeleft-hours: "%0% tuntia"
timeleft-minutes: "%0% minuuttia"
timeleft-second: "%0% sekunti"
timeleft-seconds: "%0% sekuntia"
timeleft-ended: "Vanhentunut"
greeting-forrent: "Alueen %region% voi vuokrata hintaan %price% per %duration%."
greeting-rented: "Alueen %region% on vuokrannut pelaaja %player% %until% asti."
greeting-forsale: "Alueen %region% voi ostaa hintaan %price%."
greeting-bought: "Alueen %region% on ostanut pelaaja %player%."
greeting-resale: "Alueen %region% voi ostaa hintaan %resaleprice% pelaajalta %player%."
update-playerNotify: "&2Päivitys AreaShopista V%0% versioon %1% on saatavilla, hanki viimeisin päivitys osoitteesta http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/."
+552 -412
View File
@@ -1,412 +1,552 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: French, Version: V2.2.0, Percentage 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 (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
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%')."
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 spécifiée n'est pas enregistrée : %0%."
cmd-noRegionsAtLocation: "Aucune région trouvée à votre emplacement, spécifiez la région comme un argument."
cmd-moreRegionsAtLocation: "Plus d'une région ont été trouvées à votre emplacement, spécifiez la région comme un argument."
cmd-automaticRegionOnlyByPlayer: "Déterminer la région automatiquement est disponible uniquement pour les joueurs, spécifiez la région comme un argument."
help-header: "Page d'aide, commandes que vous pouvez exécuter."
help-alias: "Alias des commandes : /areashop, /as"
help-help: "&6/as help &7-&r Affiche la page d'aide."
help-info: "&6/as info &7-&r Obtenir les infos sur les régions actuelles."
help-rent: "&6/as rent &7-&r Louer une région, ou prolonger la location actuelle."
help-buy: "&6/as buy &7-&r Acheter une région."
help-unrent: "&6/as unrent &7-&r Dé-louer une région."
help-unrentOwn: "&6/as unrent &7-&r Dé-louer votre propre région."
help-sell: "&6/as sell &7-&r Vendre une région."
help-sellOwn: "&6/as sell &7-&r Vendre votre propre région."
help-reload: "&6/as reload &7-&r Recharge tous les fichiers et met à jour les régions."
help-setrestore: "&6/as setrestore &7-&r Activer ou désactiver la restauration et choisir le profil."
help-setprice: "&6/as setprice &7-&r Changer le prix d'une région."
help-setduration: "&6/as setduration &7-&r Changer le temps de location d'une région."
help-teleport: "&6/as tp &7-&r Téléportation vers votre région achetée / louée."
help-teleportAll: "&6/as tp &7-&r Téléportation vers une région louée / achetée."
help-setteleport: "&6/as settp &7-&r Définit la position de téléportation pour la région louée / achetée."
help-setteleportAll: "&6/as settp &7-&r Définit la position de téléportation pour une région."
help-find: "&6/as find &7-&r Trouve un achat ou une location vide."
help-groupadd: "&6/as groupadd &7-&r Ajoute une région à un groupe."
help-groupdel: "&6/as groupdel &7-&r Supprime une région d'un groupe."
help-grouplist: "&6/as grouplist &7-&r Affiche tous les groupes enregistrés."
help-groupinfo: "&6/as groupinfo &7-&r Affiche les informations d'un groupe."
help-schemevent: "&6/as schemevent &7-&r Déclenche un événement schématique d'une région."
help-add: "&6/as add &7-&r Enregistre une région comme louée ou achetée."
help-del: "&6/as del &7-&r Supprime une région enregistrée dans AreaShop."
help-addsign: "&6/as addsign &7-&r Ajoute une pancarte à une région existante."
help-delsign: "&6/as delsign &7-&r Supprime la pancarte que vous regardez."
help-me: "&6/as me &7-&r Voir les régions que vous possédez (et le temps restant)."
help-setowner: "&6/as setowner &7-&r Change le propriétaire d'une région ou allonge le temps de location."
help-resell: "&6/as resell &7-&r Mettre une de vos régions en vente."
help-resellAll: "&6/as resell &7-&r Mettre une région en vente."
help-stopResell: "&6/as stopresell &7-&r Ne plus revendre votre région."
help-stopResellAll: "&6/as stopresell &7-&r Récupérer une de vos régions."
help-addFriend: "&6/as addfriend &7-&r Ajouter un ami à votre région."
help-addFriendAll: "&6/as addfriend &7-&r Ajouter un ami à une région."
help-delFriend: "&6/as delfriend &7-&r Supprimer un ami de votre région."
help-delFriendAll: "&6/as delfriend &7-&r Supprimer un ami d'une région."
help-linksigns: "&6/as linksigns &7-&r Utilisez le mode de liaison de panneau."
help-stack: "&6/as stack &7-&r Créez plusieurs régions et ajoutez les."
rent-help: "/as rent [regionname], 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-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
rent-rented: "Vous avez loué de %0% jusqu'à %1%."
rent-extended: "Vous avez prolongé la location de %0% jusqu'à %1%."
rent-extend: "Vous pouvez prolonger votre location avec un clic droit sur la pancarte, ou en utilisant /as rent."
rent-lowMoneyExtend: "Vous n'avez pas assez d'argent pour prolonger la location (vous possédez %0% et devez payer %1%)."
rent-lowMoneyRent: "Vous n'avez pas assez d'argent pour louer cette région (vous possédez %0% et devez payer %1%)."
rent-someoneElse: "Quelqu'un d'autre loue déjà cette région."
rent-notRentable: "Cette région n'est pas disponible à la location."
rent-maxExtends: "Vous ne pouvez plus prolonger cette location (le maximum est de %0% fois). Mais lorsque la location sera terminée, vous pourrez de nouveau louer cette région."
rent-maxRentTime: "Vous ne pouvez pas louer plus longtemps à l'avance, le maximum est de %0% minutes et vous avez déjà loué pour %1% minutes."
rent-restrictedToWorld: "Vous devez être dans le monde '%0%' pour louer cette région (vous êtes dans '%1%')."
rent-restrictedToRegion: "Vous devez être dans la région '%0%' pour la louer."
rent-expireWarning: "Votre région '%region%' n'a plus que %timeleft% de temps de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
buy-help: "/as buy [regionname], 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-notBuyable: "Cette région n'est pas disponible à l'achat."
buy-maximum: "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
buy-succes: "Vous venez d'acheter la région '%0%'."
buy-successResale: "Vous venez d'acheter '%0%' à %1%."
buy-successSeller: "Votre région '%0%' a été vendue pour %1% à %2%."
buy-lowMoney: "Vous n'avez pas assez d'argent pour acheter cette région (vous possédez %0% et devez payer %1%)."
buy-yours: "Vous avez déjà acheté cette région."
buy-someoneElse: "Quelqu'un a déjà acheté cette région."
buy-restrictedToWorld: "Vous devez être dans le monde '%0%' pour acheter cette région (vous êtes dans '%1%')."
buy-restrictedToRegion: "Vous devez être dans '%0%' pour l'acheter."
unrent-help: "/as unrent [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
unrent-noPermission: "Vous n'avez pas la permission de dé-louer une région."
unrent-noPermissionOther: "Vous n'avez pas la permission de dé-louer une autre région."
unrent-notRegistered: "La région ne peut pas ne plus être louée car elle n'est pas enregistrée comme une région que l'on peut louer."
unrent-notRented: "La région ne peut pas ne plus être louée car elle n'est pas enregistrée comme actuellement louée."
unrent-unrented: "Votre région a été dé-louée."
unrent-other: "La région du joueur %0% a été dé-louée."
unrent-expired: "Votre location de '%0%' a expiré."
sell-help: "/as sell [regionname], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
sell-notRegistered: "La région ne peut pas être vendue car son statut n'est pas \"à vendre\"."
sell-notBought: "La région ne peut pas être vendue car ce n'est pas la propriété de quelqu'un."
sell-sold: "Cette région a été vendue au joueur %0%."
sell-soldYours: "Votre région a été vendue."
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."
reload-reloaded: "Tous les fichiers ont été rechargés avec succès."
reload-updateStart: "&7Met à jour %0% régions, %1% par seconde."
reload-updateComplete: "&7Mise à jour des régions terminée."
reload-noPermission: "Vous n'avez pas la permission de recharger les fichiers."
reload-updateCommandChanged: "'/as updaterents' et '/as updatebuys' ont été supprimées, '/as reload' est la commande à utiliser pour mettre à jour les régions."
info-help: "/as info <all|rented|forrent|sold|forsale|player|region|nogroup>."
info-noPermission: "Vous n'avez pas la permission d'avoir des informations à propos des régions."
info-all-rents: "Régions enregistrées en location : &7%0%"
info-all-noRents: "Il n'y a pas de régions enregistrées en location."
info-all-buys: "Régions enregistrées en vente : &7%0%"
info-all-noBuys: "Il n'y a pas de régions enregistrées en achat."
info-nogroupRents: "Régions louables sans groupe : &7%0%."
info-nogroupBuys: "Régions achetables sans groupe : &7%0%."
info-nogroupNoRents: "Il n'y a pas de régions à louer car vous n'appartenez pas à un groupe."
info-nogroupNoBuys: "Il n'y a aucune région à acheter puisque vous ne faites pas partie d'un groupe."
info-rented: "Régions louées : &7%0%"
info-noRented: "Aucune région louée."
info-unrented: "Régions non louées : &7%0%"
info-noUnrented: "Toutes les régions sont louées."
info-sold: "Régions vendues : &7%0%"
info-noSold: "Aucune région n'est vendue."
info-forsale: "Régions en vente : &7%0%"
info-noForsale: "Toutes les régions sont vendues."
info-playerHelp: "/as info player <name>"
info-playerRents: "Régions louées par %0% : &7%1%"
info-playerNoRents: "%0% n'a de régions louées."
info-playerBuys: "Régions achetées par %0% : &7%1%"
info-playerNoBuys: "%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: "&2Informations à propos de '%region%' :"
info-regionHeaderBuy: "&2Informations à propos de '%region%' :"
info-regionRented: "&2&l►&r Louée par %player% jusqu'à : &7%until%"
info-regionBought: "&2&l►&r Achetée par %player%"
info-regionReselling: "&2&l►&r Achetée par %player%, en cours de revente."
info-regionExtending: "&2&l►&r Prix pour allonger : &7%price% pour %duration%"
info-regionCanBeRented: "&2&l►&r Prix pour louer : &7%price% pour %duration%"
info-regionCanBeBought: "&2&l►&r Prix d'achat : &7%price%"
info-regionReselPrice: "&2&l►&r Prix de revente : &7%resellprice% (vous pouvez l'acheter à %player%)."
info-regionFriends: "&2&l►&r Ami(s) ajouté(s) : &7%friends%"
info-regionMoneyBackBuy: "&2&l►&r Prix de revente : &7%moneyback% (%moneybackpercent%% du prix)"
info-regionMoneyBackRent: "&2&l►&r Remboursement de location : &7%moneyback% (%moneybackpercent%% du temps restant)"
info-regionMaxExtends: "&2&l►&r Nombre maximum de région : &7%maxextends% fois."
info-regionNoExtending: "&2&l►&r La location ne peut être allongée."
info-regionExtendsLeft: "&2&l►&r Extensions restantes : &7%extendsleft% fois sur %maxextends%."
info-regionMaxRentTime: "&2&l►&r Location à l'avance : &7%maxrenttime% au maximum"
info-regionNoTeleport: "&2&l►&r Emplacement de téléportation non défini%0%."
info-regionTeleportHint: "&7(utilisez '/as settp' pour un meilleur emplacement)"
info-regionTeleportAt: "&2&l►&r Emplacement de téléportation défini à : &7(%0%, %1%, %2%, %3%, pitch:%4%, yaw:%5%)"
info-regionSigns: "&2&l►&r Pancartes connectées : &7%0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Assigné aux groupes : &7%0%"
info-regionInactiveUnrent: "&2&l►&r Fin de le location automatique après : &7%inactivetime% de temps d'inactivité du joueur"
info-regionInactiveSell: "&2&l►&r Revente automatique après : &7%inactivetime% de temps d'inactivité du joueur"
info-regionRestrictedRegionRent: "&2&l►&r Vous devez être à l'intérieur de la région pour la louer."
info-regionRestrictedWorldRent: "&2&l►&r Vous devez à l'intérieur du monde '%world%' pour louer cette région."
info-regionRestrictedRegionBuy: "&2&l►&r Vous devez être à l'intérieur de la région pour l'acheter."
info-regionRestrictedWorldBuy: "&2&l►&r Vous devez à l'intérieur du monde '%world%' pour acheter cette région."
info-regionRestoringRent: "&2&l►&r La restauration est activée &7(la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringBuy: "&2&l►&r La restauration est activée &7(la région sera remise à zéro a la fin de la location)%0%"
info-regionRestoringProfile: "(Profil : %0%)"
info-regionNoSign: "Il n'y a pas de panneau enregistré pour cette région."
info-regionPriceDuration: "Prix : &7%0% pour chaque %1%"
info-regionPrice: "Prix : &7%0%"
info-regionRestore: "Restauration activée : &7%0%"
info-regionRestoreProfile: "Profil de restauration : &7%0%"
info-regionTPLocation: "Lieu de téléportation : &7World=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%"
info-regionNoTP: "Aucun lieu de téléportation défini."
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 %0% à %1% avec succès."
setrestore-successProfile: "Paramètre de restauration défini de %0% à %1% et le profil à '%2%' 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: "Prix de la région '%0%' changé de %1% à %2%."
setprice-successBuy: "Prix de la région '%0%' changé à %1%."
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: "Temps de location de la région '%0%' changé à '%1%'."
setup-noRegion: "Vous n'avez pas spécifié de région à la seconde ligne."
setup-wrongRegion: "La région que vous avez spécifiée n'existe pas."
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 '%0%' est correctement configurée."
setup-buySuccess: "L'achat de la région '%0%' est correctement configuré."
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: %0% et %1%)."
setup-blacklisted: "%0% est sur la blacklist et ne peut pas être ajouté à AreaShop."
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: "%0% a bien été dés-enregistrée des régions louables."
destroy-successBuy: "%0% 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-success: "Vous avez été téléporté à '%0%'."
teleport-successSign: "Vous vous téléportez à la pancarte de '%0%'."
teleport-noSafe: "Aucune position sécurisée trouvée dans la région '%0%'. Pas de point restant, ou tentatives maximales dépassées (%1%/%2%)."
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."
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: "Lieu de téléportation de '%0%' défini."
setteleport-notInside: "Le lieu doit se trouver dans votre région."
setteleport-reset: "Le lieu de téléportation de '%0%' 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: "Trouvé une région %0% : %1%, en recherchant avec un prix maximum de: %2%%3%."
find-successMax: "Trouvé une région %0% : %1%, en recherchant avec un prix maximum de: %2%%3%."
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-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
groupadd-success: "La région '%0%' a été ajoutée au groupe '%1%'. Ce groupe a maintenant %2% membre(s)."
groupadd-failed: "La région '%0%' est déjà membre du groupe '%1%'."
groupadd-weSuccess: "Ajouté au groupe %0% : &7%1%."
groupadd-weFailed: "Nous étions déjà dans le groupe %0% : &7%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-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
groupdel-success: "La région '%0%' a été supprimée du groupe '%1%', ce groupe a maintenant %2% membre(s)."
groupdel-failed: "La région '%0%' n'est pas membre du groupe '%1%'."
groupdel-weSuccess: "Supprimée du groupe %0% : &7%1%."
groupdel-weFailed: "Nous ne sommes de toute façon pas dans le groupe %0% : &7%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 : &7%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% : &7%1%."
groupinfo-noMembers: "Le groupe %0% ne possède aucun membre."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
schemevent-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
schemevent-wrongEvent: "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: &7%1%."
schemevent-success: "L’événement '%0%' a été activé dans la région '%1%'."
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% : &7%1%."
add-failed: "Déjà enregistrée : &7%0%."
add-blacklisted: "Sur la blacklist : &7%0%."
add-specifyWorld: "Spécifiez le monde de la région lors de l'utilisation de la console."
add-incorrectWorld: "Le monde '%0%' est introuvable, essayez de nouveau (attention à la casse)."
add-noRegion: "La région '%0%' n'existe pas dans ce monde."
del-noRegion: "La région spécifiée n'est pas enregistrée : %0%."
del-noPermission: "Vous n'avez pas la permission de supprimer des régions."
del-success: "Régions supprimées : &7%0%."
del-failed: "Pas de permission pour supprimer, ou pas enregistrée: &7%0%."
addsign-help: "/as addsign [region] [profile]"
addsign-noSign: "Vous ne regardez pas de panneau."
addsign-noRegion: "La région '%0%' n'a pas été trouvée."
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: %0% et %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: %0% et %1%)."
addsign-wrongProfile: "Le profil spécifié n'existe pas. Utilisez un des suivants (vérifier la configuration): &7%0%."
addsign-success: "Le panneau a été ajouté à la région %region%."
addsign-successProfile: "Le panneau a été ajouté à la région %region% avec le profil %0%."
addsign-alreadyRegistered: "Ce panneau a déjà été enregistré pour la région '%0%'."
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: "Ce panneau a été supprimé de la région '%0%'."
me-noPermission: "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
me-notAPlayer: "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
me-noRentRegions: "Vous ne louez aucune région."
me-noBuyRegions: "Vous n'avez acheté aucune région."
me-rentRegions: "Vous louez les régions suivantes :"
me-buyRegions: "Vous avez acheté les régions suivantes :"
me-rentLine: "&2&l►&r %region% jusqu'au %until% &7(%timeleft% restant)"
me-buyLine: "&2&l►&r %region%"
me-noFriendRegions: "Vous n'avez été ajouté à aucune région en tant qu'ami."
me-friendRegions: "Vous avez été ajouté en tant qu'ami aux régions suivantes : "
me-friendLine: "&2&l►&r %region% &7(propriétaire : %player%)"
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 '%region%' modifié avec succès. Elle appartient maintenant à %player% et est louée jusqu'au %until% (%timeleft% restant)."
setowner-succesRentExtend: "Le propriétaire était déjà %player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)."
setowner-succesBuy: "Propriétaire de la région '%region%' changé avec succès. Elle appartient maintenant à %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-noRegionFound: "Aucune région AreaShop n'a pu être trouvée à votre emplacement, essayez de spécifier la région en argument."
resell-notBought: "Vous ne pouvez pas revendre la région '%region%', elle n'est pas encore achetée."
resell-success: "'%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-noRegionFound: "Aucune région AreaShop n'a été trouvée à votre emplacement, essayez de la spécifier en argument."
stopresell-notResell: "Vous ne pouvez pas arrêter la revente de la région '%region%' car elle n'est pas en vente."
stopresell-success: "'%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: "%0% a été ajouté en ami a la région '%1%'."
addfriend-success: "%0% a été ajouté ajouté en ami à votre région '%1%'."
addfriend-alreadyAdded: "%0% est déjà ami avec cette région."
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: "%0% a été supprimé de la liste d'amis de la région '%1%'."
delfriend-success: "%0% a été supprimé des amis de votre région '%1%'."
delfriend-notAdded: "%0% n'est pas dans les amis de cette région."
delfriend-noOwner: "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
linksigns-multipleRegions: "Plusieurs régions trouvées : &7%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 &7(portée maximale de 100 blocs)."
linksigns-regionFound: "La région %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 &7(portée maximale de 100 blocs)."
linksigns-alreadyRegistered: "Ce panneau est déjà enregistré avec la région %region%, cliquez encore pour sélectionner un autre panneau."
linksigns-first: "Vous êtes entré dans le mode de liaison d'un panneau."
linksigns-next: "&7Faites 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-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: "&7Ajout de %0% régions, %1% par seconde."
stack-addComplete: "&7Ajout de régions terminé."
stack-unclearDirection: "Merci de regarder clairement le Nord, l'Est, le Sud ou l'Ouest, actuellement détectée %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é"
greeting-forrent: "La région '%region%' peut être louée pour %price% pour une durée de %duration%."
greeting-rented: "La région '%region%' est louée par %player% jusqu'au %until%."
greeting-forsale: "La région '%region%' peut être achetée pour %price%."
greeting-bought: "La région '%region%' est la propriété de %player%."
greeting-resale: "La région '%region%' peut être achetée pour %resaleprice% à %player%."
update-playerNotify: "&2Une mise à jour d'AreaShop V%0% à %1% est disponible, téléchargez là à cette adresse : http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/."
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: French, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Utilisez %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Utilisez %0%|%"
- " command: %0%"
region: "%lang:tRégion|%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%')."
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-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"
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: "Cette région n'est pas disponible à la location."
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-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 %lang:region% n'est pas disponible à l'achat."
buy-maximum: "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
buy-payError: "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
buy-succes: "Vous avez acheté la région %lang:region%."
buy-successResale: "Vous avez 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."
reload-reloading: "Fichiers rechargés, vérification des locations et des mises à jour des régions."
reload-updateStart: "[gray]Met à jour %0% régions, %1% par seconde."
reload-updateComplete: "[gray]Mise à jour des régions terminée."
reload-noPermission: "Vous n'avez pas la permission de recharger les fichiers."
reload-updateCommandChanged: "'/as updaterents' et '/as updatebuys' ont été supprimées, '/as reload' est la commande à utiliser pour mettre à jour les régions."
info-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|Afficher la page précédente|%"
- "⇥command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Précédent[/bold] "
- " hover: C'est déjà la premier page"
info-pageNext:
- "⇥[gold][bold]Suivant►[/bold]"
- "⇥hover: %lang:action|Afficher la page suivante|%"
- "⇥command: %0%"
info-pageNoNext:
- " [darkgray][bold]Suivaznt►[/bold]"
- " hover: C'est déjà la dernière page"
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-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-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."
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-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."
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: "La région '%region%' peut être achetée pour %resaleprice% à %player%."
+374 -215
View File
@@ -1,6 +1,6 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Dutch, Version: V2.2.0, Percentage translated: 100% ║
# ║ Language: Dutch, Version: V2.4.0, Percentage translated: 100% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
@@ -8,218 +8,329 @@
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|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%')."
general-notReady: "AreaShop is not 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: "Het aangegeven gebied is niet geregistreerd: %0%."
cmd-notRegistered: "Gebied '%0%' is niet beschikbaar in AreaShop."
cmd-noRegion: "'%0%' is geen geldig WorldGuard gebied."
cmd-noRegionsAtLocation: "Geen gebieden gevonden op je lokatie, geef het gebied mee als argument."
cmd-moreRegionsAtLocation: "Meerdere gebieden gevonden op je lokatie, geef het gebied mee als argument."
cmd-automaticRegionOnlyByPlayer: "Automatisch bepalen van het gebied is alleen mogelijk voor spelers, geef het gebied mee als argument."
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: "&6/as help &7-&r Laat deze help pagina zien."
help-info: "&6/as info &7-&r Vraag informatie over gebieden op."
help-rent: "&6/as rent &7-&r Huur een gebied of verleng de huur."
help-buy: "&6/as buy &7-&r Koop een gebied."
help-unrent: "&6/as unrent &7-&r Stop de huur van een gebied."
help-unrentOwn: "&6/as unrent &7-&r Stop de huur van een eigen gebied."
help-sell: "&6/as sell &7-&r Verkoop een gebied."
help-sellOwn: "&6/as sell &7-&r Verkoop een eigen gebied."
help-reload: "&6/as reload &7-&r Herlaad bestanden en update gebieden."
help-setrestore: "&6/as setrestore &7-&r Schakel herstellen in/uit en kies het profiel."
help-setprice: "&6/as setprice &7-&r Verander de prijs van een gebied."
help-setduration: "&6/as setduration &7-&r Verander de huurtijd van een region."
help-teleport: "&6/as tp &7-&r Teleporteer naar je gekochte/gehuurde gebieden."
help-teleportAll: "&6/as tp &7-&r Teleporteer naar koop/huur gebieden."
help-setteleport: "&6/as settp &7-&r Stel de teleporteer locatie in van jouw gebieden."
help-setteleportAll: "&6/as settp &7-&r Stel een teleporteer gebied in."
help-find: "&6/as find &7-&r Zoek een leeg huur of koop gebied."
help-groupadd: "&6/as groupadd &7-&r Voeg een gebied toe aan een groep."
help-groupdel: "&6/as groupdel &7-&r Verwijder een gebied uit een groep."
help-grouplist: "&6/as grouplist &7-&r Laat een lijst met groepen zien."
help-groupinfo: "&6/as groupinfo &7-&r Laat informatie over een groep zien."
help-schemevent: "&6/as schemevent &7-&r Voer een schematic gebeurtenis uit."
help-add: "&6/as add &7-&r Registreer een huur of koop gebied."
help-del: "&6/as del &7-&r Verwijder een geregistreerd gebied."
help-addsign: "&6/as addsign &7-&r Voeg een bordje toe aan een bestaand gebied."
help-delsign: "&6/as delsign &7-&r Verwijder het bord waar je naar kijkt."
help-me: "&6/as me &7-&r Bekijk welke gebieden je hebt (+aflooptijd)."
help-setowner: "&6/as setowner &7-&r Stel gebied eigenaar in of verleng de huur."
help-resell: "&6/as resell &7-&r Zet een gebied in doorverkoop modus."
help-resellAll: "&6/as resell &7-&r Zet een gebied in doorverkoop modus."
help-stopResell: "&6/as stopresell &7-&r Stop het herverkopen van je gebied."
help-stopResellAll: "&6/as stopresell &7-&r Stop het herverkopen van een gebied."
help-addFriend: "&6/as addfriend &7-&r Voeg een vriend toe aan je gebied."
help-addFriendAll: "&6/as addfriend &7-&r Voeg een vriend toe aan een gebied."
help-delFriend: "&6/as delfriend &7-&r Verwijder een vriend van je gebied."
help-delFriendAll: "&6/as delfriend &7-&r Verwijder een vriend van een gebied."
help-linksigns: "&6/as linksigns &7-&r Gebruik massa bord koppelen mode."
help-stack: "&6/as stack &7-&r Creer meerdere gebieden en voeg ze toe."
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."
rent-help: "/as rent <gebiednaam>."
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 %0% tot %1% gehuurd."
rent-extended: "Je hebt je huur van %0% verlengt tot %1%."
rent-extend: "Je kunt je huur verlengen door opnieuw op het bordje te klikken of gebruik te maken van /as rent."
rent-lowMoneyExtend: "Je hebt niet genoeg geld om de huur te verlengen (je hebt %0% van de %1%)."
rent-lowMoneyRent: "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %1%)."
rent-someoneElse: "Iemand anders heeft dit gebied al gehuurd."
rent-rented: "Je hebt je huur van %lang:region% verlengt tot %until%, je kunt je huur verlengen door het rechtsklikken van het bord of /as rent."
rent-extended: "Je hebt je huur van %lang:region% verlengt tot %until%."
rent-extendedToMax: "Je hebt je 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: "Dat gebied is niet beschikbaar om te huren."
rent-maxExtends: "Je kunt de huur niet meer verlengen (het maximum is %0% keer), je kunt echter wel het gebied opnieuw huren als het afgelopen is."
rent-maxRentTime: "Je kunt dit huur gebied niet meer tijd van tevoren huren, de maximum tijd is %0% minuten en je hebt het al voor %1% minuten gehuurt."
rent-restrictedToWorld: "Je moet in de '%0%' wereld zijn om dit gebied te huren (je bent in '%1%')."
rent-restrictedToRegion: "Je moet in '%0%' staan om hem te huren."
rent-expireWarning: "Je gebied %region% heeft nog %timeleft% over, verleng het als je het wilt houden.."
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 <gebiednaam>."
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-notBuyable: "Dat gebied is niet beschikbaar om 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 %lang:region% is niet beschikbaar om te kopen."
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 %0% succesvol gekocht."
buy-successResale: "Je hebt %0% succesvol gekocht van %1%."
buy-successSeller: "Je gebied %0% is verkocht aan %1% voor %2%."
buy-lowMoney: "Je hebt niet genoeg geld om het gebied te kopen (je hebt %0% van de %1%)."
buy-yours: "Je hebt dit gebied al gekocht."
buy-someoneElse: "Iemand anders heeft dit gebied al gekocht."
buy-restrictedToWorld: "Je moet in de wereld '%0%' zijn om dit gebied te kopen (je ben in '%1%')."
buy-restrictedToRegion: "Je moet in '%0%' staan om hem te kopen."
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 <gebiednaam>, het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
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 je gebied is gestopt."
unrent-other: "De huur voor het gebied is gestopt voor speler %0%."
unrent-expired: "De huur van je gebied %0% is gestopt."
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 <gebiednaam>, het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
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: "Het gebied is verkocht voor speler %0%."
sell-soldYours: "Je gebied is verkocht."
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."
reload-reloaded: "Alle bestanden zijn succesvol herladen."
reload-updateStart: "&7%0% gebieden aan het updaten met %1% per seconde."
reload-updateComplete: "&7Updaten van gebieden compleet."
reload-reloading: "Alle bestanden zijn herladen, gebieden aan het checken en updaten."
reload-updateStart: "[gray]%0% gebieden aan het updaten met %1% per seconde."
reload-updateComplete: "[gray]Updaten van gebieden compleet."
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 <all|rented|forrent|sold|forsale|player|region|nogroup>."
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|% [break]"
info-noPermission: "Je hebt geen toestemming om informatie over gebieden te bekijken."
info-all-rents: "Gebieden geregistreerd voor de verhuur: %0%."
info-all-noRents: "Er zijn geen gebieden geregistreerd voor de verhuur."
info-all-buys: "Gebieden geregistreerd voor de verkoop: %0%."
info-all-noBuys: "Er zijn geen gebieden geregistreerd voor de verkoop."
info-nogroupRents: "Huur gebieden zonder groep: &7%0%."
info-nogroupBuys: "Koop gebieden zonder groep: &7%0%."
info-nogroupNoRents: "Er zijn geen huur gebieden zonder een groep."
info-nogroupNoBuys: "Er zijn geen koop gebieden zonder een groep."
info-rented: "Verhuurde gebieden: %0%."
info-noRented: "Er zijn geen verhuurde gebieden."
info-unrented: "Gebieden te huur: %0%."
info-noUnrented: "Alle gebieden zijn verhuurd."
info-sold: "Verkochte gebieden: %0%."
info-noSold: "Alle gebieden zijn verkocht."
info-forsale: "Gebieden te koop: %0%."
info-noForsale: "Alle gebieden zijn verkocht."
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: %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: %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 %0%: %1%."
info-playerNoRents: "%0% heeft geen gebied gehuurd."
info-playerBuys: "Gebieden gekocht door %0%: %1%."
info-playerNoBuys: "%0% heeft geen gebieden gekocht."
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: "&2Informatie over %region%:"
info-regionHeaderBuy: "&2Informatie over %region%:"
info-regionRented: "&2&l►&r Gehuurd door %player% tot: &7%until%."
info-regionBought: "&2&l►&r Gekocht door %player%."
info-regionReselling: "&2&l►&r Gekocht door %player%, aan het doorverkopen."
info-regionExtending: "&2&l►&r Verleng prijs: &7%price% per %duration%."
info-regionCanBeRented: "&2&l►&r Huurprijs: &7%price% per %duration%."
info-regionCanBeBought: "&2&l►&r Koopprijs: &7%price%."
info-regionReselPrice: "&2&l►&r Doorverkoop prijs: &7%resellprice% (je kunt het kopen van %player%)."
info-regionFriends: "&2&l►&r Toegevoegde vrienden: &7%friends%."
info-regionMoneyBackBuy: "&2&l►&r Verkoop terugbetaling: &7%moneyback% (%moneybackpercent%% van de prijs)."
info-regionMoneyBackRent: "&2&l►&r Huurstop geld terug: &7%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
info-regionMaxExtends: "&2&l►&r Maximaal aantal keer verlengen: &7%maxextends% keer."
info-regionNoExtending: "&2&l►&r Huurgebied kan niet verlengt worden."
info-regionExtendsLeft: "&2&l►&r Keer verlengen over: &7%extendsleft%van de %maxextends%."
info-regionMaxRentTime: "&2&l►&r Van te voren huren: &7%maxrenttime% maximum."
info-regionNoTeleport: "&2&l►&r Teleporteer lokatie niet ingesteld%0%."
info-regionTeleportHint: " &7(gebruik '/as settp' voor een betere lokatie)"
info-regionTeleportAt: "&2&l►&r Teleporteer lokatie ingesteld op: &7(%0%, %1%, %2%, %3%, helling:%4%, draaiing:%5%)."
info-regionSigns: "&2&l►&r Verbonden borden: &7%0%."
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Toegewezen groepen: &7%0%."
info-regionInactiveUnrent: "&2&l►&r Automatische huurstop na: &7%inactivetime% inactiviteit van de speler."
info-regionInactiveSell: "&2&l►&r Automatische verkoop na: &7%inactivetime% inactiviteit van de speler."
info-regionRestrictedRegionRent: "&2&l►&r Je moet in dit gebied staan om hem te huren."
info-regionRestrictedWorldRent: "&2&l►&r Je moet in de wereld '%world%' staan om dit gebied te huren."
info-regionRestrictedRegionBuy: "&2&l►&r Je moet in dit gebied staan om hem te kopen."
info-regionRestrictedWorldBuy: "&2&l►&r Je moet in de wereld '%world%' staan om dit gebied te kopen."
info-regionRestoringRent: "&2&l►&r Herstel is ingeschakeld &7(gebied zal resetten bij een huurstop)%0%."
info-regionRestoringBuy: "&2&l►&r Herstel is ingeschakeld &7(gebied zal resetten bij een verkoop)%0%."
info-regionRestoringProfile: " (profiel: %0%)"
info-regionNoSign: "Er is geen bordje geregistreerd voor dit gebied."
info-regionPriceDuration: "Prijs: %0% voor elke %1%."
info-regionPrice: "Prijs: %0%."
info-regionRestore: "Herstellen ingeschakeld: %0%."
info-regionRestoreProfile: "Herstel profiel: %0%."
info-regionTPLocation: "Teleporteer locatie: &7Wereld=%0%, X=%1%, Y=%2%, Z=%3%, Helling=%4%, Draaiing=%5%."
info-regionNoTP: "Geen teleporteer locatie ingesteld."
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: "De herstel optie van %0% is succesvol gezet naar '%1%'."
setrestore-successProfile: "Herstel instelling van %0% is succesvol gezet op '%1%' en het profiel naar '%2%'."
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 %0% is veranderd naar %1% per %2%."
setprice-successBuy: "De prijs van het gebied %0% is veranderd naar %1%."
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: "Duur van het gebied %0% veranderd naar '%1%'."
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-wrongRegion: "Het aangegeven gebied bestaat niet."
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-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 %0% is goed opgezet."
setup-buySuccess: "Kopen van gebied %0% is goed opgezet."
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 met dezelfde prioriteit en/of parent/child relatie, geeft een specifieke aan op de tweede regel (2 van de gebieden die gevonden zijn: %0% en %1%)."
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: "%0% succesvol verwijderd als huur gebied."
destroy-successBuy: "%0% succesvol verwijderd als koop gebied."
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%."
@@ -229,23 +340,25 @@ teleport-noPermissionSign: "Je hebt geen toestemming om naar het bordje van je g
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-success: "Je bent naar %0% geteleporteerd."
teleport-successSign: "Je bent geteleporteerd naar het bordje van %0%."
teleport-noSafe: "Geen veilige plek gevonden in gebied %0%, verander het gebied of stel de teleporteer positie in."
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."
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 %0% ingestelt."
setteleport-success: "Teleporteer lokatie van %lang:region% ingestelt."
setteleport-notInside: "De lokatie moet zich binnen het gebied bevinden."
setteleport-reset: "Teleporteer lokatie van %0% is gereset."
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: %1%, bij het zoeken met een maximale prijs gelijk aan je saldo: %2%%3%."
find-successMax: "Een %0% gebied is gevonden: %1%, bij het zoeken met een maximale prijs van %2%%3%."
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%."
@@ -254,78 +367,85 @@ 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-noRegion: "Het aangegeven gebied is niet geregistreerd: %0%."
groupadd-success: "Gebied %0% is toegevoegd aan groep '%1%', deze group heeft nu %2% leden."
groupadd-failed: "Gebied %0% is al toegevoegd aan groep '%1%'."
groupadd-weSuccess: "Toegevoegd aan groep %0%: &7%1%."
groupadd-weFailed: "Waren al toegevoegd aan groep %0%: &7%1%."
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-noRegion: "Het aangegeven gebied staat niet geregistreerd: %0%."
groupdel-success: "Gebied %0% is verwijderd van groep '%1%', deze groep heeft nu %2% leden."
groupdel-failed: "Gebied %0% is geen lid van groep '%1%'."
groupdel-weSuccess: "Verwijderd van groep %0%: &7%1%."
groupdel-weFailed: "Waren al niet in de groep %0%: &7%1%."
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: &7%0%."
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%: &7%1%."
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-noRegion: "Het aangegeven gebied is niet geregistreerd: %0%."
schemevent-wrongEvent: "Het aangegeven event '%0%' bestaat niet, gebruik een van de volgende: &7%1%."
schemevent-success: "Event '%0%' succesvol getriggerd voor gebied %1%."
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%: &7%1%."
add-failed: "Al geregistreerd: &7%0%."
add-blacklisted: "Op de blacklist: &7%0%."
add-success: "Toegevoegd als %0%: [gray]%1%."
add-failed: "Al geregistreerd: [gray]%0%."
add-blacklisted: "Op de blacklist: [gray]%0%."
add-specifyWorld: "Geef de wereld van het gebied aan als je het commando vanuit de console gebruikt."
add-incorrectWorld: "Wereld '%0%' niet gevonden, probeer opnieuw (hoofdlettergevoelig)."
add-noRegion: "Gebied '%0%' bestaat niet in deze wereld."
add-noPermissionRegions: "Geen toestemming om toe te voegen: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Je bent geen member/owner van deze gebieden of hebt geen toestemming om je gebieden toe te voegen."
del-noRegion: "Het aangegeven gebied is niet geregistreerd: %0%."
del-noPermission: "Je hebt geen toestemming om gebieden te verwijderen."
del-success: "Verwijderde gebieden: &7%0%."
del-failed: "Geen toestemming om te verwijderen of niet geregistreerd: &7%0%."
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-noRegion: "Gebied '%0%' kan niet gevonden worden."
addsign-noRegions: "Geen gebied gevonden op de lokatie van het bord."
addsign-couldNotDetect: "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied mee als extra argument (2 van de gevonden gebieden: %0% en %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: %0% en %1%)."
addsign-wrongProfile: "Het aangegeven profiel bestaat niet, gebruik een van de volgende (check de config): &7%0%."
addsign-success: "Het bord is toegevoegd aan %region%."
addsign-successProfile: "Het bord is toegevoegd aan %region% met profiel %0%."
addsign-alreadyRegistered: "Dat bord is al geregistreerd voor gebied %0%."
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 %0%."
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-noRentRegions: "Je hebt geen huur gebieden gehuurt."
me-noBuyRegions: "Je hebt geen koop gebieden gekocht."
me-rentRegions: "Je hebt de volgende gebieden gehuurt:"
me-buyRegions: "Je hebt de volgende gebieden gekocht:"
me-rentLine: "&2&l►&r %region% tot %until% &7(%timeleft% over)."
me-buyLine: "&2&l►&r %region%."
me-noFriendRegions: "Je bent niet aan gebieden toegevoegd als vriend."
me-friendRegions: "Je bent toegevoegd als vriend bij de volgende gebieden:"
me-friendLine: "&2&l►&r %region% &7(eigenaar: %player%)."
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."
@@ -333,33 +453,31 @@ setowner-noPermissionRent: "Je hebt geen toestemming om de eigenaar van huur geb
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 %region% succesvol veranderd naar %player%, gehuurt tot %until% (%timeleft% over)."
setowner-succesRentExtend: "Eigenaar was al %player%, huur verlengt met '%duration%', nu gehuurd tot %until% (%timeleft% over)."
setowner-succesBuy: "Eigenaar van %region% succesvol veranderd naar %player%."
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-noRegionFound: "Geen AreaShop gebied gevonden op je lokatie, geeft de naam van het gebied mee als argument."
resell-notBought: "Je kunt %region% niet doorverkopen want dit gebied is nog niet verkocht."
resell-success: "%region% is succesvol in doorverkoop mode gezet voor %resellprice%."
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."
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-noRegionFound: "Geen AreaShop gebied gevonden op je lokatie, geeft de naam van het gebied mee als argument."
stopresell-notResell: "Je kunt niet stoppen met doorverkopen van %region% want hij staat niet in doorverkoop mode."
stopresell-success: "%region% is succesvol terug gezet in verkocht mode."
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: "%0% is toegevoegd als vriend bij gebied %1%."
addfriend-success: "%0% is toegevoegd als vriend bij je gebied %1%."
addfriend-alreadyAdded: "%0% is al toegevoegd als vriend voor dit 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."
@@ -367,33 +485,76 @@ addfriend-notVisited: "Je kunt %0% niet toevoegen omdat hij de server nog niet h
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: "%0% is verwijderd als vriend van gebied %1%."
delfriend-success: "%0% is verwijderd als vriend van je gebied %1%."
delfriend-notAdded: "%0% is niet toegevoegd als vriend voor dit 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: &7%0%."
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 &7(maximaal bereik 100 blokken)."
linksigns-regionFound: "Gebied %region% is gevonden, wijs nu naar een bord en linksklik om het te koppelen."
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 &7(maximaal bereik 100 blokken)."
linksigns-alreadyRegistered: "Dat bord is al gekoppelt aan gebied %region%, klik opnieuw om een ander bord te selecteren."
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: "&7Linksklik om een bord te selecteren, rechtsklik om een gebied te selecteren, gebruik '/as linksigns' om te stoppen."
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> <gat> <naam> <rent|buy> [groep].\n&7 <aantal> Het aantal gebieden dat word aangemaakt.\n <gat> Blokken afstand tussen de gebieden.\n <naam> Naam van de gebieden (komt een nummer achter).\n <rent|buy> Maak ze huur of koop gebieden.\n [groep] Voeg de gebieden toe aan een groep.\n De gebieden zullen worden gemaakt in de richting waarnaar je kijkt."
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 nummber 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: "&7%0% gebieden aan het toevoegen met %1% per seconde."
stack-addComplete: "&7Toevoegen van gebieden voltooid."
stack-unclearDirection: "Kijk precies in het noorden, oosten, zuiden of westen, op dit moment gedetecteert: %0%."
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."
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"
@@ -409,5 +570,3 @@ 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 worden gekocht voor %resaleprice% van %player%."
update-playerNotify: "&2Update van AreaShop V%0% naar %1% beschikbaar, download de laatste versie op http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/."
+526
View File
@@ -0,0 +1,526 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Norwegian, Version: V2.4.0, Percentage translated: 94% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
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-notRentable: "Den regionen er ikke mulig å leie."
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-notBuyable: "Region %lang:region% er ikke tilgjengelig for salg."
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-reloading: "Lastet inn alle filer på nytt, sjekker leie og oppdaterer regioner."
reload-updateStart: "[gray]Oppdaterer %0% regioner på %1% per sekund."
reload-updateComplete: "[gray]Oppdatering av regioner ferdig."
reload-noPermission: "Du har ikke rettigheter til å laste inn konfigurasjonen på nytt."
reload-updateCommandChanged: "'/as updaterents' og '/as updatebuys' har blitt fjernet, '/as reload' vil også oppdatere regioner så bruk den kommandoen fremover."
info-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%."
greeting-resale: "%region% kan bli kjøpt for %resaleprice% fra %player%."
-370
View File
@@ -1,370 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Polish, Version: V2.2.0, Percentage 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 (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "Nie mozesz kupic i wynajac wiecej niz %0% regionow na raz! (aktualnie masz %1% w grupie '%2%')."
cmd-notValid: "Blad komendy, wpisz '/as help'."
cmd-onlyByPlayer: "Ta komenda jest tylko dla gracza."
cmd-weOnlyByPlayer: "Zaznaczanie terenu jest mozliwe do zrobienia tylko w grze, dodaj nazwe regionu jako dodatkowy argument."
cmd-noSelection: "Nic nie zaznaczyles."
cmd-noRegionsFound: "W twoim zaznaczeniu nie ma zadnego regionu zarejestrowanego przez plugin."
cmd-noWERegionsFound: "W twoim zaznaczeniu nie ma regionow WorldEdita."
cmd-noRegionsAtLocation: "Tu gdzie stoisz nie ma zadnego regionu, wpisz nazwe regionu jako argument."
cmd-moreRegionsAtLocation: "Tu gdzie stoisz jest wiecej niz jeden region, wpisz jego nazwe jako argument."
cmd-automaticRegionOnlyByPlayer: "Automatyczne okreslanie regionu jest mozliwe tylko bedac w grze, wpisz nazwe regionu jako kolejny argument."
help-header: "Pomoc - Kupno, Wynajem"
help-alias: "Aliasy komend: /areashop, /as."
help-help: "&6/as help &7-&r Pokazuje ta strone."
help-info: "&6/as info &7-&r Informacje na temat regionow."
help-rent: "&6/as rent &7-&r Wynajmij region lub przedluz aktualny."
help-buy: "&6/as buy &7-&r Kup region."
help-unrent: "&6/as unrent &7-&r Przestan wynajmowac region."
help-unrentOwn: "&6/as unrent &7-&r Przestan wynajmowac Twoj region."
help-sell: "&6/as sell &7-&r Sprzedaj region."
help-sellOwn: "&6/as sell &7-&r Sprzedaj swoj region."
help-reload: "&6/as reload &7-&r Przeladuj."
help-setrestore: "&6/as setrestore &7-&r Wlacza/wylacza przywracanie terenu."
help-setprice: "&6/as setprice &7-&r Zmienia cene regionu."
help-setduration: "&6/as setduration &7-&r Zmienia czas wynajmu."
help-teleport: "&6/as tp &7-&r Teleport do Twoich regionow."
help-teleportAll: "&6/as tp &7-&r Teleport do regionow."
help-setteleport: "&6/as settp &7-&r Ustaw teleport do Twojego regionu."
help-setteleportAll: "&6/as settp &7-&r Ustawia teleport do regionu."
help-find: "&6/as find &7-&r Znajduje region mozliwy do kupienia lub wynajecia."
help-groupadd: "&6/as groupadd &7-&r Dodaje region do grupy."
help-groupdel: "&6/as groupdel &7-&r Usuwa region z grupy."
help-grouplist: "&6/as grouplist &7-&r Wyswietla zarejestrowane grupy."
help-groupinfo: "&6/as groupinfo &7-&r Wyswietla informacje o grupie."
help-schemevent: "&6/as schemevent &7-&r Trigger a schematic event for a region."
help-add: "&6/as add &7-&r Zarejestruj region do kupienia albo wynajecia."
help-del: "&6/as del &7-&r Usun zarejestrowany region."
help-addsign: "&6/as addsign &7-&r Dodaje tabliczke do zarejestrowanego regionu."
help-delsign: "&6/as delsign &7-&r Usuwa tabliczke na ktora patrzysz."
help-me: "&6/as me &7-&r Pokazuje regiony, ktore posiadasz (i czas wygasniecia)."
help-setowner: "&6/as setowner &7-&r Ustawia wlasciciela regionu lub przedluza okres wynajecia."
help-resell: "&6/as resell &7-&r u."
help-resellAll: "&6/as resell &7-&r Umiesc jeden ze swoich regionow w tryb odsprzedazy."
help-stopResell: "&6/as stopresell &7-&r Umieszcza region w tryb odsprzedazy."
help-stopResellAll: "&6/as stopresell &7-&r Usuwa region z trybu odsprzedazy i ustawia mu status sprzedanego."
help-addFriend: "&6/as addfriend &7-&r Dodaj gracza do swojego regionu."
help-addFriendAll: "&6/as addfriend &7-&r Dodaje gracza do regionu."
help-delFriend: "&6/as delfriend &7-&r Usun gracza ze swojego regionu."
help-delFriendAll: "&6/as delfriend &7-&r Usuwa gracza z regionu."
help-linksigns: "&6/as linksigns &7-&r Use bulk sign linking mode."
rent-help: "/as rent [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
rent-noPermission: "Nie masz uprawnien, by wynajac region."
rent-maximum: "Nie mozesz wynajac wiecej niz %0% region(y/ow) (aktualnie wynajmujesz %1% w grupie '%2%')."
rent-payError: "Zos poszlo zle z platnascia, sprobuj pozniej."
rent-rented: "Wynajales %0% do %1%."
rent-extended: "Przedluzyles okres wynajmu %0% do %1%."
rent-extend: "Mozesz przedluzyc okres wynajmu klikajac PPM na tabliczke albo wpisujac /as rent."
rent-lowMoneyExtend: "Nie masz wystarczajacej liczby pieniedzy, zeby przedluzyc okres wynajmu (Posiadasz %0%,a potrzebujesz %1%)."
rent-lowMoneyRent: "Nie masz wystarczajacej liczby pieniedzy, by wynajac ten region (masz %0%, a potrzebujesz %1%)."
rent-someoneElse: "Ktos juz wynajal ten region."
rent-notRentable: "Ten region nie jest dostepny do wynajmu."
rent-maxExtends: "Nie mozesz juz przedluzyc okresu wynajmu (maksymalna ilosc to %0% razy), aczkolwie kiedy skonczy sie okres wynajmu mozesz wynajac ten teren znowu."
rent-maxRentTime: "Nie mozesz wiecej razy z gory wynajac tego regionu, maksymalny czas to %0% minut, a ty wynajmujesz go przez %1% minut."
rent-restrictedToWorld: "Musisz byc w swiecie '%0%' zeby wypozyczyc ten region (jestes w '%1%')."
rent-restrictedToRegion: "Musisz byc na terenie '%0%' zeby wynajac ten region."
rent-expireWarning: "Czas wynajmu %region% konczy sie. Pozostalo %timeleft%. Przedluz wynajem jesli chcesz go zatrzymac."
buy-help: "/as buy [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
buy-noPermission: "Nie masz uprawnien, zeby kupic ten region."
buy-notBuyable: "Ten region nie jest udostepiony do kupowania."
buy-maximum: "Nie mzoesz kupic wiecej niz %0% region(y/ow) (masz juz %1% w grupie '%2%')."
buy-payError: "Cos poszlo nie tak z platnosciami, sprobuj pozniej."
buy-succes: "Kupiles %0%."
buy-successResale: "Kupiles %0% od %1%."
buy-successSeller: "Sprzedales %0% do %1% za %2%."
buy-lowMoney: "Nie masz wystarczajacej ilosci pieniedzy, zby kupic ten region (masz %0%, a potrzebuejsz %1%)."
buy-yours: "Juz kupiles ten region."
buy-someoneElse: "Ktos juz kupil ten region."
buy-restrictedToWorld: "Musisz byc na swiecie: '%0%' zeby kupic ten region (jestes w '%1%')."
buy-restrictedToRegion: "Musisz byc na terenie '%0%' zeby kupic ten region."
unrent-help: "/as unrent [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
unrent-noPermission: "Nie masz uprawnien, zeby zaprzestac wynajmu regionu."
unrent-noPermissionOther: "Nie masz uprawnien, zeby usunac komus region."
unrent-unrented: "Przestales wynajmowac region."
unrent-other: "Sprawiles ze gracz %0% przestal wynajmowac ten region."
unrent-expired: "Twoj wynajem %0% zostal przedluzony."
sell-help: "/as sell [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
sell-notRegistered: "Region nie moze zostac sprzedany, poniewaz nie mozna go kupic."
sell-notBought: "Region nie moze zostac sprzedany, poniewaz nie jest niczyja wlasnoscia."
sell-sold: "Region zostal sprzedany graczu %0%."
sell-soldYours: "Twoj region zostal sprzedany."
sell-noPermission: "Nie masz uprawnien, zeby sprzedac region."
sell-noPermissionOther: "Nie masz uprawnien, by sprzedac region, ktorego nie posiadasz."
reload-reloaded: "Przeladowano wszystkie pliki."
reload-updateStart: "&7Odswiezono %0% regionow (%1%/sekunde)."
reload-updateComplete: "&7Odswiezono wszystkie regiony."
reload-noPermission: "Nie masz uprawnien, zeby przeladowac plugin."
reload-updateCommandChanged: "'/as updaterents' i '/as updatebuys' zostaly usuniete, '/as reload' tez odswieza regiony, wiec uzywaj teraz tej komendy."
info-help: "/as info <all|rented|forrent|sold|forsale|player|region|nogroup>."
info-noPermission: "Nie masz uprawnien, by uzyskac informacje na temat regionow."
info-all-rents: "Regiony do wynajecia: &7%0%."
info-all-noRents: "Aktualnie nie ma regionow do wynajecia."
info-all-buys: "Regiony do kupienia: &7%0%."
info-all-noBuys: "Nie ma regionow do kupienia."
info-nogroupRents: "Regiony bez grupy do wynajecia: &7%0%."
info-nogroupBuys: "Regiony bez grupy do wynajecia: &7%0%."
info-nogroupNoRents: "Nie ma regionow bez grupy do wynajecia."
info-nogroupNoBuys: "Nie ma regionow bez grupy do kupienia."
info-rented: "Wynajmujesz: &7%0%."
info-noRented: "Nie wynajmujesz zadnych regionow."
info-unrented: "Niewynajete regiony: &7%0%."
info-noUnrented: "Wszystkie regiony sa wynajete."
info-sold: "Sprzedane regiony: &7%0%."
info-noSold: "Nie ma sprzedanych regionow."
info-forsale: "Regiony na sprzedaz: &7%0%."
info-noForsale: "Wszystkie regiony sa sprzedane."
info-playerHelp: "/as info player <nick>."
info-playerRents: "Regiony wynajmowane przez %0%: &7%1%"
info-playerNoRents: "%0% nie wynajmuje regionow."
info-playerBuys: "Regiony kupione przez %0%: &7%1%."
info-playerNoBuys: "%0% nie kupil zadnych regionow."
info-regionHelp: "/as info region [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
info-regionHeaderRent: "&2Informacje o %region%:"
info-regionHeaderBuy: "&2Informacje o %region%:"
info-regionRented: "&2&l►&r Wynajete przez %player% do: &7%until%."
info-regionBought: "&2&l►&r Kupione przez %player%."
info-regionReselling: "&2&l►&r Kupione przez %player%, aktualnie mozliwe jest okupienie."
info-regionExtending: "&2&l►&r Cena za przedluzenie wynajmu: &7%price% z %duration%."
info-regionCanBeRented: "&2&l►&r Cena za wynajem: &7%price% za %duration%."
info-regionCanBeBought: "&2&l►&r Cena: &7%price%."
info-regionReselPrice: "&2&l►&r Cena odsprzedazy: &7%resellprice% (mozesz kupic od %player%)."
info-regionFriends: "&2&l►&r Dodani gracze: &7%friends%."
info-regionMoneyBackBuy: "&2&l►&r Zwrot pieniedzy za sprzedanie: &7%moneyback% (%moneybackpercent%% ceny kupna)."
info-regionMoneyBackRent: "&2&l►&r Zwrot pieniedzy za zakonczenie wynajmu: &7%moneyback% (%moneybackpercent%% pozostalego czasu)."
info-regionNoExtending: "&2&l►&r Wynajem nie moze zostac przedluzony."
info-regionMaxRentTime: "&2&l►&r Wynajem z gory: maksymalnie &7%maxrenttime%."
info-regionNoTeleport: "&2&l►&r Teleport do regionu nie zostal jeszcze ustawiony%0%."
info-regionTeleportHint: " &7(wpisz '/as settp' w najlepszym miejscu)"
info-regionTeleportAt: "&2&l►&r Teleport ustawiony w: &7(%0%, %1%, %2%, %3%, Wysokosc:%4%, Kierunek:%5%)."
info-regionSigns: "&2&l►&r Podlaczone tabliczki: &7%0%."
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r Przydzielone grupy: &7%0%."
info-regionInactiveUnrent: "&2&l►&r Automatyczne zaprzestanie wynajmu: &7%inactivetime% nieobecnosci gracza na serverze."
info-regionInactiveSell: "&2&l►&r Autosprzedaz po: &7%inactivetime% nieobecnosci gracza na serverze."
info-regionRestoringRent: "&2&l►&r Przywracanie jest wlaczone &7(Region bedzie resetowany po skonczeniu wynajmu)%0%."
info-regionRestoringBuy: "&2&l►&r Przywracanie jest wlaczone &7(Region bedzie resetowany po sprzedazy)%0%."
info-regionRestoringProfile: " (profil: %0%)"
info-regionNoSign: "Do tego regionu nie ma przypisanych tabliczek."
info-regionPriceDuration: "Cena: &7%0% za %1%."
info-regionPrice: "Cena: &7%0%."
info-regionRestore: "Przywracanie wlaczone: &7%0%."
info-regionRestoreProfile: "Profil przywracania: &7%0%."
info-regionTPLocation: "Lokalizacja teleportu: &7wiat=%0%, X=%1%, Y=%2%, Z=%3%, Wysokosc=%4%, Kierunek=%5%."
info-regionNoTP: "Nie ma ustawionej lokalizacji teleportu."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
setrestore-noPermission: "Nie masz uprawnien zeby zmieniac ustawienia odzyskiwania."
setrestore-invalidSetting: "'%0%' nie jest poprawnym ustawieniem, mozesz ustawic: true, false lub general."
setrestore-success: "Ustawiono ustawienia odzyskiwania %0% na '%1%'."
setrestore-successProfile: "Ustawiono ustawienia odzyskiwania %0% na '%1%' i profil na '%2%'."
setprice-noPermission: "Nie masz uprawnien, by zmienic cene regionu."
setprice-help: "/as setprice <price> [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
setprice-wrongPrice: "'%0%' nie jest poprawna cena."
setprice-successRent: "Cena %0% zmieniona na %1% per %2%."
setprice-successBuy: "Cena %0% zmieniona na %1%."
setduration-noPermission: "Nie masz uprawnien by zmienic czas wynajmu."
setduration-help: "/as setduration <amount> <identifier> [nazwa_regionu], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
setduration-wrongAmount: "'%0%' nie ejst poprawna iloscia, wpisz liczbe."
setduration-wrongFormat: "'%0%' nie jest wlasciwym formatem czasu, sprawdz dokumentacje na Bukkicie."
setduration-success: "Czas wynajmu %0% zmieniony na '%1%'."
setup-noRegion: "Nie wpisales nazwy regionu w drugiej linii."
setup-wrongRegion: "Wpisany region nie istnieje."
setup-alreadyRentSign: "Region, ktorego uzyles jest juz zarestrowany w pluginie jako mozliwy do wynajecia, dodaj tabliczki z [as] w pierwszej linii lub wpisz /as addsign."
setup-alreadyBuySign: "Region, ktorego uzyles jest juz zarestrowany w pluginie jako mozliwy do kupienia, dodaj tabliczki z [as] w pierwszej linii lub wpisz /as addsign'."
setup-noDuration: "Nie wpisales na jak dlugo wynajmuje sie region! Zrob to w trzeciej linijce."
setup-wrongDuration: "Czas, ktory wpisales nie jest poprawnym formatem. Przyklad: 1 dzien (Ustawienia w configu)."
setup-noPrice: "Nie wpisales ceny w czwartej linijce."
setup-rentSuccess: "Wynajmowanie %0% ustawione poprawnie."
setup-buySuccess: "Kupowanie %0% ustawione poprawnie."
setup-couldNotDetect: "Znaleziono kilka regionow z takim samym pierwszenstwem lub relacja rodzice/dziecko wpisz nazwe z 2 linijce (Wykryte regiony: %0% i %1%)."
setup-blacklisted: "%0% jest na czarnej liscie i nie moze zostac dodany."
teleport-help: "/as tp <region> [tabliczka]."
teleport-noPermission: "Nie masz uprawnien, by przeniesc sie na swoj region."
teleport-noPermissionOther: "Nie masz uprawnien, by przeniesc sie na region, ktorego nie posiadasz."
teleport-noPermissionSign: "Nie masz uprawnien, by przeniesc sie do tabliczki z Twoim regionem."
teleport-noPermissionOtherSign: "Nie masz uprawnien, by przesniesc sie do tabliczki z regionem, ktorego nie posiadasz."
teleport-success: "Przeteleportowano do %0%."
teleport-successSign: "Przeteleportowano do tabliczki %0%."
teleport-noSafe: "Nie ma bezpiecznej lokacji w %0%, brak pozostalych miejsc w regionie lub maksymalna ilosc prob osiagnieta (%1%/%2%)."
setteleport-help: "/as settp [nazwa_regionu] [reset], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
setteleport-noPermission: "Nie masz uprawnien, aby ustawic teleport."
setteleport-noPermissionOther: "Nie masz uprawnien, by ustawic teleport dla regionu, ktorego nie posiadasz."
setteleport-success: "Teleport dla %0% zostal ustwiony."
setteleport-notInside: "Teleport musi byc wewnatrz regionu."
setteleport-reset: "Teleport dla %0% zostal usuniety."
find-help: "/as find <buy|rent> [maksymalna cena] [grupa]."
find-noPermission: "Nie masz uprawnien do wyszukiwania regionow i teleportow do nich."
find-success: "Znaleziono %0% : %1%, podczas wyszukiwania maksymalnej ceny dla Ciebie: %2%%3%."
find-successMax: "Znaleziono %0% : %1%, podczas szukania z maksymalna cena %2%%3%."
find-wrongMaxPrice: "Wpisana maksymalna cena nie jest poprawna liczba: %0%."
find-wrongGroup: "Grupa nie istnieje: %0%."
find-noneFound: "Nie znaleziono %0% regioow, podczas wyszukiwania z maksymalna cena dla Ciebie: %1%%2%."
find-noneFoundMax: "Nie znaleziono %0% regionow podczas wyszukiwania z maksymalna cena: %1%%2%."
find-onlyInGroup: ", znaleziono tylko dla grupy: %0%."
groupadd-help: "/as groupadd <group> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
groupadd-noPermission: "Nie masz uprawnien, by dodawac regiony do grup."
groupadd-noRegion: "Region nie jest zarejestrowany: %0%."
groupadd-success: "Region %0% zostal dodany do grupy '%1%', ta grupa posiada teraz %2% czlonkow."
groupadd-failed: "Region %0% jest juz czloniek grupy '%1%'."
groupadd-weSuccess: "Dodano do grupy %0%: &7%1%."
groupadd-weFailed: "Byl juz w grupie %0%: &7%1%."
groupdel-help: "/as groupdel <group> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
groupdel-noPermission: "Nie masz uprawnien, by usunac region z grupy."
groupdel-noRegion: "Region nie jest zarejestrowany: %0%."
groupdel-success: "Region %0% zostal usuniety z grupy '%1%', ta grupa posiada teraz %2% czlonkow."
groupdel-failed: "Region %0% nie jest czlonkiem grupy '%1%'."
groupdel-weSuccess: "Usunieto z grupy %0%: &7%1%."
groupdel-weFailed: "Nie byl w grupie %0%, w kazdym razie: &7%1%."
grouplist-noPermission: "Nie masz uprawnien, zeby wyswietlac zarejestrowane grupy."
grouplist-noGroups: "Aktualnie nie ma zarejestrowanych grup."
grouplist-success: "Zarejestrowane grupy: &7%0%."
groupinfo-help: "/as groupinfo <grupa>."
groupinfo-noPermission: "Nie masz uprawnien, by wyswietlic informacje o grupie."
groupinfo-noGroup: "Nie ma grupy o nazwie '%0%', wpisz /as grouplist zeby sprawdzic grupy."
groupinfo-members: "Nastepujace regiony sa czlonkami grupy %0%: &7%1%."
groupinfo-noMembers: "Grupa %0% nie ma czlonkow."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
schemevent-noRegion: "Region nie jest zarejestrowany: %0%."
schemevent-wrongEvent: "Wydarzenie '%0%' nie istnieje, sprobuj uzyc tych: &7%1%."
schemevent-success: "Wydarzenie '%0%' zostalo przypisane do regionu %1%."
schemevent-noPermission: "Nie masz uprawnien, by przypisywac wydarzenia."
add-help: "/as add <rent|buy> [region] [swiat]."
add-noPermission: "Nie masz uprawnien, by dodawac regiony."
add-success: "Dodano jako %0%: &7%1%."
add-failed: "Juz zarejestrowano: &7%0%."
add-blacklisted: "Na czarnej liscie: &7%0%."
add-specifyWorld: "Wpisz swiat, na ktorym znajduje sie region, gdy uzywasz konsoli."
add-incorrectWorld: "Swiat '%0%' nie zostal znaleziony, sprobuj ponownie (wielkosc liter)."
add-noRegion: "Region '%0%' nie istnieje na tym swiecie."
del-noPermission: "Nie masz uprawnien, by usuwac regiony."
del-success: "Usunieto region: &7%0%."
del-failed: "Nie masz uprawnien, lub regin nie jest zarejestrowany: &7%0%."
addsign-help: "/as addsign [region] [status(profil)]."
addsign-noSign: "Nie patrzysz na tabliczke."
addsign-noRegion: "Nie znaleziono regionu '%0%."
addsign-noRegions: "Nie znaleziono regionu w poblizu tabliczki."
addsign-couldNotDetect: "W poblizu tabliczki znaleziono kilka regionow, wpisz nazwe regionu jako kolejny argument (Znalezione regiony: %0% i %1%)."
addsign-couldNotDetectSign: "W poblizu tabliczki znaleziono kilka regionow, wpisz nazwe regionu w drugiej linijce (Znalezione regiony: %0% i %1%)."
addsign-wrongProfile: "Status nie istnieje, wpisz ktorys z tych (sprawdz config - SignProfiles): &7%0%."
addsign-success: "Dodano tabliczke do %region%."
addsign-successProfile: "Dodano tabliczke do %region% ze statusem %0%."
addsign-alreadyRegistered: "Ta tabliczka jest juz przypisana do %0%."
addsign-noPermission: "Nie masz uprawnien, by dodac tabliczke."
delsign-noSign: "Nie patrzysz na tabliczke."
delsign-noPermission: "Nie masz permisji, by usunac tabliczke."
delsign-noRegion: "Ta tabliczka nie nalezy do regionu pluginu."
delsign-success: "Usunieto tabliczke z regionu %0%."
me-noPermission: "Nie masz uprawnien, by sprawdzic jakie regiony posiadasz."
me-notAPlayer: "Nie jestes graczem, wiec nie masz regionow."
me-noRentRegions: "Nie wynajmujesz zadnych regionow."
me-noBuyRegions: "Nie kupiles zadnych regionow."
me-rentRegions: "Wynajmujesz regiony:"
me-buyRegions: "Kupiles regiony:"
me-rentLine: "&2&l►&r %region% do %until% &7(pozostalo %timeleft%)."
me-buyLine: "&2&l►&r %region%."
me-friendLine: "&2&l►&r %region% &7(wlasciciel: %player%)."
setowner-help: "/as setowner <player> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
setowner-noPermission: "Nie masz uprawnien, by ustawiac wlasciciela regionu."
setowner-noPermissionRent: "Nie masz uprawnien, by ustawiac wlasciciela regionow do wynajecia."
setowner-noPermissionBuy: "Nie masz uprawnien, by ustawiac wlasciciela regionow do kupienia."
setowner-notRegistered: "Podany region nie istnieje."
setowner-noPlayer: "Wystapil problem z uzyskaniem UUi gracza: %0%."
setowner-succesRent: "Wlasciciel %region% zostal zmieniony na %player%, wynajmowanie do %until% (pozostalo %timeleft%)."
setowner-succesRentExtend: "Wlascicielem jest juz %player%, wynajecie przedluzone o '%duration%', aktualnie wynajeto do %until% (pozostalo %timeleft%)."
setowner-succesBuy: "Wlasiciel %region% zostal zmieniony na %player%."
resell-help: "/as resell <price> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
resell-wrongPrice: "'%0%' nie jest poprawna cena."
resell-noRegionFound: "Nie wykryto tutaj regionu, sprobuj wpisac nazwe jako dodatkowy argument."
resell-notBought: "Nie mozesz sprzedac %region%, poniewaz nie zostal jeszcze sprzedany."
resell-success: "%region% zostal ustawiony do odsprzedania za %resellprice%."
resell-noPermission: "Nie masz uprawnien, zeby odsprzedac Swoj region."
resell-noPermissionOther: "Nie masz uprawnien, by odsprzedawac cudze regiony."
stopresell-help: "/as stopresell [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
stopresell-noRegionFound: "Nie wykryto tutaj regionu, sprobuj wpisac nazwe jako dodatkowy argument."
stopresell-notResell: "Nie mozesz przestac odsprzedawac %region% poniewaz nie jest ustawiony jako do odsprzedania."
stopresell-success: "Przestales odsprzedawac %region%."
stopresell-noPermission: "Nie masz uprawnien, by przestac odsprzedawac region."
stopresell-noPermissionOther: "Nie masz uprawnien, by zmieniac cudze regiony na sprzedane."
addfriend-help: "/as addfriend <player> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
addfriend-noPermissionOther: "Nie masz uprawnien, by dodac graczy do regionu, ktorego nie posiadasz."
addfriend-noPermission: "Nie masz uprawnien, by dodawac graczy dos wojego regionu."
addfriend-successOther: "%0% zostal dodany do %1%."
addfriend-success: "%0% zostal dodany do %1%."
addfriend-alreadyAdded: "%0% juz jest dodany do regionu."
addfriend-self: "Dodawanie wlasciciela do regionu jest bez sensu."
addfriend-noOwner: "Nie masz uprawnien, by dodawac graczy do regionu bez wlasciciela."
addfriend-notVisited: "Nie mozesz dodac %0% poniewaz nie byl on jeszcze na serverze"
delfriend-help: "/as delfriend <player> [region], jesli nie wpiszesz nazwy uzyje regionu na ktorym stoisz."
delfriend-noPermissionOther: "Nie masz uprawnien, by usuwac graczy z nieswoich regionow."
delfriend-noPermission: "Nie masz uprawnien, by usunac gracza ze swojego regionu."
delfriend-successOther: "%0% zostal usuniety z regionu %1%."
delfriend-success: "%0% zostal usuniety z Twojego regionu %1%."
delfriend-notAdded: "%0% nie jest dodany do regionu."
delfriend-noOwner: "Nie mozesz usuwac graczy z regionu bez wlasciciela."
linksigns-multipleRegions: "Znaleziono kilka regionow: &7%0%."
linksigns-multipleRegionsAdvice: "Kliknij innym razem, by sprobowac ponownie lub uzyj '/as linksigns' by przestac."
linksigns-noRegions: "Tam gdzie patrzysz nie wykryto regionow, sprawdz czy region jest zarejestrowany &7(maksymalna odleglosc to 100 blokow)."
linksigns-regionFound: "Region %region% zostal znaleziony, teraz kliknij LPM na tabliczke."
linksigns-signFound: "Znaleziono tabliczke (%0%, %1%, %2%), teraz popatrz na region i kliknij PPM"
linksigns-noSign: "Tam, gdzie patrzysz nie znaleziono tabliczek, sprawdz czy patrzysz w dobrym kierunku &7(maksymalna odleglosc to 100 blokow)."
linksigns-alreadyRegistered: "Ta tabliczka jest juz zarejestrowana do regionu %region%, kliknij znowu zeby ustawic inna tabliczke."
linksigns-first: "Wszedles w trym podlaczania tabliczek."
linksigns-next: "&7Lewy przycisk, by zaznaczyc tabliczke, prawy przycisk, by zaznaczyc region, uzyj /as linksigns by wylaczyc tryb."
linksigns-noPermission: "Nie masz uprawnien, by wlaczyc tryb podlaczania tabliczek."
linksigns-stopped: "Wyszedles z trybu."
timeleft-years: "%0% lat"
timeleft-months: "%0% miesiecy"
timeleft-days: "%0% dni"
timeleft-hours: "%0% godzin"
timeleft-minutes: "%0% minut"
timeleft-second: "%0% sekunda"
timeleft-seconds: "%0% sekund"
timeleft-ended: "Uplynal"
greeting-forrent: "%region% moze zostac wynajety za %price% na %duration%."
greeting-rented: "%region% jest wynajmowany przez %player% do %until%."
greeting-forsale: "%region% moze zostac kupiony za %price%."
greeting-bought: "%region% nalezy do %player%."
greeting-resale: "%region% moze zostac odkupiony za %resaleprice% od %player%."
update-playerNotify: "&2Mozliwa jest aktualizacja AreaShop z V%0% do %1%, najnowsza wersja: http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/."
+552
View File
@@ -0,0 +1,552 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Russian, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Используй %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Используй %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Регион %0%"
- " hover: %lang:action|Информация о регионе|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Игрок %0%"
- " hover: %lang:action|Регионы %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Владелец %landlord%"
- " hover: %lang:action|Регионы %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "Вы не можете арендовать или купить больше, чем %0% регион(ов) (у вас уже имеется %1% в группе '%2%')."
general-notReady: "Плагин AreaShop еще не полностью загружен. Пожалуйста, подождите..."
general-noWorld: "Вы не можете сделать это, мир для %lang:region% не доступен (мир '%world%')."
general-noRegion: "Вы не можете сделать это, WorldGuard регион не доступен (регион %lang:region%)."
general-noEconomy: "На сервере нету плагина Экономии, либо он установлен некорректно. Оповестите администратора сервера об этом."
general-cancelled: "%0%"
cmd-notValid: "Ошибка в команде, используй '/as help' для получения дополнительной информации."
cmd-onlyByPlayer: "Эта команда может быть применена только игроком. "
cmd-weOnlyByPlayer: "Использование выделения доступно только для игроков, укажите название региона в качестве дополнительного аргумента."
cmd-noSelection: "Вы не имеете WorldEdit выделения."
cmd-noRegionsFound: "В выбранной области не найдено регионов, зарегистрированных в AreaShop."
cmd-noWERegionsFound: "Внутри вашего выделения не обнаружено регионов."
cmd-noRegionsAtLocation: "В вашем местоположении не найдено регионов, укажите регион в качестве аргумента."
cmd-moreRegionsAtLocation: "В вашем местоположении найдено несколько регионов, укажите название региона для уточнения."
cmd-automaticRegionOnlyByPlayer: "Автоматическое определение региона доступно только для игроков, укажите регион в качестве аргумента."
help-header: "Страница помощи. Команды которые Вам доступны."
help-noPermission: "У вас нет разрешения для просмотра страницы помощи."
help-alias: "Альтернативные команды: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Показать эту страницу помощи."
help-info: "%lang:helpCommand|/as info|% Получить информацию о текущих регионах."
help-rent: "%lang:helpCommand|/as rent|% Арендовать регион или расширить свою текущую аренду."
help-buy: "%lang:helpCommand|/as buy|% Купить регион."
help-unrent: "%lang:helpCommand|/as unrent|% Отказаться от аренды региона."
help-sell: "%lang:helpCommand|/as sell|% Продать регион."
help-reload: "%lang:helpCommand|/as reload|% Перезагрузить все файлы и обновить регионы."
help-setrestore: "%lang:helpCommand|/as setrestore|% Включить/выключить восстановление и выбрать профиль."
help-setprice: "%lang:helpCommand|/as setprice|% Изменить стоимость региона."
help-setduration: "%lang:helpCommand|/as setduration|% Изменить длительность аренды."
help-teleport: "%lang:helpCommand|/as tp|% Телепортироваться к вашему купленному/арендованному региону."
help-setteleport: "%lang:helpCommand|/as settp|% Установить точку телепортации для региона."
help-find: "%lang:helpCommand|/as find|% Найти свободный регион для покупки или аренды."
help-groupadd: "%lang:helpCommand|/as groupadd|% Добавить регион в группу."
help-groupdel: "%lang:helpCommand|/as groupdel|% Удалить регион из группы."
help-grouplist: "%lang:helpCommand|/as grouplist|% Показать все доступные группы."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Показать информацию о группе."
help-schemevent: "%lang:helpCommand|/as schemevent|% Вызвать схематическое событие для региона."
help-add: "%lang:helpCommand|/as add|% Зарегистрировать регион для аренды или покупки."
help-del: "%lang:helpCommand|/as del|% Удалить зарегистрированный регион из AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Добавить табличку для региона."
help-delsign: "%lang:helpCommand|/as delsign|% Удалить табличку на которую вы смотрите."
help-me: "%lang:helpCommand|/as me|% Проверить список своих регионов(+истечение аренды)."
help-setowner: "%lang:helpCommand|/as setowner|% Установить владельца региона или расширить аренду."
help-resell: "%lang:helpCommand|/as resell|% Установить один из Ваших регионов в режим перепродажи."
help-stopResell: "%lang:helpCommand|/as stopresell|% Установить Ваш регион обратно в режим продано."
help-addFriend: "%lang:helpCommand|/as addfriend|% Добавить друга в ваш регион."
help-delFriend: "%lang:helpCommand|/as delfriend|% Удалить друга из вашего региона."
help-linksigns: "%lang:helpCommand|/as linksigns|% Используй, чтобы включить режим привязки табличек."
help-stack: "%lang:helpCommand|/as stack|% Создание нескольких регионов и добавлением их."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Установить землевладельца в регион."
rent-help: "/as rent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
rent-noPermission: "У вас не прав для аренды данного региона."
rent-maximum: "Вы не можете арендовать более %0% региона(ов) (у вас уже есть %1% в группе '%2%')."
rent-maximumExtend: "Вы не можете продлить эту аренду, потому что у вас есть более чем %0% регион(ов) (у вас имеется %1% в группе '%2%')."
rent-payError: "Что-то пошло не так с оплатой, повторите попытку позже."
rent-rented: "Вы арендовали %lang:region% до %until%, вы можете увеличить срок аренды еще раз нажав на табличку или использовать команду /as rent."
rent-extended: "Вы продлили свою аренду %lang:region% до %until%."
rent-extendedToMax: "Вы не можете арендовать регион %lang:region% до %until% (максимальное время аренды %maxrenttime%)."
rent-lowMoneyExtend: "У вас не достаточно денег для продления аренды (у вас %0%, а необходимо %price%)."
rent-lowMoneyRent: "У вас не хватает денег для аренды %lang:region% (у вас %0%, а необходимо %price%)."
rent-someoneElse: "Кто-то уже арендует регион %lang:region%."
rent-notRentable: "Этот регион не доступен для аренды."
rent-maxExtends: "Вы не можете продлить аренду на столько (максимум %maxextends%), однако после того как закончится срок аренды вы можете арендовать %lang:region% снова."
rent-maxRentTime: "Вы не можете арендовать %lang:region% на такой период, максимальное время аренды %maxrenttime%, вы пытаетесь арендовать на %timeleft%."
rent-restrictedToWorld: "Вы должны быть в мире '%world%', чтобы арендовать %lang:region% (вы находитесь в '%0%')."
rent-restrictedToRegion: "Вы должны находиться внутри %lang:region% для его аренды."
rent-expireWarning: "В вашем регионе %lang:region% закончится арендный срок %timeleft%, вы должны продлить аренду для его сохранения."
rent-alreadyAtFull: "%lang:region% уже на уровне или выше максимального времени аренды, вы не можете продлить его еще.."
buy-help: "/as buy [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
buy-noPermission: "У Вас нет прав для покупки региона."
buy-noPermissionResell: "У Вас нет прав для покупки региона в режиме перепродажи."
buy-noPermissionNoResell: "У Вас нет прав для покупки региона, который не находится в режиме перепродажи."
buy-notBuyable: "Регион %lang:region% не доступен для покупки."
buy-maximum: "Вы не можете купить более %0% региона(ов) (у Вас уже имеется %1% в группе '%2%')"
buy-payError: "Что-то пошло не так с оплатой, повторите попытку позже."
buy-succes: "Вы успешно купили %lang:region%."
buy-successResale: "Вы успешно купили %lang:region% в %lang:tPlayer|%0%|%."
buy-successSeller: "Ваш регион %lang:region% был продан %lang:player% за %0%."
buy-lowMoney: "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %price%)."
buy-lowMoneyResell: "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %resellprice%)."
buy-yours: "Вы уже владелец %lang:region%."
buy-someoneElse: "Кто-то уже купил %lang:region%."
buy-restrictedToWorld: "Вы должны быть в мире '%world%', чтобы купить %lang:region% (вы находитесь в '%0%')."
buy-restrictedToRegion: "Вы должны находиться внутри %lang:region% для его покупки."
unrent-help: "/as unrent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
unrent-noPermission: "У вас нет разрешения на снятие аренды в регионе."
unrent-noPermissionOther: "У вас нет разрешения на снятие аренды в другом регионе."
unrent-notRegistered: "В регионе недоступно снятие аренды, потому что он не зарегистрирован для сдачи в аренду."
unrent-notRented: "В регионе нельзя снять аренду, потому что он не арендован."
unrent-unrented: "%lang:region% теперь не арендует %lang:player%."
unrent-expired: "Ваша аренда %lang:region% уже истекла."
sell-help: "/as sell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
sell-notRegistered: "Этот регион не может быть продан, так как он не зарегистрирован на продажу."
sell-notBought: "Этот регион не может продан, так как не находится в чьей-либо собственности."
sell-sold: "%lang:region% был продан %lang:player%."
sell-noPermission: "У Вас нет прав для продажи региона."
sell-noPermissionOther: "У Вас нет прав для продажи другого региона."
reload-reloading: "Все файлы перезагружены, проверка аренд и обновление регионов."
reload-updateStart: "[gray]Обновление %0% регионов за %1% секунд."
reload-updateComplete: "[gray]Обновление регионов завершено."
reload-noPermission: "Недостаточно полномочий для того, чтобы перезагрузить конфиги плагина."
reload-updateCommandChanged: "'/as updaterents' и '/as updatebuys' были удалены, '/as reload' теперь будет также обновлять регионы, используйте эту команду взамен."
info-noPermission: "У Вас нет прав для получения информации о регионах."
info-allHeader: "Все регионы%0%:"
info-rentedHeader: "Арендовано регионов%0%:"
info-forrentHeader: "Регионы для аренды%0%:"
info-forsaleHeader: "Регионы для продажи%0%:"
info-soldHeader: "Продано регионов%0%:"
info-resellingHeader: "Перепродано регионов%0%:"
info-nogroupHeader: "Регионы без групп%0%:"
info-limitedToGroup: "(ограничение в группе %0%)"
info-nogroupNone: "Здесь нет регионов без групп."
info-noFiltergroup: "Группа '%0%' не существует, потому не может быть использована для ограничения результатов."
info-noRegions: "Нет найденых регионов."
info-wrongPage: "%0% неверный номер страницы."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно арендовать за %price% на %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Арендован %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно продать за %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player% (перепродажа)."
info-pageStatus: "[gold]Страница %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Предыдущая[/bold] "
- " hover: %lang:action|Показать предыдущую страницу|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Предыдущая[/bold] "
- " hover: Это первая страница"
info-pageNext:
- " [gold][bold]Следующая►[/bold]"
- " hover: %lang:action|Показать следующую страницу|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Следующая►[/bold]"
- " hover: Это последняя страница"
info-playerHelp: "/as info player <имяигрока>."
info-playerRents: "Регионы арендованные %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% не арендовал регион."
info-playerBuys: "Регионы купленые %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% не покупал регион."
info-regionHelp: "/as info region [имярегиона], если не указано имя, будет выбран регион в котором вы стоите."
info-regionHeaderRent: "[darkgreen]Информация о %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Информация о %lang:region%:"
info-regionRented: "[darkgreen][bold]►[reset] Арендован игроком %lang:player% до: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Куплено %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Купленный %lang:player%, сейчас продаётся."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Продление за[/bold]"
- " hover: Продлить аренду %region%"
- " hover: длительностью %duration% за %price%"
- " hover: %lang:action|Продлить аренду %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% на %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Аренда за[/bold]"
- " hover: Арендовать %region% за %price% на %duration%"
- " hover: %lang:action|Аренда %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% на %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Купить за[/bold]"
- " hover: Купить %region% за %price%"
- " hover: %lang:action|Купить %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Стоимость перепродажи: [gray]%resellprice% (вы можете купить его у %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Добавленные друзья: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Регион %region%"
- " hover: %lang:action|Удалить %0% из друзей|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy: "[darkgreen][bold]►[reset] Окупаемость продажи: [gray]%moneyback% (%moneybackpercent%% от стоимости)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Окупаемость продажи[/bold]"
- " hover: Продать %region% и получить обратно %moneyback%"
- " hover: %lang:action|Продать %region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% от стоимости)."
info-regionMoneyBackRent: "[darkgreen][bold]►[reset] Окупаемость снятия аренды: [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Окупаемость снятия аренды[/bold]"
- " hover: Снять аренду %region% и вернуть деньги %moneyback%"
- " hover: %lang:action|Снять аренду %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Максимальное количество продления: [gray]%maxextends% раз(а)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Аренду нельзя продлить."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Продленный осталось: [gray]%extendsleft% времени(раз) из %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] пред заказ аренды: [gray]%maxrenttime% максимальный."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Переместится к региону[/bold]"
- " hover: %lang:action|Телепортация на %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]установить точку телепортации[/bold]"
- " hover: %region%"
- " hover: %lang:action|Установить точку телепорта|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Связанные таблички: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
info-regionGroups: "[darkgreen][bold]►[reset] Назначенные группы: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Авто снятие аренды после: [gray]%inactivetime% бездействия игрока."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Авто продажа после: [gray]%inactivetime% бездействия игрока."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его аренды."
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для аренды %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его покупки."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для покупки %lang:region%."
info-regionLandlord: "[darkgreen][bold]►[reset] Землевладелец: [gray]%lang:landlord% (Получит деньги)."
info-regionNotExisting: "Указанный регион не зарегистрирован: %0%."
setrestore-help: "/as setrestore <регион> <true|false|general> [профиль]."
setrestore-noPermission: "У вас нет разрешения на изменение параметров восстановления."
setrestore-notRegistered: "Указанный регион не зарегистрирован: %0%."
setrestore-invalidSetting: "'%0%' не является допустимым значением, должно быть true, false или general."
setrestore-success: "Успешно установлен параметр восстановления %lang:region% до '%0%'."
setrestore-successProfile: "Успешно установлен параметр восстановления %lang:region% до '%0%' и профиль до '%1%'."
setprice-noPermission: "У вас нет разрешения на изменение стоимости региона"
setprice-help: "/as setprice <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setprice-notRegistered: "Указанный регион не зарегистрирован: %0%."
setprice-wrongPrice: "'%0%' не допустимая цена."
setprice-successRent: "Цену региона %lang:region% изменено на %price% до %duration%."
setprice-successBuy: "Цену региона %lang:region% изменено на %price%."
setprice-successRemoved: "Цена в %lang:region% была удалена, использование новой цены из группы или файла default.yml, новая цена: %price%."
setprice-noLandlord: "У вас нет разрешения на изменение цены, потому что вы не землевладелец в %lang:region%."
setduration-noPermission: "У вас нет разрешения на изменение длительности аренды."
setduration-help: "/as setduration <amount> <identifier> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setduration-notRegistered: "%0% не зарегистрирован для сдачи в аренду."
setduration-wrongAmount: "'%0%' не является допустимым количеством, используйте целое число."
setduration-wrongFormat: "'%0%' не правильный формат времени, проверьте документацию на Bukkit."
setduration-success: "Длительность аренды в регионе %lang:region% изменена до '%duration%'."
setduration-noLandlord: "У вас нет разрешения на изменение длительности аренды, потому что вы не землевладелец в %lang:region%."
setduration-successRemoved: "Длительность аренды в %lang:region% было удалено, использование новой длительности аренды из группы или файла default.yml, новая длительность: %duration%."
setup-noRegion: "Вы не указали регион на второй строке."
setup-alreadyRentSign: "Регион уже добавлен в AreaShop в виде аренды региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
setup-alreadyBuySign: "Регион уже добавлен в AreaShop в виде покупного региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
setup-noDuration: "Вы не указали, на сколько времени этот регион можно арендовать, сделайте это на третьей строчке."
setup-wrongDuration: "Время указано не в правильном формате, например: 1 day."
setup-noPrice: "Вы не указали цену на четвертой строке."
setup-wrongPrice: "Вы не указали цену правильно, используйте только цифры ."
setup-rentSuccess: "Сдача аренды в регионе %lang:region% настроена правильно."
setup-buySuccess: "Покупка региона %lang:region% настроена правильно."
setup-noPermissionRent: "У вас нет разрешения на создание арендных регионов."
setup-noPermissionBuy: "У вас нет разрешения на создание проваемых регионов."
setup-couldNotDetect: "Найдено несколько областей с одинаковым приоритетом это/или родительский/дочерна связь, указать одно на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% находится в черном списке и не могут быть добавлены к AreaShop"
setup-noPermission: "Вы не можете добавить регион '%0%', вы не являетесь владельцем/участником или не имеете прав для этого."
destroy-noPermissionRent: "У вас нет разрешения на создание регионов для аренды."
destroy-noPermissionBuy: "У вас нет разрешения на создание регионов для продажи."
destroy-successRent: "%lang:region% успешно зарегистрирован в качестве региона для аренды."
destroy-successBuy: "%lang:region% успешно зарегистрирован в качестве региона для продажи."
teleport-help: "/as tp <region> [табличка]."
teleport-noRentOrBuy: "Указанный регион не зарегистрирован: %0%."
teleport-noPermission: "У вас нет разрешения для телепортации на ваш регион."
teleport-noPermissionOther: "У вас нет разрешения для телепортации на регионы которыми вы не владеете."
teleport-noPermissionSign: "У вас нет разрешения для телепортации к таблички вашего региона."
teleport-noPermissionOtherSign: "У вас нет разрешения для телепортации к табличек регионов которыми вы не владеете."
teleport-noPermissionFriend: "У вас нет разрешения для телепортации на регионы в которых вы добавлены как друг."
teleport-noPermissionFriendSign: "У вас нет разрешения для телепортации к табличкам регионов в которых вы добавлены как друг."
teleport-success: "Вы телепортированы к %lang:region%."
teleport-successSign: "Вы телепортированы к табличке возле %lang:region%."
teleport-noSafe: "Сохранение позиции не найдено в %lang:region%, нет места в регионе или превышен максимальный лимит (%0%/%1%)."
teleport-blocked: "Вы не можете телепортироваться, потому что положение находится за пределами региона, и вы вынуждены телепортироваться во внутрь."
teleport-changedToSign: "У вас есть только разрешение на телепортироваться к табличке, а не во внутрь региона, телепортация к табличке."
teleport-changedToNoSign: "Ни одна табличка не доступна что бы телепортироваться, попытка телепортироваться во внутрь региона вместо этого."
setteleport-help: "/as settp [регион] [сброс], если не указать параметры, будет выбран регион в котором вы находитесь."
setteleport-noPermission: "У вас нет прав, чтобы установить точку телепорта."
setteleport-noPermissionOther: "У вас нет прав, чтобы установить точку телепорта для региона, который вам не принадлежит."
setteleport-noRentOrBuy: "Указанный регион не зарегистрирован: %0%."
setteleport-success: "Точка телепорта для %lang:region% установлена."
setteleport-notInside: "Точка должно быть внутри региона."
setteleport-reset: "Точка телепорта для %lang:region% была сброшена."
find-help: "/as find <buy|rent> [стоимость] [группа]."
find-noPermission: "У вас нет разрешения на поиск регионов и телепортироваться к ним."
find-success: "Найден %0% регион: %lang:region%, при поиске с максимальной ценой в вашем балансе: %1%%2%."
find-successMax: "Найдено %0% регионов: %lang:region%, при поиске с максимальной ценой %1%%2%."
find-wrongMaxPrice: "Указанная максимальная цена имеет не правильный номер: %0%."
find-wrongGroup: "Указанная группа не существует: %0%."
find-noneFound: "Ни один %0% регион не найден при поиске с максимальной ценой в вашем балансе: %1%%2%."
find-noneFoundMax: "Ни один %0% регион не найден при поиске с максимальной ценой %1%%2%."
find-onlyInGroup: ", искать регионы только в группах: %0%."
groupadd-help: "/as groupadd <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
groupadd-noPermission: "У вас нет разрешения на добавление регионов к группам."
groupadd-success: "Регион %lang:region% был добавлен к группе '%0%', эта группа теперь имеет %1% участника(-ов)."
groupadd-failed: "Регион %lang:region% уже является участником группы '%0%'."
groupadd-weSuccess: "Добавлен к группе %0%: [gray]%1%."
groupadd-weFailed: "Уже были в группе %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
groupdel-noPermission: "У вас нет разрешения на удаление регионов из групп."
groupdel-success: "Регион %lang:region% был удален из группы '%0%', эта группа теперь имеет %1% участника(-ов)."
groupdel-failed: "Регион %lang:region% не является участником группы '%0%'."
groupdel-weSuccess: "Удален из группы %0%: [gray]%1%."
groupdel-weFailed: "Не были в группе %0% во всяком случае: [gray]%1%."
grouplist-noPermission: "У вас нет разрешения на отображение зарегистрированных групп."
grouplist-noGroups: "Нет доступных зарегистрированных груп."
grouplist-success: "Следующие группы были зарегистрированные: [gray]%0%."
groupinfo-help: "/as groupinfo <группа>."
groupinfo-noPermission: "У вас нет разрешения на отображение информации о группе."
groupinfo-noGroup: "Нет доступной зарегистрированной группы с именем '%0%', используй /as grouplist для вывода списка групп."
groupinfo-members: "Следующие регионы являются членами группы %0%: [gray]%1%."
groupinfo-noMembers: "Группа %0% не имеет участников."
schemevent-help: "/as schemevent <регион> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "Событие '%0%' не существует, используйте одно из следующих действий: [gray]%1%."
schemevent-success: "Событие '%0%' успешно сработало для региона %lang:region%."
schemevent-noPermission: "У вас нет разрешения на иницииацию схематических событий"
add-help: "/as add <rent|buy> [rрегион] [мир]."
add-noPermission: "У вас нет разрешения добавлять регионы в AreaShop."
add-success: "Добавлен в %0%: [gray]%1%."
add-failed: "Уже зарегистрирован: [gray]%0%."
add-blacklisted: "Включен в черный список : [gray]%0%."
add-specifyWorld: "Укажите мир региона при использовании из консоли."
add-incorrectWorld: "Мир '%0%' не найден, попробуйте еще раз (с учетом регистра)."
add-noPermissionRegions: "Нет разрешения, чтобы добавить: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Вы либо не являетесь участником/владельцем этих регионов, либо не имеете разрешения добавлять свои регионы."
del-noPermission: "У вас нет разрешения на удаление регионов."
del-success: "Удалены регионы: [gray]%0%."
del-failed: "Нет разрешения на удаление или не зарегистрирован: [gray]%0%."
addsign-help: "/as addsign [регион] [профиль]."
addsign-noSign: "Вы не смотрите на табличку."
addsign-noRegions: "Не найдено регионов вокруг таблички."
addsign-couldNotDetect: "Найдено несколько регионов вокруг таблички, укажите регион в качестве дополнительного аргумента (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Найдено несколько регионов вокруг таблички, укажите регион на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
addsign-wrongProfile: "Указанный профиль не существует, используйте одно из следующих действий (проверьте конфиг.): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Табличка профиль %0%"
- " hover: %lang:action|Используйте этот профиль|%"
- " command: /areashop linksigns %0%"
addsign-success: "Табличка была добавлена для %lang:region%."
addsign-successProfile: "Табличка была добавлена для %lang:region% вместе с профилем %0%."
addsign-alreadyRegistered: "Эта табличка уже зарегистрирована в регионе %lang:region%."
addsign-noPermission: "У вас нет разрешения на добавление таблички."
delsign-noSign: "Вы не смотрите на табличку."
delsign-noPermission: "У вас нет разрешения на удаление таблички."
delsign-noRegion: "Эта табличка не принадлежит к регионам в AreaShop."
delsign-success: "Табличка была удалена из региона %lang:region%."
me-noPermission: "У вас нет прав, чтобы проверить, какие регионы вы имеете."
me-header: "Регионы %lang:tPlayer|%0%|%:"
me-notAPlayer: "Вы не являетесь игроком, которому доступны какие-либо регионы."
me-rentLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "%timeleft% истек"
- " hover: until %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
- "принадлежит %lang:player%"
- " hover: Вы добавили друга"
- ")."
me-nothing: "%lang:tPlayer|%0%|% не арендовали или покупали регионы и не добавлялись в друзья."
me-noPlayer: "%0% не может быть найден, вероятно, никогда не присоединился к серверу."
me-clickHint: "[gray][italic]Нажмите на имя региона , чтобы увидеть детали"
setowner-help: "/as setowner <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setowner-noPermission: "У вас нет прав, чтобы установить владельца региона."
setowner-noPermissionRent: "У вас нет прав, чтобы установить владельца для аренды регионов."
setowner-noPermissionBuy: "У вас нет прав, чтобы установить владельца для покупки регионов."
setowner-notRegistered: "Указанный регион не зарегистрирован, владелец не может быть установлен."
setowner-noPlayer: "Не удалось получить UUID указанного игрока: %0%."
setowner-succesRent: "Владелец в %lang:region% успешно изменен на %lang:player%, орендований до %until% (%timeleft% истечет)."
setowner-succesRentExtend: "Владелец %lang:player%, аренда расширена на '%duration%', сейчас арендован до %until% (%timeleft% истечет)."
setowner-succesBuy: "Владелец в %lang:region% успешно изменен на %lang:player%."
resell-help: "/as resell <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
resell-wrongPrice: "'%0%' не является допустимой ценой."
resell-notRegistered: "Указанный регион не зарегистрирован: %0%."
resell-notBought: "Вы не можете перепродать %lang:region%, так как он еще не продан."
resell-success: "%lang:region% был успешно выставлен в режим перепродажи за %resellprice%."
resell-noPermission: "У Вас нет прав что бы установить ваш регион в режим перепродажи."
resell-noPermissionOther: "У Вас нет прав что бы установить регион в режим перепродажи."
stopresell-help: "/as stopresell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
stopresell-notRegistered: "Указанный регион не зарегистрирован: %0%."
stopresell-notResell: "Вы не можете остановить перепродажу %lang:region% потому что регион не в режиме перепродажи."
stopresell-success: "%lang:region% был успешно выставлен в режим продажи."
stopresell-noPermission: "У вас нет прав, чтобы установить свой регион обратно в режим продажи."
stopresell-noPermissionOther: "У вас нет разрешения устанавливать регионы обратно в режим продажи."
addfriend-help: "/as addfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
addfriend-noPermissionOther: "У вас нет разрешения на добавление друзей в регионы, которые не являются вашими."
addfriend-noPermission: "У вас нет разрешения на добавление друзей в вашем регионе."
addfriend-successOther: "%lang:tPlayer|%0%|% был добавлен до друзей в %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% был добавлен до друзей в вашем регионе %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% уже добавлен до друзей в %lang:region%."
addfriend-self: "Добавление владельца региона как друга было бы бессмысленно."
addfriend-noOwner: "Вы не можете добавлять друзей в регионе без владельца."
addfriend-notVisited: "Вы не можете добавить %0% потому что он еще не посещал этот сервер."
delfriend-help: "/as delfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
delfriend-noPermissionOther: "У вас нет разрешения на удаление друзей из регионов, которые не являются вашими."
delfriend-noPermission: "У вас нет разрешения на удаление друзей из вашего региона."
delfriend-successOther: "%lang:tPlayer|%0%|% был удален из друзей в регионе %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% был удален из друзей в вашем регионе %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% не добавлен до друзей в %lang:region%."
delfriend-noOwner: "Вы не можете удалять друзей из региона без владельца."
linksigns-multipleRegions: "Найдено несколько регионов: [gray]%0%."
linksigns-multipleRegionsAdvice: "Нажмите в другое время, чтобы попробовать еще раз или используйте '/as linksigns' чтобы остановить."
linksigns-noRegions: "Не найдено регионов AreaShop в направлении взгляда, убедитесь что регион добавлен в AreaShop [gray](максимум расстояние в 100 блоков)."
linksigns-regionFound: "Регион %lang:region% был выбран, теперь укажите табличку кликнув левой кнопкой мыши для его привязки."
linksigns-signFound: "Обнаружена табличка в (%0%, %1%, %2%), теперь укажите регион кликнув правой кнопкой мыши для ее привязки"
linksigns-noSign: "Никаких табличек не обнаружено в направлении взгляда, убедитесь, что у вас есть прямой взгляд на табличку и нажмите снова [gray](максимум расстояние в 100 блоков)."
linksigns-alreadyRegistered: "Эта табличка уже зарегистрирована в регионе %lang:region%, кликни еще раз, чтобы выбрать другую табличку."
linksigns-first: "Включен режим привязки табличек."
linksigns-next: "[gray]Клик лкм. выбрать табличку, клик пкм. выбрать регион, использовать /as linksigns для отключения режима."
linksigns-noPermission: "У вас нет разрешения для пользования режима привязки табличек."
linksigns-stopped: "Отключен режим привязки табличек."
stack-help:
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
- " [gray]<amount> Количество создаваемых регионов.[break]"
- " [gray]<gap> Дистанция в блоках между регионами.[break]"
- " [gray]<name> Имя региона (с числом за ним).[break]"
- " [gray]<rent|buy> сделать аренду или продажу.[break]"
- " [gray][group] Добавляет регионы в группу.[break]"
- " [gray]Регионы будут созданы в направлении взгляда."
stack-accepted: "Началось создание %0% %1% регионов с растоянием в %2% блок(ов), имена которых начинаются с %3% и имеют номера за ними.%4%"
stack-addToGroup: "Созданные регионы будут добавлены к группе '%0%'."
stack-noPermission: "У вас нет разрешения создавать и добавлять регионы AreaShop в большом количестве."
stack-wrongAmount: "'%0%' не правильное количество регионов."
stack-wrongGap: "'%0%' не правильное число блоков для отступа между регионами."
stack-noSelection: "У вас нет выделения, которое указывает, где должен быть создан первый регион."
stack-addStart: "[gray]Добавлено %0% регионов около %1% в секунду."
setlandlord-help: "/as setlandlord <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
setlandlord-noPermission: "У вас не разрешения чтобы назначить землевладельца в регион."
setlandlord-success: "%lang:landlord% был успешно установлен как землевладелец в %lang:region%."
message-help: "/as message <игрок> <сообщение...>"
message-noPermission: "У вас нет разрешения на отправку AreaShop сообщений."
message-notOnline: "%0% не в сети."
confirm-rent:
- "%lang:prefix%Вы уверены, что вы хотите арендовать %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы арендовать %0%|%"
- " hover: %lang:action|Аренда %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Вы уверены, что вы хотите продлить %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продлить %0%|%"
- " hover: %lang:action|Продлить %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Вы уверены, что хотите снять аренду %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы снять аренду %0%|%"
- " hover: %lang:action|Снять аренду %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Вы уверены, что хотите купить %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы купить %0%|%"
- " hover: %lang:action|Купить %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Вы уверены, что хотите продать %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продать %0%|%"
- " hover: %lang:action|Продать %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% лет"
timeleft-months: "%0% месяцев"
timeleft-days: "%0% дней"
timeleft-hours: "%0% часов"
timeleft-minutes: "%0% минут"
timeleft-second: "%0% секунд"
timeleft-seconds: "%0% секунд"
timeleft-ended: "Истек"
greeting-forrent: "%region% может быть арендован за %price% на %duration%"
greeting-rented: "%region% арендован игроком %player% до %until%."
greeting-forsale: "%region% может быть куплен за %price%."
greeting-bought: "%region% куплен игроком %player%."
greeting-resale: "%region% может быть куплен за %resaleprice% у игрока %player%."
+552
View File
@@ -0,0 +1,552 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Swedish, Version: V2.4.0, Percentage translated: 97% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
action: "[gold][bold]<%0%>[/bold]"
button: "[bold]<%0%>[/bold]"
command:
- "[bold]%0%[/bold]"
- " hover: %lang:action|Använd %1%|%"
- " command: %1%"
helpCommand:
- "[gold]%0% [gray]-[reset]"
- " hover: %lang:action|Använd %0%|%"
- " command: %0%"
region: "%lang:tRegion|%region%|%"
tRegion:
- "[bold]%0%[/bold]"
- " hover: Område %0%"
- " hover: %lang:action|Regions information|%"
- " command: /areashop info region %0%"
player: "%lang:tPlayer|%player%|%"
tPlayer:
- "[bold]%0%[/bold]"
- " hover: Spelare %0%"
- " hover: %lang:action|Regioner av %0%|%"
- " command: /areashop info player %0%"
landlord:
- "[bold]%landlord%[/bold]"
- " hover: Hyresvärd %landlord%"
- " hover: %lang:action|Regioner av %landlord%|%"
- " command: /areashop info player %landlord%"
total-maximum: "Du kan inte hyra/köpa mer än %0% region(er) totalt (Du har redan %1% inom grupp '%2%')."
general-notReady: "AreaShop har inte laddat klart, vänligen vänta."
general-noWorld: "Du kan inte göra detta. Världen: %lang:region% är inte tillgänglig (värld '%world%')"
general-noRegion: "Du kan inte göra så, WorldGuard regionen är inte tillgänglig (region %lang:region%)"
general-noEconomy: "Det finns inget tillägg för ekonomisystem installerat eller så är det inte inställt korrekt. Meddela serverns ägare om detta."
general-cancelled: "%0%"
cmd-notValid: "Kommandot är inte tillgängligt, använd '/as help' för mer information."
cmd-onlyByPlayer: "Detta kommando kan enbart köras av en spelare."
cmd-weOnlyByPlayer: "Användning av WorldEdit är enbart tillgängligt för en spelare, specifiera regionens namn som extra argument."
cmd-noSelection: "Du har ingen WorldEdit område valt."
cmd-noRegionsFound: "Inga regioner registrerade i AreaShop finns i ditt val."
cmd-noWERegionsFound: "Inga WorldEdit regioner som korsar ditt val finns."
cmd-noRegionsAtLocation: "Inga regioner finns på din plats, ange en region som argument."
cmd-moreRegionsAtLocation: "Mer än en region har hittats på din plats, ange en region som argument."
cmd-automaticRegionOnlyByPlayer: "Att automatiskt avgöra regionen är enbart möjligt för spelare, ange en region som argument."
help-header: "Hjälpsidan, kommandon som du kan utföra."
help-noPermission: "Du har inte behörighet för att visa hjälpsidan."
help-alias: "Kommando alias: /areashop, /as."
help-help: "%lang:helpCommand|/as help|% Visar denna hjälpsida."
help-info: "%lang:helpCommand|/as info|% Få information om aktuella regioner."
help-rent: "%lang:helpCommand|/as rent|% Hyr en region eller förlänga din nuvarande hyra."
help-buy: "%lang:helpCommand|/as buy|% Köp en region."
help-unrent: "%lang:helpCommand|/as unrent|% Sluta hyra en region."
help-sell: "%lang:helpCommand|/as sell|% sälj en region."
help-reload: "%lang:helpCommand|/as reload|% Ladda om alla filer och uppdatera regionerna."
help-setrestore: "%lang:helpCommand|/as setrestore|% Ställ in återställning på/av och välj profil."
help-setprice: "%lang:helpCommand|/as setprice|% Ändra priset av en region."
help-setduration: "%lang:helpCommand|/as setduration|% Ändra varaktigheten för en hyraregion."
help-teleport: "%lang:helpCommand|/as tp|% Teleportera till en hyr-/köpregion."
help-setteleport: "%lang:helpCommand|/as settp|% Sätt ut teleporteringsposition för en region."
help-find: "%lang:helpCommand|/as find|% Hitta en ledig köpa eller hyra."
help-groupadd: "%lang:helpCommand|/as groupadd|% Lägg till en region till en grupp."
help-groupdel: "%lang:helpCommand|/as groupdel|% Radera en region från en grupp."
help-grouplist: "%lang:helpCommand|/as grouplist|% Visa alla grupper som för närvarande är registrerade."
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Visa information om en grupp."
help-schemevent: "%lang:helpCommand|/as schemevent|% Utlös en schematisk händelse för en region."
help-add: "%lang:helpCommand|/as add|% Registrera en region som hyra eller köpa."
help-del: "%lang:helpCommand|/as del|% Radera en registrerad region från AreaShop."
help-addsign: "%lang:helpCommand|/as addsign|% Lägg till en skylt till en existerande region."
help-delsign: "%lang:helpCommand|/as delsign|% Radera skylten du ser på."
help-me: "%lang:helpCommand|/as me|% Se vilka områden du har (+expiration)."
help-setowner: "%lang:helpCommand|/as setowner|% Bestäm regionens ägare eller förläng hyran."
help-resell: "%lang:helpCommand|/as resell|% Sätt en region i återförsäljarläge."
help-stopResell: "%lang:helpCommand|/as stopresell|% Sätt tillbaka en region i sålt läge."
help-addFriend: "%lang:helpCommand|/as addfriend|% Lägg till en vän till en region."
help-delFriend: "%lang:helpCommand|/as delfriend|% Ta bort en vän från en region."
help-linksigns: "%lang:helpCommand|/as linksigns|% Använd länkningsläge med gruppskylt."
help-stack: "%lang:helpCommand|/as stack|% Skapa flera regioner och lägg till dem."
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Ange hyresvärden för en region."
rent-help: "/as rent [region], regionen du står i kommer användas om inget är angivet."
rent-noPermission: "Du har inte behörighet att hyra en region."
rent-maximum: "Du kan inte hyra mer än %0% region(er) (du har redan %1% i grupp '%2%')."
rent-maximumExtend: "Du kan inte förlänga den här hyran för du har redan fler än %0% region(er) (du har redan %1% i grupp '%2%')."
rent-payError: "Något gick fel med betalningen, försök igen senare."
rent-rented: "Du hyrde %lang:region% fram till %until%, du kan förlänga din hyrtid genom att högerklicka skylten igen eller genom att använda /as rent."
rent-extended: "Du kan förlänga ditt hyrande av %lang:region% fram till %until%."
rent-extendedToMax: "Du förlängde ditt hyrande av %lang:region% fram till %until% (vilket är den maximala hyrtiden på %maxrenttime%)."
rent-lowMoneyExtend: "Du har inte tillräckligt med pengar för att förlänga hyran (du har %0% och du behöver %price%)."
rent-lowMoneyRent: "Du har inte tillräckligt med pengar för att hyra %lang:region% (du har %0% och du behöver %price%)."
rent-someoneElse: "Någon annan har redan hyrt %lang:region%."
rent-notRentable: "Den här regionen är inte tillgänglig för att hyras."
rent-maxExtends: "Du kan inte förlänga den här hyran mer (maximalt är %maxextends% times), men efter att hyran är över kan du hyra %lang:region% igen."
rent-maxRentTime: "Du kan inte hyra %lang:region% mer tid i förväg, maximal tid är %maxrenttime% och du har för tillfället hyrt den i %timeleft%."
rent-restrictedToWorld: "Du måste vara i världen '%world%' för att hyra %lang:region% (du är i '%0%')."
rent-restrictedToRegion: "Du måste vara innanför %lang:region% för att hyra den."
rent-expireWarning: "Din region %lang:region% har %timeleft% kvar, se till att föränga den om du vill ha kvar den."
rent-alreadyAtFull: "%lang:region% Är redan på eller över den maximala tiden du får hyra, du kan inte förlänga den än."
buy-help: "/as buy [region], regionen du står i kommer användas om ingen annan specifieras."
buy-noPermission: "Du har inte rättigheterna att köpa en region."
buy-noPermissionResell: "Du har inte rättigheterna att köpa en region i återsäljnings läge."
buy-noPermissionNoResell: "Du har inte rättigheterna att köpa en region som inte är i återsäljnings läge."
buy-notBuyable: "Regionen %lang:region% är inte tillgänglig att köpas."
buy-maximum: "Du kan inte köpa fler än %0% region(er) (du har redan %1% i grupp '%2%')."
buy-payError: "Något gick fel med betalningen, försök igen senare."
buy-succes: "Du köpte %lang:region%."
buy-successResale: "Du köpte %lang:region% från %lang:tPlayer|%0%|%."
buy-successSeller: "Din region %lang:region% har blivit såld till %lang:player% för %0%."
buy-lowMoney: "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %price%)."
buy-lowMoneyResell: "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %resellprice%)."
buy-yours: "Du äger redan %lang:region%."
buy-someoneElse: "Någon annan har redan köpt %lang:region%."
buy-restrictedToWorld: "Du måste befinna dig i världen '%world%' för att köpa %lang:region% (du befinner dig i '%0%')."
buy-restrictedToRegion: "Du måste vara innanför %lang:region% för att köpa den."
unrent-help: "/as unrent [region], regionen du står i kommer användas om inget är angivet."
unrent-noPermission: "Du har inte rättigheterna för att säga upp hyran av en region."
unrent-noPermissionOther: "Du har inte rättigheterna för att säga upp hyran av en annan region."
unrent-notRegistered: "Hyran för den här regionen kan inte tas bort då den inte är registrerad för uthyrning."
unrent-notRented: "Hyran för den här regionen kan inte tas bort då den inte är hyrd."
unrent-unrented: "%lang:region% för %lang:player% har fått sin hyrning borttagen."
unrent-expired: "Din hyrning av %lang:region% har löpt ut."
sell-help: "/as sell [region], regionen du står i kommer användas om ingen annan specifieras."
sell-notRegistered: "Den här regionen kan inte säljas då den inte är registrerad för att köpas."
sell-notBought: "Regionen kan inte säljas för det är ingens egendom."
sell-sold: "%lang:region% för %lang:player% har sålts."
sell-noPermission: "Du har inte rättigheterna att sälja den här regionen."
sell-noPermissionOther: "Du har inte rättigheterna att sälja en annan region."
reload-reloading: "Laddat om alla filer, kollar nu hyror och uppdaterar regioner."
reload-updateStart: "[gray]Uppdaterar %0% regioner med %1% per sekund."
reload-updateComplete: "[gray]Uppdatering av regioner är klar."
reload-noPermission: "Du har inte rättigheterna för att ladda om konfigureringsfiler."
reload-updateCommandChanged: "'/as updaterents' och '/as updatebuys' har tagits bort, '/as reload' uppdaterar även regioner nu så använd det kommandot istället."
info-noPermission: "Du har inte rättigheterna för att få information om regionerna."
info-allHeader: "Alla regioner%0%:"
info-rentedHeader: "Hyrda regioner%0%:"
info-forrentHeader: "Regioner för uthyrning%0%:"
info-forsaleHeader: "Regioner till salu%0%:"
info-soldHeader: "Sålda regioner%0%:"
info-resellingHeader: "Regioner för återsäljning%0%:"
info-nogroupHeader: "Regioner utan grupp%0%:"
info-limitedToGroup: " (begränsade till grupp %0%)"
info-nogroupNone: "Det finns inga regioner utan grupp."
info-noFiltergroup: "Grupp '%0%' finns inte och kan därför inte användas för att begränsa reslutaten."
info-noRegions: "Inga regioner kunde hittas."
info-wrongPage: "%0% är inte ett korrekt sidonummer."
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyres för %price% per %duration%."
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyrd till %lang:player%."
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]Till salu för %price%."
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player%."
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player% (återsäljer)."
info-pageStatus: "[gold]Sida %0%/%1%"
info-pagePrevious:
- " [gold][bold]◄Föregående[/bold] "
- " hover: %lang:action|Visar föregående sida|%"
- " command: %0%"
info-pageNoPrevious:
- " [darkgray][bold]◄Föregående[/bold] "
- " hover: Detta är redan första sidan"
info-pageNext:
- " [gold][bold]Nästa►[/bold]"
- " hover: %lang:action|Visar nästa sida|%"
- " command: %0%"
info-pageNoNext:
- " [darkgray][bold]Nästa►[/bold]"
- " hover: Detta är redan sista sidan"
info-playerHelp: "/as info player <namn>."
info-playerRents: "Regioner hyrda av %lang:tPlayer|%0%|%: [gray]%1%"
info-playerNoRents: "%lang:tPlayer|%0%|% har inte hyrt någon region."
info-playerBuys: "Regioner köpta av %lang:tPlayer|%0%|%: [gray]%1%."
info-playerNoBuys: "%lang:tPlayer|%0%|% har inte köpt någon region."
info-regionHelp: "/as info region [namn], regionen du står i kommer användas om ingen annan specifieras."
info-regionHeaderRent: "[darkgreen]Information om %lang:region%:"
info-regionHeaderBuy: "[darkgreen]Information om %lang:region%:"
info-regionRented: "[darkgreen][bold]►[reset] Hyrd av %lang:player% tills: [gray]%until%."
info-regionBought: "[darkgreen][bold]►[reset] Köpt av %lang:player%."
info-regionReselling: "[darkgreen][bold]►[reset] Köpt av %lang:player%, ute till återförsäljning."
info-regionExtending:
- "[darkgreen][bold]►[reset] "
- "[bold]Förläng för[/bold]"
- " hover: Förläng hyrning av %region%"
- " hover: med %duration% för %price%"
- " hover: %lang:action|Förläng hyrning av %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeRented:
- "[darkgreen][bold]►[reset] "
- "[bold]Hyra för[/bold]"
- " hover: Hyr %region% för %price% per %duration%"
- " hover: %lang:action|Hyr %region%|%"
- " command: /areashop rent %region%"
- ": [gray]%price% per %duration%."
info-regionCanBeBought:
- "[darkgreen][bold]►[reset] "
- "[bold]Köp för[/bold]"
- " hover: Köp %region% för %price%"
- " hover: %lang:action|Köp %region%|%"
- " command: /areashop buy %region%"
- ": [gray]%price%."
info-regionReselPrice: "[darkgreen][bold]►[reset] Återsäljningspris: [gray]%resellprice% (du kan köpa den från %lang:player%)."
info-regionFriends: "[darkgreen][bold]►[reset] Tillagda vänner: [gray]%0%."
info-friend: "%lang:tPlayer|%0%|%"
info-friendRemove:
- "%lang:info-friend|%0%|%"
- "[red]✕[gray]"
- " hover: Region %region%"
- " hover: %lang:action|Ta bort%0% som vän|%"
- " command: /areashop delfriend %0% %region%"
info-regionMoneyBackBuy: "[darkgreen][bold]►[reset] Försäljning återbetalning: [gray]%moneyback% (%moneybackpercent%% av priset)."
info-regionMoneyBackBuyClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Försäljning återbetalning[/bold]"
- " hover: Sälj %region% och få tillbaka %moneyback%"
- " hover: %lang:action|Sälj%region%|%"
- " command: /areashop sell %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av priset)."
info-regionMoneyBackRent: "[darkgreen][bold]►[reset] Avbruten hyras återbetalning: [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
info-regionMoneyBackRentClick:
- "[darkgreen][bold]►[reset] "
- "[bold]Avbruten hyras återbetalning[/bold]"
- " hover: Avbryt hyra %region% och få tillbaka %moneyback%"
- " hover: %lang:action|Avbryt hyra %region%|%"
- " command: /areashop unrent %region%"
- ": [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximalt antal expansioner: [gray]%maxextends% time(s)."
info-regionNoExtending: "[darkgreen][bold]►[reset] Hyran kan inte förlängas."
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Expansioner kvar: [gray]%extendsleft% time(s) utav %maxextends%."
info-regionMaxRentTime: "[darkgreen][bold]►[reset] Hyra i förväg: [gray]%maxrenttime% max."
info-prefix: "[darkgreen][bold]►[reset] "
info-regionTeleport:
- "[bold]Gå till regionen[/bold]"
- " hover: %lang:action|Teleportera till %region%|%"
- " command: /areashop tp %region%"
info-setRegionTeleport:
- "[bold]sätt ut teleporteringsplats[/bold]"
- " hover: %region%"
- " hover: %lang:action|Sätt ut teleporteringsplats|%"
- " command: /areashop settp %region%"
info-regionSigns: "[darkgreen][bold]►[reset] Connected signs: [gray]%0%."
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
info-regionGroups: "[darkgreen][bold]►[reset] Tilldelade grupper: [gray]%0%."
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Avsluta hyrning automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
info-regionInactiveSell: "[darkgreen][bold]►[reset] Sälj automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att hyra den."
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] Du måste befinna dig i världen '%world%' för att hyra %lang:region%."
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att köpa den."
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] Du måste vara i världen '%world%' för att köpa %lang:region%."
info-regionLandlord: "[darkgreen][bold]►[reset] Hyresvärd: [gray]%lang:landlord% (mottager pengarna)."
info-regionNotExisting: "Den specifierade regionen är inte registrerad: %0%."
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
setrestore-noPermission: "Du har inte rättigheterna att ändra återställnings inställningarna."
setrestore-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
setrestore-invalidSetting: "'%0%' är inte ett giltigt tillstånd, bör vara true, false eller general."
setrestore-success: "Återställningsläget för %lang:region% inställt till '%0%'."
setrestore-successProfile: "Återställningsläget för %lang:region% inställt till '%0%' och profilen till '%1%'."
setprice-noPermission: "Du har inte rättigheterna för att ställa in priset på en region."
setprice-help: "/as setprice <price> [region], regionen du står i kommer användas om ingen annan specifieras."
setprice-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
setprice-wrongPrice: "'%0%' är inte ett giltigt pris."
setprice-successRent: "Priset på regionen %lang:region% ändrad till %price% per %duration%."
setprice-successBuy: "Priset på regionen %lang:region% ändrad till %price%."
setprice-successRemoved: "Priset på %lang:region% har tagits bort, Den kommer nu använda priset från en grupp i filen default.yml, nytt pris: %price%."
setprice-noLandlord: "Du har inte rättigheterna att ändra priset för du inte är hyresvärd av %lang:region%."
setduration-noPermission: "Du har inte rättigheterna att ändra tiden för en hyra."
setduration-help: "/as setduration <amount> <identifier> [region], regionen du står i kommer användas om inget annat specifieras."
setduration-notRegistered: "%0% är inte registrerad för uthyrning."
setduration-wrongAmount: "'%0%' är inte ett giltigt nummer, använd ett helt nummer."
setduration-wrongFormat: "'%0%' är inte ett giltigt tidsformat, kolla dokumentationen på bukkit."
setduration-success: "Varaktigheten av region %lang:region% ändrad till '%duration%'."
setduration-noLandlord: "Du har inte rättigheterna att ändra varaktigheten för du är inte hyresvärd av %lang:region%."
setduration-successRemoved: "Varaktigheten av %lang:region% har tagits bort, det kommer nu använda den varaktighet som finns i filen default.yml, ny varaktighet: %duration%."
setup-noRegion: "Du specifierade inte någon region på andra raden."
setup-alreadyRentSign: "Regionen du specifierade är redan tillagd till AreaShop som en hyr region, lägg till skyltat med [as] på första raden eller '/as addsign'."
setup-alreadyBuySign: "Regionen du specifierade är redan tillagd till AreaShop som en köp region, lägg till skyltat med [as] på första raden eller '/as addsign'."
setup-noDuration: "Du specifierade inte hur länge regionen kan hyras, gör detta på den tredje raden."
setup-wrongDuration: "Tiden som specifieras är inte i rätt format, exempel: 1 day."
setup-noPrice: "Du specifierade inte priset på fjärde raden."
setup-wrongPrice: "Du specifierade inte priset korrekt, använd bara siffror."
setup-rentSuccess: "Hyrning av region %lang:region% är inställt korrekt."
setup-buySuccess: "Köp av region %lang:region% är inställt korrekt."
setup-noPermissionRent: "Du har inte rättigheterna för att ställa in regioner att hyra."
setup-noPermissionBuy: "Du har inte rättigheterna för att ställa in regioner att köpa."
setup-couldNotDetect: "Hittade flera regioner med samma prioritet och/eller förälder/barn-relation, specifiera en på den andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
setup-blacklisted: "%0% är svartlistad och kan inte läggas till i AreaShop."
setup-noPermission: "Du kan inte lägga till regionen '%0%', du är inte ägare/medlem i den eller så saknar du rättigheterna för det."
destroy-noPermissionRent: "Du har inte rättigheterna för att avregistrera en hyrbar region."
destroy-noPermissionBuy: "Du har inte rättigheterna för att avregistrera en köpbar region."
destroy-successRent: "%lang:region% avregistrerades som hyrbar region."
destroy-successBuy: "%lang:region% avregistrerades som köpbar region."
teleport-help: "/as tp <region> [skylt]."
teleport-noRentOrBuy: "Den specifierade regionen är inte registrerad: %0%."
teleport-noPermission: "Du har inte rättigheterna för att teleportera dig till din region."
teleport-noPermissionOther: "Du har inte rättigheterna för att teleportera dig till regioner du inte äger."
teleport-noPermissionSign: "Du har inte rättigheterna för att teleportera dig till skylten i din region."
teleport-noPermissionOtherSign: "Du har inte rättigheterna för att teleportera dig till skylten i regioner du inte äger."
teleport-noPermissionFriend: "Du har inte rättigheterna för att teleportera dig till regioner du är tillagd i som vän."
teleport-noPermissionFriendSign: "Du har inte rättigheterna för att teleportera dig till skylten i regioner du är tillagd i som vän."
teleport-success: "Du teleporterade till %lang:region%."
teleport-successSign: "Du teleporterade till skylten i %lang:region%."
teleport-noSafe: "Ingen säker plats hittades %lang:region%, inga platser i regionen kvar eller maximalt försök överskreds (%0%/%1%)."
teleport-blocked: "Du kan inte teleportera dig då den positionen befinner sig utanför regionen och du måste teleportera dig innanför."
teleport-changedToSign: "Du har bara rättigheterna för att teleportera till skylten och inte innanför regionen, teleporterar till skylt."
teleport-changedToNoSign: "Ingen skylt tillgänglig att teleportera till, försöker teleportera innanför regionen istället."
setteleport-help: "/as settp [region] [reset], regionen du står i kommer andvändas om inget specifieras."
setteleport-noPermission: "Du har inte rättigheterna att sätta ut teleporteringsplatsen."
setteleport-noPermissionOther: "Du har inte rättigheterna för att sätta ut teleporteringsplatsen för en region du inte äger."
setteleport-noRentOrBuy: "Den specifierade regionen är inte registrerad: %0%."
setteleport-success: "Teleporteringsplats för %lang:region% utsatt."
setteleport-notInside: "Platsen måste vara innanför regionen."
setteleport-reset: "Teleporteringsplats för %lang:region% har återställts."
find-help: "/as find <buy|rent> [maxpris] [grupp]."
find-noPermission: "Du har inte rättigheterna för att söka på regioner och teleportera till dem."
find-success: "Hittade en %0% region: %lang:region%, när sökande med maxpris av ditt konto: %1%%2%."
find-successMax: "Hittade en %0% region: %lang:region%, när sökande med maxpris på %1%%2%."
find-wrongMaxPrice: "Det specifierade maxpriset är inte ett korrekt nummer: %0%."
find-wrongGroup: "Den specifierade gruppen finns inte: %0%."
find-noneFound: "Ingen %0% region hittades när sökande med maxpris av ditt konto: %1%%2%."
find-noneFoundMax: "Ingen %0% region hittades när sökande med maxpris på %1%%2%."
find-onlyInGroup: ", sökte endast efter regioner i gruppen: %0%."
groupadd-help: "/as groupadd <group> [region], om ingen region är specifierad används alla regioner från din WorldEdit markering."
groupadd-noPermission: "Du har inte rättigheterna för att lägga till regioner i grupper."
groupadd-success: "Region %lang:region% har lagts till i grupp '%0%', den här gruppen har nu %1% medlem(mar)."
groupadd-failed: "Region %lang:region% är redan medlem i gruppen '%0%'."
groupadd-weSuccess: "Tillagd i grupp %0%: [gray]%1%."
groupadd-weFailed: "Var redan i grupp %0%: [gray]%1%."
groupdel-help: "/as groupdel <group> [region], Om inget område är specifierat används alla områden från ditt WorldEdit val."
groupdel-noPermission: "Du har inte rättigheterna att ta bort regioner från grupper."
groupdel-success: "Regionen %lang:region% har tagits bort från gruppen '%0%', den här gruppen har nu %1% medlem(mar)."
groupdel-failed: "Regionen %lang:region% är inte medlem i någon grupp '%0%'."
groupdel-weSuccess: "Borttagen från gruppen %0%: [gray]%1%."
groupdel-weFailed: "Var inte i någon grupp %0% ändå: [gray]%1%."
grouplist-noPermission: "Du har inte rättigheterna att visa registrerade grupper."
grouplist-noGroups: "Det finns för närvarande inga grupper registrerade."
grouplist-success: "Följande grupper är registrerade: [gray]%0%."
groupinfo-help: "/as groupinfo <grupp>."
groupinfo-noPermission: "Du har inte rättigheterna att visa information om en grupp."
groupinfo-noGroup: "Det finns ingen grupp registrerad med namnet '%0%', använd /as grouplist för att kolla grupper."
groupinfo-members: "Följande regioner är medlemmar i gruppen %0%: [gray]%1%."
groupinfo-noMembers: "Gruppen %0% har inga medlemmar."
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
schemevent-wrongEvent: "Det specifierade eventet '%0%' existerar inte, använd ett av följande: [gray]%1%."
schemevent-success: "Eventet '%0%' har blivit triggat för regionen %lang:region%."
schemevent-noPermission: "Du har inte rättigheterna för att trigga ett schematiskt event."
add-help: "/as add <rent|buy> [region] [värld]."
add-noPermission: "Du har inte rättigheterna att lägga till regioner i AreaShop."
add-success: "Tillagd som %0%: [gray]%1%."
add-failed: "Redan registrerad: [gray]%0%."
add-blacklisted: "På svartlistan: [gray]%0%."
add-specifyWorld: "Specifiera världen för regionen när consolen används."
add-incorrectWorld: "Värld '%0%' hittades inte, Försök igen (skiftlägeskänsligt)."
add-noPermissionRegions: "Saknar rättighet att lägga till: [gray]%0%."
add-noPermissionOwnerMember: "[gray]Du är antingen inte medlem/ägare av dessa regioner eller så saknar du rättigheterna att lägga till dina regioner."
del-noPermission: "Du har inte rättigheterna att ta bort regioner."
del-success: "Borttagna regioner: [gray]%0%."
del-failed: "Ingen rättighet att ta bort eller inte registrerad: [gray]%0%."
addsign-help: "/as addsign [region] [profil]."
addsign-noSign: "Du tittar inte på en skylt."
addsign-noRegions: "Ingen region hittades runt skyltens position."
addsign-couldNotDetect: "Hittade flera regioner runt skylten, specifiera regionen med et extra argument (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
addsign-couldNotDetectSign: "Hittade flera regioner runt skylten, specifiera regionen på andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
addsign-wrongProfile: "Den specifierade profilen existerar inte, använd ett av följande (kolla konfig): [gray]%0%."
addsign-profile:
- "[bold]%0%[/bold]"
- " hover: Skyltprofil %0%"
- " hover: %lang:action|Använd denna profil|%"
- " Kommando: /areashop linksigns %0%"
addsign-success: "Skylten har lagts till i %lang:region%."
addsign-successProfile: "Skylten har lagts till i %lang:region% med profil %0%."
addsign-alreadyRegistered: "Den skylten är redan registrerad för %lang:region%."
addsign-noPermission: "Du har inte rättigheterna för att lägga till en skylt."
delsign-noSign: "Du tittar inte på en skylt."
delsign-noPermission: "Du har inte rättigheterna att ta bort en skylt."
delsign-noRegion: "Den skylten tillhör inte en AreaShop region."
delsign-success: "Skylten har tagits bort från regionen %lang:region%."
me-noPermission: "Du har inte rättigheterna att kolla vilka regioner du har."
me-header: "Regioner för %lang:tPlayer|%0%|%:"
me-notAPlayer: "Du är inte en spelare så du kan inte ha någon region."
me-rentLine:
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
- "%timeleft% kvar"
- " hover: tills %until%"
- ")."
me-buyLine: "[darkgreen][bold]►[nollställ] %lang:region%."
me-friendLine:
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
- "ägd av %lang:player%"
- " hover: Du är tillagd som vän"
- ")."
me-nothing: "%lang:tPlayer|%0%|% har inte hyrt eller köpt någon region och är inte tillagd som vän i någon."
me-noPlayer: "%0% hittades inte, antagligen aldrig varit på servern."
me-clickHint: "[gray][italic]Klicka en regions namn för att se detaljer."
setowner-help: "/as setowner <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
setowner-noPermission: "Du har inte rättigheterna att bestämma ägare av en region."
setowner-noPermissionRent: "Du har inte rättigheterna att bestämma ägare av hyrda regioner."
setowner-noPermissionBuy: "Du har inte rättigheterna att bestämma ägare av köpta regioner."
setowner-notRegistered: "Den specifierade regionen är inte registrerad, ägare kan inte bestämmas."
setowner-noPlayer: "Kunde inte få fram UUID ab specifierad spelare: %0%."
setowner-succesRent: "Ägare av %lang:region% har ändrats till %lang:player%, hyrd till %until% (%timeleft% kvar)."
setowner-succesRentExtend: "Ägaren var redan %lang:player%, hyrtid utökad med '%duration%', hyrs nu till %until% (%timeleft% kvar)."
setowner-succesBuy: "Ägare av %lang:region% ändrad till %lang:player%."
resell-help: "/as resell <pris> [region], regionen du står i kommer användas om inte annan specifieras."
resell-wrongPrice: "'%0%' är inte ett giltigt pris."
resell-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
resell-notBought: "Du kan inte återsälja %lang:region% för den är inte såld än."
resell-success: "%lang:region% är satt till återsäljning för %resellprice%."
resell-noPermission: "Du har inte rättigheterna att sätta ut din region i återsäljningsläge."
resell-noPermissionOther: "Du har inte rättigheterna att sätta ut regioner i återsäljningsläge."
stopresell-help: "/as stopresell [region], regionen du står i kommer användas om inget annat specifieras."
stopresell-notRegistered: "Den specifierade regionen är inte registrerad: %0%."
stopresell-notResell: "Du kan inte avsluta en återsäljning av %lang:region% för den är inte i återsäljningsläge."
stopresell-success: "%lang:region% är återsatt i sålt läge."
stopresell-noPermission: "Du har inte rättigheterna att ändra tillbaka din region till sålt läge."
stopresell-noPermissionOther: "Du har inte rättigheterna att ändra tillbaka regioner till sålt läge."
addfriend-help: "/as addfriend <spelare> [region], regionen du står i kommer användas om ingen annan specifieras."
addfriend-noPermissionOther: "Du har inte rättigheterna att lägga till vänner i regioner som inte tillhör dig."
addfriend-noPermission: "Du har inte rättigheterna att lägga till vänner i dina regioner."
addfriend-successOther: "%lang:tPlayer|%0%|% har lagts till som vän i region %lang:region%."
addfriend-success: "%lang:tPlayer|%0%|% har lagts till som vän i din region %lang:region%."
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% är redan tillagd som vän i %lang:region%."
addfriend-self: "Att lägga till en ägare av en region som vän vore meningslöst."
addfriend-noOwner: "Du kan inte lägga till vänner till en region som saknar ägare."
addfriend-notVisited: "Du kan inte lägga till %0% för han har inte besökt servern ännu."
delfriend-help: "/as delfriend <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
delfriend-noPermissionOther: "Du har inte rättigheterna att ta bort vänner från regioner som inte tillhör dig."
delfriend-noPermission: "Du har inte rättigheterna att ta bort vänner från din region."
delfriend-successOther: "%lang:tPlayer|%0%|% har tagits bort som vän från region %lang:region%."
delfriend-success: "%lang:tPlayer|%0%|% har tagits bort som vän från din region %lang:region%."
delfriend-notAdded: "%lang:tPlayer|%0%|% är inte tillagd som vän i %lang:region%."
delfriend-noOwner: "Du kan inte ta bort en vän från en region som saknar ägare."
linksigns-multipleRegions: "Hittade flera regioner: [gray]%0%."
linksigns-multipleRegionsAdvice: "Klicka en annan gång för att försöka igen eller använd '/as linksigns' för att sluta."
linksigns-noRegions: "Hittade ingen AreaShop region åt det hållet din markör pekar, försäkra att regionen är tillagd i AreaShop [gray](maximalt avstånd 100 block)."
linksigns-regionFound: "Region %lang:region% har hittats, sikta mot en skylt och vänsterklicka för att länka den."
linksigns-signFound: "Hittade en skylt vid (%0%, %1%, %2%), sikta mot en region nu och högerklicka för att länka den."
linksigns-noSign: "Ingen skylt hittades åt det hållet din markering är vänd, försäkra dig att du har fri sikt mot en skylt och klicka igen [gray](maximalt avstånd 100 block)."
linksigns-alreadyRegistered: "Den skylten är redan registrerad för region %lang:region%, klicka igen för att välja en annan skylt."
linksigns-first: "Du har gått in i skylt-länknings läge."
linksigns-next: "[gray]Vänsterklicka för att välja en skylt, högerklicka för att välja en region, använd /as linksigns för att avsluta."
linksigns-noPermission: "Du har inte rättigheterna för att gå in i mass-länknings läge."
linksigns-stopped: "Avslutade skylt-länknings läge."
stack-help:
- "/as stack <mängd> <mellanrum> <namn> <rent|buy> [grupp].[break]"
- " [gray]<mängd> Antal regioner som kommer skapas.[break]"
- " [gray]<mellanrum> Avstånd i antal block mellan regionerna.[break]"
- " [gray]<namn> Namnet på regionerna (numrering kommer hamna efter det).[break]"
- " [gray]<rent|buy> Skapa hyr- eller köpregioner.[break]"
- " [gray][group] En grupp att lägga till de skapade regionerna i.[break]"
- " [gray]Regionerna kommer skapas åt det håll du är vänd åt."
stack-accepted: "Börjar skapa %0% %1% regioner med %2% block iemellan, namnen startar med %3% och har ett nummer efter sig.%4%"
stack-addToGroup: " Skapade regioner kommer läggas till i gruppen '%0%'."
stack-noPermission: "Du har inte rättigheterna att skapa och lägga till regioner i AreaShop i massläge."
stack-wrongAmount: "'%0%' är inte ett correct antal regioner."
stack-wrongGap: "'%0%' är inte ett correct nummer för antalet blocks mellanrum mellan regioner."
stack-noSelection: "Du har ingenting valt som visar var första regionen ska skapas."
stack-addStart: "[gray]Lägger till %0% regioner vid %1% per sekund."
setlandlord-help: "/as setlandlord <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
setlandlord-noPermission: "Du har inte rättigheterna att bestämma en hyresvärd för en region."
setlandlord-success: "%lang:landlord% har satts in som hyresvärd för %lang:region%."
message-help: "/as message <spelare> <meddelande...>"
message-noPermission: "Du har inte rättigheterna för att skicka AreaShop meddelanden."
message-notOnline: "%0% är inte online."
confirm-rent:
- "%lang:prefix%Är du säker på att du vill hyra %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att hyra %0%|%"
- " hover: %lang:action|Rent %0%|%"
- " command: /areashop rent %0%"
confirm-extend:
- "%lang:prefix%Är du säker på att du vill förlänga %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att förlänga %0%|%"
- " hover: %lang:action|Extend %0%|%"
- " command: /areashop rent %0%"
confirm-unrent:
- "%lang:prefix%Är du säker på att du vill sluta hyra %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sluta hyra %0%|%"
- " hover: %lang:action|Stop renting %0%|%"
- " command: /areashop unrent %0%"
confirm-buy:
- "%lang:prefix%Är du säker på att du vill köpa %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att köpa %0%|%"
- " hover: %lang:action|Buy %0%|%"
- " command: /areashop buy %0%"
confirm-sell:
- "%lang:prefix%Är du säker på att du vill sälja %lang:tRegion|%0%|%?[break]"
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sälja %0%|%"
- " hover: %lang:action|Sell %0%|%"
- " command: /areashop sell %0%"
timeleft-years: "%0% år"
timeleft-months: "%0% månader"
timeleft-days: "%0% dagar"
timeleft-hours: "%0% timmar"
timeleft-minutes: "%0% minuter"
timeleft-second: "%0% sekund"
timeleft-seconds: "%0% sekunder"
timeleft-ended: "Utgånget"
greeting-forrent: "%region% kan hyras för %price% per %duration%."
greeting-rented: "%region% hyrs av %player% fram till %until%."
greeting-forsale: "%region% kan köpas för %price%."
greeting-bought: "%region% är köpt av %player%."
greeting-resale: "%region% kan köpas för %resaleprice% av %player%."
-332
View File
@@ -1,332 +0,0 @@
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop ║
# ║ Language: Chinese (Taiwan), Version: V2.2.0, Percentage translated: 79% ║
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following: ║
# ║ 1: Make a copy of this file ║
# ║ 2: Rename it to <servername>.yml (don't use a language code as filename, could otherwise be overwritten in future updates) ║
# ║ 3: Change the 'language' setting in config.yml to '<servername>', do not include '.yml' ║
# ║ 4: Change the strings in the new file to your liking and save the file ║
# ║ 5: Use '/as reload' or reload/restart your server to see the changes ║
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
total-maximum: "你不能租賃或者購買總量超過 %0% 的土地(你已經擁有 %1% 的土地在群組 '%2%')"
cmd-notValid: "這個指令是無效的, 請使用 '/as help' 查詢更多資訊"
cmd-onlyByPlayer: "這個指令只能由玩家執行"
cmd-weOnlyByPlayer: "使用WorldEdit小木斧選擇區域只能由玩家來執行, 並指定區域名稱作為額外的參數"
cmd-noSelection: "不存在使用WorldEdit小木斧選擇的區域"
cmd-noRegionsFound: "在你的選擇區域中並沒有土地被本插件所註冊或紀錄"
cmd-noWERegionsFound: "在你的選擇區域中並沒有與WorldEdit小木斧選擇的區域相交"
cmd-noRegionsAtLocation: "你的位置並未找到任何土地, 請指定區域名稱作為額外的參數"
cmd-moreRegionsAtLocation: "你的位置有超過一個以上的土地, 請指定區域名稱作為額外的參數"
cmd-automaticRegionOnlyByPlayer: "只可能由玩家來執行自動確認土地的行為,請指定區域名稱作為額外的參數"
help-header: "幫助頁面,你可以執行的指令"
help-alias: "指令簡寫: /areashop, /as"
help-help: "&6/as help &7-&r 顯示幫助頁面"
help-info: "&6/as info &7-&r 當前土地的資訊"
help-rent: "&6/as rent &7-&r 租土地或延展你的租期"
help-buy: "&6/as buy &7-&r 購買該土地"
help-unrent: "&6/as unrent &7-&r 取消該土地租賃"
help-unrentOwn: "&6/as unrent &7-&r 取消你的土地租賃"
help-sell: "&6/as sell &7-&r 出售該土地"
help-sellOwn: "&6/as sell &7-&r 出售你的土地"
help-setrestore: "&6/as setrestore &7-&r 設定恢復開/關,並選擇文件"
help-setprice: "&6/as setprice &7-&r 修改土地的價錢"
help-setduration: "&6/as setduration &7-&r 修改該出租土地的租期"
help-teleport: "&6/as tp &7-&r 傳送到你購買/租賃的土地"
help-teleportAll: "&6/as tp &7-&r 傳送到該購買/租賃的土地"
help-setteleport: "&6/as settp &7-&r 設定你購買/租賃土地的傳送位置"
help-setteleportAll: "&6/as settp &7-&r 設定該土地的傳送位置"
help-find: "&6/as find &7-&r 尋找未被購買/租賃的土地"
help-groupadd: "&6/as groupadd &7-&r 增加一個土地到群組"
help-groupdel: "&6/as groupdel &7-&r 從群組中移除一個土地"
help-grouplist: "&6/as grouplist &7-&r 顯示所有已註冊的群組"
help-groupinfo: "&6/as groupinfo &7-&r 顯示該群組資訊"
help-schemevent: "&6/as schemevent &7-&r 為該土地觸發schematic"
help-add: "&6/as add &7-&r 註冊一個用來出售或出租的土地"
help-del: "&6/as del &7-&r 刪除一個已註冊的土地"
help-addsign: "&6/as addsign &7-&r 新增告示牌到現存的土地"
help-delsign: "&6/as delsign &7-&r 刪除你準心對準的告示牌"
help-me: "&6/as me &7-&r 檢查你所擁有的土地(包括到期土地)"
help-setowner: "&6/as setowner &7-&r 設定土地擁有人或延展租期"
help-resell: "&6/as resell &7-&r 將你所擁有土地之一設定為再出售"
help-resellAll: "&6/as resell &7-&r 將該土地設定為再出售"
help-stopResell: "&6/as stopresell &7-&r 將你所擁有土地之一設定為已出售"
help-stopResellAll: "&6/as stopresell &7-&r 將土地設定為已出售"
help-addFriend: "&6/as addfriend &7-&r 新增朋友到你的土地"
help-addFriendAll: "&6/as addfriend &7-&r 新增朋友到該土地"
help-delFriend: "&6/as delfriend &7-&r 從你的土地移除朋友"
help-delFriendAll: "&6/as delfriend &7-&r 從該土地移除朋友"
rent-help: "/as rent [regionname],若你不指定土地名稱,則預設為你所站立的土地"
rent-noPermission: "你並沒有租賃土地的權限"
rent-maximum: "你不能租總量超過%0%的土地 (你已經擁有%1%的土地在群組 '%2%')"
rent-payError: "交易發生問題,請稍後再嘗試"
rent-rented: "你已成功租賃%0%直到 %1%"
rent-extended: "你已經延展你的租期%0%直到%1%"
rent-extend: "你可以右鍵點擊告示牌來延展你的租期或者使用 /as rent"
rent-lowMoneyExtend: "你沒有足夠的錢來延展你的租期(你擁有%0%而你還需要%1%)"
rent-lowMoneyRent: "你沒有足夠的錢租賃該土地(你擁有%0%而你還需要%1%)"
rent-someoneElse: "其他人已經租賃該土地"
rent-notRentable: "該土地不能租賃"
rent-maxExtends: "你已經無法再延展你的租期了(最大上限次數為%0%次), 然而在租期過後你可以再次租賃該土地"
rent-maxRentTime: "你無法提前租賃該土地,最大上限時間為 %0% 分鐘,而你目前已經租賃該土地 %1% 分鐘"
rent-restrictedToWorld: "你必須要在 '%0%'世界才能租賃該土地(你目前正在 '%1%')"
rent-restrictedToRegion: "你必須要在 '%0%'才能租賃該土地"
rent-expireWarning: "你的土地 %region% 還剩下%timeleft% ,如果你還想保留該土地請延展租期"
buy-help: "/as buy [regionname],若你不指定土地名稱,則預設為你所站立的土地"
buy-noPermission: "你並沒有購買土地的權限"
buy-notBuyable: "該土地不能購買"
buy-maximum: "你不能購買超過 %0% 的土地(你已經擁有 %1% 的土地在群組 '%2%')"
buy-payError: "交易發生問題,請稍後再嘗試"
buy-succes: "你已成功購買 %0%"
buy-successResale: "你已成功自%1%購買 %0%"
buy-successSeller: "你的土地 %0% 已經出售給 %1% ,共 %2%"
buy-lowMoney: "你沒有足夠的錢購買該土地(你擁有 %0% 而你還需要 %1%)"
buy-yours: "你已經擁有該土地了"
buy-someoneElse: "其他人已經購買該土地"
buy-restrictedToWorld: "你必須要在 '%0%'世界才能購買該土地 (你目前正在 '%1%')"
buy-restrictedToRegion: "你必須要在 '%0%'才能購買該土地"
unrent-help: "/as unrent [regionname],若你不指定土地名稱,則預設為你所站立的土地"
unrent-noPermission: "你並沒有取消出租土地的權限"
unrent-noPermissionOther: "你並沒有取消出租其他土地的權限"
unrent-unrented: "你的土地已經被取消出租"
unrent-other: "玩家%0%土地已經被取消出租"
unrent-expired: "你所租賃的%0%已經過期"
sell-help: "/as sell [regionname],若你不指定土地名稱,則預設為你所站立的土地"
sell-sold: "該土地已被出售,玩家 %0%"
sell-soldYours: "你的土地已經被購買"
sell-noPermission: "你並沒有出售土地的權限"
sell-noPermissionOther: "你並沒有出售其他土地的權限"
info-noPermission: "你沒有權限查詢該土地資訊"
info-all-rents: "已註冊為出租土地:&7%0%"
info-all-noRents: "沒有任何註冊的出租土地"
info-all-buys: "已註冊為出售土地:&7%0%"
info-all-noBuys: "沒有任何註冊的出售土地"
info-rented: "租賃土地:&7%0%"
info-noRented: "沒有已租的土地"
info-unrented: "未出租的土地:&7%0%"
info-noUnrented: "所有土地已出租"
info-sold: "已出售土地:&7%0%"
info-noSold: "沒有已售的土地"
info-forsale: "出售的土地:&7%0%"
info-noForsale: "所有土地已售完"
info-playerHelp: "/as info player <name>"
info-playerRents: "土地已出租給%0%: &7%1%"
info-playerNoRents: "%0%並沒有租土地"
info-playerBuys: "土地已出售給 %0%: &7%1%"
info-playerNoBuys: "%0% 並沒有買土地"
info-regionHelp: "/as info region [name],若你不指定土地名稱,則預設為你所站立的土地"
info-regionHeaderRent: "&2資訊關於 %region%:"
info-regionHeaderBuy: "&2資訊關於 %region%:"
info-regionRented: "&2&l►&r 出租給 %player% until: &7%until%"
info-regionBought: "&2&l►&r 出售給 %player%"
info-regionExtending: "&2&l►&r 延展租期價格: &7%price% per %duration%"
info-regionCanBeRented: "&2&l►&r 租金: &7%price% per %duration%"
info-regionCanBeBought: "&2&l►&r 購買價格: &7%price%"
info-regionFriends: "&2&l►&r 增加朋友: &7%friends%"
info-regionMoneyBackBuy: "&2&l►&r 再售的回收價格: &7%moneyback% (%moneybackpercent%% 價格)"
info-regionMoneyBackRent: "&2&l►&r 取消租賃的回收價格: &7%moneyback% (%moneybackpercent%% 剩餘的出租時間)"
info-regionNoExtending: "&2&l►&r 租期無法延展"
info-regionMaxRentTime: "&2&l►&r 提前租賃: &7%maxrenttime% at 最大數目"
info-regionNoTeleport: "&2&l►&r 傳送地點未設定%0%"
info-regionTeleportHint: "&7(使用 '/as settp' 到一個更好的位置)"
info-regionTeleportAt: "&2&l►&r 傳送地點設定在: &7(%0%, %1%, %2%, %3%, pitch:%4%, yaw:%5%)"
info-regionSigns: "&2&l►&r 有連結的告示牌: &7%0%"
info-regionSignLocation: "&7(%0%, %1%, %2%, %3%)&r"
info-regionGroups: "&2&l►&r 登記群組: &7%0%"
info-regionInactiveUnrent: "&2&l►&r 玩家閒置而自動取消租賃的時間為: &7%inactivetime% of"
info-regionInactiveSell: "&2&l►&r 玩家閒置而自動出售的時間為: &7%inactivetime% of"
info-regionRestoringRent: "&2&l►&r 重製啟用 &7(土地將被重新設為未被租賃)%0%"
info-regionRestoringBuy: "&2&l►&r 重製啟用 &7(土地將被重新設為出售)%0%"
info-regionRestoringProfile: "(資料: %0%)"
info-regionNoSign: "該土地沒有被註冊的告示牌"
info-regionPriceDuration: "價格:每一個 %1% 為&7%0%"
info-regionPrice: "價格: &7%0%"
info-regionRestore: "重製啟用: &7%0%"
info-regionRestoreProfile: "重製資料:&7%0%"
info-regionTPLocation: "傳送地點: &7World=%0%, X=%1%, Y=%2%, Z=%3%, Pitch=%4%, Yaw=%5%"
info-regionNoTP: "沒有設定的傳送地點"
setrestore-help: "/as setrestore <region> <true|false|general> [profile]"
setrestore-noPermission: "你沒有權限修改重製設定"
setrestore-invalidSetting: "'%0%' 不是有效的狀態, 必須為 true, false 或 general"
setrestore-success: "成功設定為重製設定,由 %0% 至 '%1%'"
setrestore-successProfile: "成功設定重製由 %0% 至 '%1%' 而資料至 '%2%'"
setprice-noPermission: "你沒有權限修改土地價格"
setprice-help: "/as setprice <price> [region], 若你不指定土地名稱,則預設為你所站立的土地"
setprice-wrongPrice: "'%0%' 不是有效的價格"
setprice-successRent: "土地價格由 %0% 修改至 %1% ,個別價格為 %2%"
setprice-successBuy: "土地價格由 %0% 修改至 %1%"
setduration-noPermission: "你沒有權限修改租期"
setduration-help: "/as setduration <amount> <identifier> [region], 若你不指定土地名稱,則預設為你所站立的土地"
setduration-wrongAmount: "'%0%' 不是有效的總數, 請使用完整的數目"
setduration-wrongFormat: "'%0%' 不是適當的時間格式, 請查詢官網"
setduration-success: "土地租期由 %0% 修改至 '%1%'"
setup-noRegion: "你並未特定土地名稱在第二行"
setup-wrongRegion: "你所指定的土地名稱並不存在"
setup-noDuration: "你並未指定該土地出租期間, 請打在告示牌第三行"
setup-wrongDuration: "你所指定的土地出租期間不是適當的時間格式, 例子: 1 day是一天"
setup-noPrice: "你第四行並未指定該土地的價格"
setup-rentSuccess: "出租土地 %0% 已正確設置"
setup-buySuccess: "出售土地 %0% 已正確設置"
setup-couldNotDetect: "已超過一個以上的區域, 為避免重複請在第二行指定一個土地 (2個區域被發現: %0% 及 %1%)"
teleport-help: "/as tp <region> [sign]"
teleport-noPermission: "你沒有權限傳送到你的土地"
teleport-noPermissionOther: "你沒有權限傳送到不屬於你的土地"
teleport-noPermissionSign: "你沒有權限傳送到你的土地上的告示牌"
teleport-noPermissionOtherSign: "你沒有權限傳送到不屬於你的土地上的告示牌"
teleport-success: "你傳送至 %0%"
teleport-successSign: "你傳送到告示牌 %0%"
teleport-noSafe: "土地 %0%沒有安全的傳送地點, 沒有找到其餘傳送點或已超過最大的嘗試次數 (%1%/%2%)"
setteleport-help: "/as settp [region] [reset], 若你不指定土地名稱,則預設為你所站立的土地"
setteleport-noPermission: "你沒有權限設置傳送地點"
setteleport-noPermissionOther: "你沒有權限設置不屬於你的土地的傳送地點"
setteleport-success: "傳送地點 %0% 已設置"
setteleport-notInside: "傳送地點必須在土地範圍內"
setteleport-reset: "傳送地點 %0% 已重新設置"
find-help: "/as find <buy|rent> [maxprice] [group]"
find-noPermission: "你沒有權限搜尋土地並傳送到該土地"
find-success: "已搜尋到 %0% 土地: %1%, 並且依你的帳戶金額與最高金額: %2%%3%"
find-successMax: "已搜尋到 %0% 土地: %1%, 並且依最高金額 %2%%3%"
find-wrongMaxPrice: "你特定的最高金額並非有效數目: %0%"
find-wrongGroup: "你特定的群組並未存在: %0%"
find-noneFound: "依你的帳戶金額與最高金額,沒有 %0% 土地符合你的搜尋條件: %1%%2%"
find-noneFoundMax: "依最高金額,沒有 %0% 土地符合你的搜尋條件, 最高金額%1%%2%"
find-onlyInGroup: ", 限搜尋該群組的土地: %0%"
groupadd-help: "/as groupadd <group> [region], 若你不指定土地名稱,則預設為小木斧所選擇的土地"
groupadd-noPermission: "你沒有權限設置土地到群組"
groupadd-noRegion: "該指定土地並未被註冊: %0%"
groupadd-success: "土地 %0% 已被加入群組 '%1%', 該群組目前擁有%2% 土地(s)"
groupadd-failed: "土地 %0% 已經是群組的土地 '%1%'"
groupadd-weSuccess: "加入群組 %0%: &7%1%"
groupadd-weFailed: "已經被加入群組 %0%: &7%1%"
groupdel-help: "/as groupdel <group> [region], 若你不指定土地名稱,則預設為小木斧所選擇的土地"
groupdel-noPermission: "你沒有權限設置土地移出群組"
groupdel-noRegion: "該指定土地並未被註冊: %0%"
groupdel-success: "土地 %0% 已被移出群組 '%1%', 該群組目前擁有 %2% 土地(s)"
groupdel-failed: "土地 %0% 不是群組的土地 '%1%'"
groupdel-weSuccess: "被移出群組 %0%: &7%1%"
groupdel-weFailed: "並不在群組 %0% anyway: &7%1%"
grouplist-noPermission: "你沒有權限查看註冊群組"
grouplist-noGroups: "目前並無任何註冊群組"
grouplist-success: "以下為註冊群組: &7%0%"
groupinfo-help: "/as groupinfo <group>"
groupinfo-noPermission: "你沒有權限查看群組資訊"
groupinfo-noGroup: "沒有註冊群組名稱為 '%0%', 使用 /as grouplist 查看群組列表"
groupinfo-members: "以下土地為該群組 %0%所有: &7%1%"
groupinfo-noMembers: "群組 %0% 沒有任何土地"
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
schemevent-noRegion: "該指定土地並未被註冊: %0%"
schemevent-wrongEvent: "該特定事件 '%0%' 並不存在, 請使用其中之一: &7%1%"
schemevent-success: "事件 '%0%' 已成功在該土地觸發 %1%"
schemevent-noPermission: "你沒有權限觸發schematic"
add-help: "/as add <rent|buy> [region] [world]"
add-noPermission: "你沒有權限新增土地"
add-success: "新增為 %0%: &7%1%"
add-failed: "已經註冊: &7%0%"
add-specifyWorld: "當使用console操作時請指定該世界土地"
add-incorrectWorld: "世界 '%0%' 搜尋失敗, 請再嘗試一次(依照個案)"
add-noRegion: "土地 '%0%' 並不存在該世界"
del-noPermission: "你沒有權限移除土地"
del-success: "移除土地: &7%0%"
del-failed: "沒有權限移除土地或未被註冊: &7%0%"
addsign-help: "/as addsign [region] [profile]"
addsign-noSign: "你並沒有注視一個告示牌"
addsign-noRegion: "土地 '%0%' 並未被搜尋到"
addsign-noRegions: "該告示牌的位置並未有任何土地存在"
addsign-couldNotDetect: "超過一個以上的區域在告示牌的位置, 為避免重複請指定一個土地 (2個的區域被發現: %0% and %1%)"
addsign-couldNotDetectSign: "超過一個以上的區域在告示牌的位置, 為避免重複請在第二行指定一個土地 (2個的區域被發現: %0% and %1%)"
addsign-wrongProfile: "指定資料並不存在, 請使用以下之一 (查詢你的config檔案): &7%0%"
addsign-alreadyRegistered: "該告示牌已經被註冊在土地 %0%"
addsign-noPermission: "你沒有權限新增告示牌"
delsign-noSign: "你並沒有注視一個告示牌"
delsign-noPermission: "你沒有權限移除告示牌"
delsign-noRegion: "該告示牌並不屬於本插件的土地"
delsign-success: "該告示牌已經從土地 %0%被移除"
me-noPermission: "你沒有權限查詢你所擁有土地"
me-notAPlayer: "你並不能擁有土地,因為你並非玩家"
me-noRentRegions: "你並未租賃任何出租土地"
me-noBuyRegions: "你並未購買任何出售土地"
me-rentRegions: "你所租賃的土地:"
me-buyRegions: "你所購買的土地"
me-rentLine: "&2&l►&r %region% until %until% &7(%timeleft% 剩餘時間)"
me-buyLine: "&2&l►&r %region%"
me-friendLine: "&2&l►&r %region% &7(所有人: %player%)"
setowner-help: "/as setowner <player> [region], 若你不指定土地名稱,則預設為你所站立的土地"
setowner-noPermission: "你沒有權限設置土地擁有人"
setowner-noPermissionRent: "你沒有權限設置出租土地擁有人"
setowner-noPermissionBuy: "你沒有權限設置出售土地擁有人"
setowner-notRegistered: "你指定的土地未被註冊, 因此不能設置土地擁有人"
setowner-noPlayer: "無法取得指定玩家的UUID: %0%"
setowner-succesRent: "%region% s擁有人成功改為 %player%, 租期直到 %until% (%timeleft% 剩餘時間)"
setowner-succesRentExtend: "擁有人已為 %player%, 租期延長至 '%duration%', 現在租期到 %until% (%timeleft% 剩餘時間)"
setowner-succesBuy: "%region% s擁有人成功改為 %player%"
resell-help: "/as resell <price> [region], 若你不指定土地名稱,則預設為你所站立的土地"
resell-wrongPrice: "'%0%' 並不是有效價格數目"
resell-noRegionFound: "你的位置並不存在任何土地, 請特定該土地名稱"
resell-notBought: "你無法重新出售 %region% ,因為它並未被買走"
resell-success: "%region% i成功的重新出售,價格為 %resellprice%"
resell-noPermission: "你沒有權限設置你的土地重新出售"
resell-noPermissionOther: "你沒有權限設置土地重新出售"
stopresell-help: "/as stopresell [region], 若你不指定土地名稱,則預設為你所站立的土地"
stopresell-noRegionFound: "你的位置並不存在任何土地, 請特定該土地名稱"
stopresell-notResell: "你無法停止重新出售土地 %region% 因為它並未重新出售"
stopresell-success: "%region% 成功的設置為出售中"
stopresell-noPermission: "你沒有權限設置你的土地為出售"
stopresell-noPermissionOther: "你沒有權限設置土地為出售"
addfriend-help: "/as addfriend <player> [region], 若你不指定土地名稱,則預設為你所站立的土地"
addfriend-noPermissionOther: "你沒有權限新增朋友到不屬於你的土地上"
addfriend-noPermission: "你沒有權限新增朋友到屬於你的土地上"
addfriend-successOther: "%0% 已經成功被新增為 %1%土地的朋友名單"
addfriend-success: "%0% 已經成功被新增為你的土地 %1%的朋友名單"
addfriend-alreadyAdded: "%0% 已經被新增到你的土地的朋友名單了"
addfriend-self: "新增本土地擁有人到朋友名單是無意義"
addfriend-noOwner: "沒有擁有人,你不能新增朋友到朋友名單"
delfriend-help: "/as delfriend <player> [region], 若你不指定土地名稱,則預設為你所站立的土地"
delfriend-noPermissionOther: "你沒有權限在不屬於你的土地上移除其朋友"
delfriend-noPermission: "你沒有權限在屬於你的土地上移除朋友"
delfriend-successOther: "%0% 已經成功被移除,土地 %1%"
delfriend-success: "%0% 已經成功被移除出你的土地 %1%的朋友名單"
delfriend-notAdded: "%0% 從來沒被加入該土地朋友名單"
delfriend-noOwner: "沒有擁有人,你不能移除朋友"
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% c可以被租賃,價格為 %price% p期間為 %duration%"
greeting-rented: "%region% i已經租給 %player% u直到 %until%"
greeting-forsale: "%region% c可以購買,價格為 %price%"
greeting-bought: "%region% i已經賣給 %player%"
greeting-resale: "%region% c可以購買,價格為 %resaleprice% f賣家為 %player%"
+25 -6
View File
@@ -1,11 +1,11 @@
name: AreaShop
main: nl.evolutioncoding.areashop.AreaShop
version: ${project.version}
name: AreaShop
main: me.wiefferink.areashop.AreaShop
version: "${project.version}${build.number}"
description: "Selling and renting WorldGuard regions to your players, highly configurable."
depend: [Vault, WorldGuard, WorldEdit]
softdepend: [Multiverse-Core]
author: NLThijs48
website: http://dev.bukkit.org/bukkit-plugins/regionbuyandrent/
website: https://github.com/NLthijs48/AreaShop
commands:
AreaShop:
description: 'For all commands use /as help.'
@@ -22,6 +22,8 @@ permissions:
areashop.destroybuy: true
areashop.rent: true
areashop.buy: true
areashop.buyresell: true
areashop.buynormal: true
areashop.unrent: true
areashop.info: true
areashop.reload: true
@@ -53,6 +55,8 @@ permissions:
areashop.notifyupdate: true
areashop.stack: true
areashop.setlandlord: true
areashop.linksigns: true
areashop.message: true
areashop.landlord.*:
description: Give access to all landlord features
children:
@@ -71,6 +75,12 @@ permissions:
areashop.buy:
description: Allows you to buy a region
default: true
areashop.buyresell:
description: Allows you to buy a region that is in resell mode
default: true
areashop.buynormal:
description: Allows you to buy a region that is not in resell mode
default: true
areashop.unrent:
description: Allows you to unrent a specific region
default: op
@@ -152,6 +162,12 @@ permissions:
areashop.teleportfriendsign:
description: Teleport to the sign of regions where you are added as friend
default: true
areashop.teleportavailable:
description: Teleport to regions which are available
default: true
areashop.teleportavailablesign:
description: Teleport to the sign of regions which are available
default: true
areashop.setteleport:
description: Set the teleport spot for your region
default: true
@@ -227,10 +243,10 @@ permissions:
areashop.addfriendall:
description: Allows you to add friends to all regions
default: op
areashop.delfriend:
areashop.delfriend:
description: Allows you to delete friends from your regions
default: true
areashop.delfriendall:
areashop.delfriendall:
description: Allows you to delete friends from all regions
default: op
areashop.notifyupdate:
@@ -244,4 +260,7 @@ permissions:
default: op
areashop.setlandlord:
description: Allows you to set the landlord of a region, the landlord receives all revenue
default: op
areashop.message:
description: Allows you to send AreaShop messages to players
default: op
+24
View File
@@ -0,0 +1,24 @@
#### Current behavior
<!--- Tell what happens currently -->
#### New behavior
<!--- Tell what should happen (or what should be added) -->
#### Steps to reproduce (for bugs)
<!--- Exactly show how this bug can be triggered -->
1.
2.
3.
4.
#### Your environment
<!--- Indicate which versions you use (latest is NOT a version) -->
* Server platform (Bukkit, Spigot, etc.):
* Server version:
* AreaShop version:
* WorldEdit version:
* WorldGuard version:
* Vault version:
Loaded 100 of 120 files, more files were not shown because too many files have changed in this diff. Show more