mirror of
https://github.com/md5sha256/AreaShop.git
synced 2026-11-07 01:42:34 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
769f8ee4ca | ||
|
|
2c04b87a9f | ||
|
|
8ce1ed0264 | ||
|
|
035f8e1932 | ||
|
|
4d3482994f | ||
|
|
45f1c510e5 | ||
|
|
5c13223b9e | ||
|
|
8c47ae9b3c | ||
|
|
28d03a6a3a | ||
|
|
aa585e9b11 | ||
|
|
36d2ce60b9 | ||
|
|
bdea9448a4 | ||
|
|
bd2f40f5c8 | ||
|
|
9e908cee73 | ||
|
|
0d326d973d | ||
|
|
27eaa27765 | ||
|
|
fb35153eb2 | ||
|
|
aec6295516 | ||
|
|
38cd77e487 | ||
|
|
6b9866a4c4 | ||
|
|
5aceb81cfd | ||
|
|
50f6bce64e | ||
|
|
f713edc5b5 | ||
|
|
012920a51c | ||
|
|
6154454f96 | ||
|
|
e34daeb5ff | ||
|
|
0a2dc22c59 | ||
|
|
2482bd88c2 | ||
|
|
e86281ab28 | ||
|
|
5a9ca74b75 | ||
|
|
d301be2304 | ||
|
|
a23c6fa66f | ||
|
|
cd63517041 | ||
|
|
e3043c476b | ||
|
|
3be7573863 | ||
|
|
51161fffee | ||
|
|
c82067ad0b | ||
|
|
46dbb8d22c | ||
|
|
cace086466 | ||
|
|
06a716b1fd | ||
|
|
4530717045 | ||
|
|
741bbd879f | ||
|
|
8474edd29d | ||
|
|
d4df691166 | ||
|
|
3e247e6cb1 | ||
|
|
f3527134e8 | ||
|
|
0e14b121b8 | ||
|
|
8cc632fc05 | ||
|
|
77c1b3f288 | ||
|
|
21339cbf7c | ||
|
|
0351188671 | ||
|
|
47e1d80821 | ||
|
|
1d0472b052 | ||
|
|
22dcfc76af | ||
|
|
6b59176048 | ||
|
|
5dc4d11408 | ||
|
|
00bd305381 | ||
|
|
9daa50b23b | ||
|
|
33b73a0369 | ||
|
|
591540af30 | ||
|
|
4e1e50e993 | ||
|
|
9a52ca3d9b | ||
|
|
858b019806 | ||
|
|
b1dfe93088 | ||
|
|
0bf2314f2a | ||
|
|
33ddb8ae88 | ||
|
|
234e4b6261 | ||
|
|
ed2ffaeaa3 | ||
|
|
e073438862 | ||
|
|
07194f07da | ||
|
|
dfa3e0be66 | ||
|
|
8eef029400 | ||
|
|
c8d869ce15 | ||
|
|
053d75181d | ||
|
|
f0128c221b | ||
|
|
ce6c01c5d0 | ||
|
|
b835c4dded | ||
|
|
07e6782714 | ||
|
|
4002956aeb | ||
|
|
0b96b9cb42 | ||
|
|
0c192c2444 | ||
|
|
2381aaeacc | ||
|
|
906b331758 | ||
|
|
f0f2e09be0 | ||
|
|
395cc6de07 | ||
|
|
3b9d6187ca | ||
|
|
9d1585f513 | ||
|
|
9d6955039a | ||
|
|
747b47057b | ||
|
|
a973e254e6 | ||
|
|
a5105af3ad | ||
|
|
0bb0a05b76 | ||
|
|
dad502ec0c | ||
|
|
f471b9bbf0 | ||
|
|
f69d1c41e6 | ||
|
|
4ea6f59c49 | ||
|
|
0b7158290f | ||
|
|
e6757d23de | ||
|
|
7cda35f4da | ||
|
|
ee293d14b9 | ||
|
|
2e0fce4955 | ||
|
|
7afdefc9ed | ||
|
|
11f80e7ed1 | ||
|
|
40d45c7786 | ||
|
|
6b8e161e43 | ||
|
|
e1b2f7391c | ||
|
|
89ae8b9b4a | ||
|
|
fab415bf19 | ||
|
|
c7aa92be81 | ||
|
|
705c8d6891 | ||
|
|
429d87c9ff | ||
|
|
1fdd8b32cc | ||
|
|
7900f78a8c | ||
|
|
3a65a88849 | ||
|
|
7b491d0389 | ||
|
|
fd02c51492 | ||
|
|
bb1f592807 | ||
|
|
16c7a044ea | ||
|
|
152f183670 | ||
|
|
09b6e4c584 | ||
|
|
aeb70196a3 | ||
|
|
62148ea577 | ||
|
|
fcc9fb0945 | ||
|
|
b525c5902c | ||
|
|
b18a7cc6d5 | ||
|
|
54b6e84558 | ||
|
|
bae3c0a199 | ||
|
|
508270a280 | ||
|
|
87b2cb9ecd | ||
|
|
271b17b6be | ||
|
|
1dfedea50c | ||
|
|
d9abe2e347 | ||
|
|
1ba2e21ae9 | ||
|
|
fcdfdc6094 | ||
|
|
8a7e2ba5c2 | ||
|
|
0950452692 | ||
|
|
293978f068 | ||
|
|
5efe14b8e9 | ||
|
|
839d510151 | ||
|
|
9180d9b8ee | ||
|
|
7aa786f4ce | ||
|
|
10ea8540e7 | ||
|
|
dba00769f6 | ||
|
|
44c70c6a33 | ||
|
|
570f7b4055 | ||
|
|
feafa012dd | ||
|
|
82b340ce1a | ||
|
|
93809f27fc | ||
|
|
f8ed3654fd | ||
|
|
58a1afccf3 | ||
|
|
d9c3573225 | ||
|
|
1577443203 | ||
|
|
ab7a92c57d | ||
|
|
2e09b0f60f | ||
|
|
6e5c35f95b | ||
|
|
066ceedafd | ||
|
|
c8ebe24bd3 | ||
|
|
ad7db5ee23 | ||
|
|
f80a8178ff | ||
|
|
05c8e1a7e4 | ||
|
|
9904805310 | ||
|
|
0df2f429c0 | ||
|
|
b3408a2648 | ||
|
|
e1f89e7904 | ||
|
|
064b129205 | ||
|
|
8111387f32 | ||
|
|
a4b23bebba | ||
|
|
7421e685fa | ||
|
|
374b68d8fa | ||
|
|
ca7a9664f3 | ||
|
|
e957b4fc73 | ||
|
|
6493bc4f78 | ||
|
|
2db1b6a243 | ||
|
|
864662a3c4 | ||
|
|
59b960b87c | ||
|
|
2de653d73f | ||
|
|
4feee59834 | ||
|
|
816d136a62 | ||
|
|
121de7dc7e | ||
|
|
f7c86881cc | ||
|
|
351d51b664 | ||
|
|
5a28476cf0 | ||
|
|
8143bdae27 | ||
|
|
b62744fe10 | ||
|
|
fe0b63c760 | ||
|
|
def774c7a1 | ||
|
|
7c5cb5f5aa | ||
|
|
8af6e1d6f1 | ||
|
|
e0e6c39dae | ||
|
|
dabe46bd47 | ||
|
|
ec478a05d1 | ||
|
|
e21c0aafde | ||
|
|
52bf88f4a5 | ||
|
|
e4de560a65 | ||
|
|
6481da29e4 | ||
|
|
f287cc91a6 | ||
|
|
95b7b50346 | ||
|
|
21db2ff440 | ||
|
|
36dd978a92 | ||
|
|
6cc3f2a52f | ||
|
|
852731b1ad | ||
|
|
30faa77da9 | ||
|
|
ec57b922b8 | ||
|
|
c2bcc6008b | ||
|
|
72a05bedce | ||
|
|
bc73a8b20d | ||
|
|
832e8218b6 | ||
|
|
6fcb629133 | ||
|
|
7d6a1f35c1 | ||
|
|
60257d45c2 | ||
|
|
2300227d87 | ||
|
|
b1852b10bb | ||
|
|
88fdb0c3fc | ||
|
|
491e55fc77 | ||
|
|
c7b0a2c663 | ||
|
|
868f4d6b58 | ||
|
|
0d4b034181 | ||
|
|
5f20689ba3 | ||
|
|
38b658fccf | ||
|
|
28ed20c0b5 | ||
|
|
aaff36b2eb | ||
|
|
49b536cab0 | ||
|
|
9a9969dea3 | ||
|
|
84e4b49bfd | ||
|
|
6daaf6997d | ||
|
|
c445a62334 | ||
|
|
0d205b0d9e | ||
|
|
8c33826c2c | ||
|
|
51e1dbafb7 | ||
|
|
6edad3faff | ||
|
|
f89e0f861b | ||
|
|
770b1d98df | ||
|
|
8e5baa47af | ||
|
|
367466735e | ||
|
|
ade6bc3971 | ||
|
|
05fd8c0156 | ||
|
|
5403472476 | ||
|
|
c4ee7bc7aa | ||
|
|
940f1969b6 | ||
|
|
07eb5477b8 | ||
|
|
a4112092b5 | ||
|
|
872d81b0a9 | ||
|
|
b04871c553 | ||
|
|
fd1b8fba4c | ||
|
|
991e7b1961 | ||
|
|
aac963325a | ||
|
|
3e7c7ce76b | ||
|
|
c858d30481 | ||
|
|
b090fd5577 | ||
|
|
8d132c66c4 | ||
|
|
50e3e59543 | ||
|
|
eb21b9567e | ||
|
|
4dba305f6d | ||
|
|
7481d8287f | ||
|
|
4d41decbe5 | ||
|
|
7fc5a5af81 | ||
|
|
d26fa99b95 | ||
|
|
39d755d2db | ||
|
|
48ab46ecf7 | ||
|
|
b3fa31e1cc | ||
|
|
783085fbf7 | ||
|
|
aa093b0c8a | ||
|
|
9c357fe929 | ||
|
|
4d70571a23 | ||
|
|
29a4105ece | ||
|
|
edc7136063 | ||
|
|
6fabc75be4 | ||
|
|
085507bf8b | ||
|
|
73ed3366ae | ||
|
|
9ca029176d | ||
|
|
bf181d69d7 | ||
|
|
68c57515da | ||
|
|
903d6c309f | ||
|
|
0a02eb3254 | ||
|
|
bf04589fab | ||
|
|
14dd094803 | ||
|
|
02df35304c | ||
|
|
4321667ec5 | ||
|
|
5cf5df78c8 | ||
|
|
8608d6ce1d | ||
|
|
614336862e | ||
|
|
a4ea175f1b | ||
|
|
c96043aa38 | ||
|
|
d5a29f6c32 | ||
|
|
5176a1c2c5 | ||
|
|
89569ea182 | ||
|
|
f349657a59 | ||
|
|
40d3d4d8af | ||
|
|
0d5db8fa4e | ||
|
|
25c56e8ecb | ||
|
|
9f436a7eb4 | ||
|
|
f76c1b8a9f | ||
|
|
d466658f36 | ||
|
|
04e02c4ce4 | ||
|
|
3bf493109c | ||
|
|
2f9b6d3987 | ||
|
|
93d5612513 | ||
|
|
937db4620d | ||
|
|
a0239b8837 | ||
|
|
401f52e687 | ||
|
|
2f6874a16e | ||
|
|
c95f4e1c6c | ||
|
|
1a2d755727 | ||
|
|
c489e6eba4 | ||
|
|
b1a56b5230 | ||
|
|
dfbc7805b5 | ||
|
|
8f2c95f5c4 | ||
|
|
0b9bffe68f | ||
|
|
7ac6e34c89 | ||
|
|
5231f6e86e | ||
|
|
791b696aff | ||
|
|
c92bc716dc | ||
|
|
463b34e952 | ||
|
|
ff6e69196d | ||
|
|
76ad952bb6 | ||
|
|
0cdff5e143 | ||
|
|
9dc3013215 | ||
|
|
796b95c9f9 | ||
|
|
2785a72457 | ||
|
|
c2df0cd912 | ||
|
|
4cd32a0792 | ||
|
|
354e70af57 | ||
|
|
fde60e2a27 | ||
|
|
d1a3027e0b | ||
|
|
4e57f03fc0 | ||
|
|
83d4efc3a8 | ||
|
|
1395afffe9 | ||
|
|
5094d39a96 | ||
|
|
e664c1efd9 | ||
|
|
871eeed29c | ||
|
|
0d56762bfc | ||
|
|
c08763883f | ||
|
|
efb534f131 | ||
|
|
d9405a9f49 | ||
|
|
684add89cd | ||
|
|
d1848c0728 | ||
|
|
9fd16290c0 | ||
|
|
3bbca11cc9 | ||
|
|
b1be87014f | ||
|
|
badcd77cfe | ||
|
|
779d340bbb | ||
|
|
4e5061ba54 | ||
|
|
b0f3bdc560 | ||
|
|
5c9fdb6cc9 | ||
|
|
23ea679cd9 | ||
|
|
58680c8cc4 | ||
|
|
75b752a235 | ||
|
|
fb51da84ae | ||
|
|
22d214e59d | ||
|
|
175b531eb5 | ||
|
|
52591d3b6e | ||
|
|
825074479c | ||
|
|
cc8cf1e560 | ||
|
|
a4169d127e | ||
|
|
21340af89f | ||
|
|
db06eae6c9 | ||
|
|
5bae5ecf67 | ||
|
|
679ffe2145 | ||
|
|
e6c5653073 | ||
|
|
ea31dfdd65 | ||
|
|
9da31fed1f | ||
|
|
9baf0b7eec | ||
|
|
a14dc4e541 | ||
|
|
00d3256716 | ||
|
|
40338b66df |
No files matched your search
@@ -0,0 +1,36 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Report a problem in the plugin
|
||||
|
||||
---
|
||||
|
||||
**Current behavior**
|
||||
<!--- Tell what happens currently and/or show the stacktrace if an error occured -->
|
||||
|
||||
|
||||
**Expected behavior**
|
||||
<!--- Tell what you expected to happen instead -->
|
||||
|
||||
|
||||
**Steps to reproduce**
|
||||
<!--- Exactly show how this bug can be triggered -->
|
||||
1.
|
||||
2.
|
||||
3.
|
||||
4.
|
||||
|
||||
|
||||
**Your environment**
|
||||
<!--- Indicate which versions you use -->
|
||||
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
|
||||
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
|
||||
* Server platform (Bukkit, Spigot, etc.):
|
||||
* Server version:
|
||||
* AreaShop version:
|
||||
* WorldEdit version:
|
||||
* WorldGuard version:
|
||||
* Vault version:
|
||||
|
||||
|
||||
**Your config files**
|
||||
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
|
||||
@@ -0,0 +1,12 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea
|
||||
|
||||
---
|
||||
|
||||
**Describe the problem you are trying to solve with this feature request**
|
||||
<!-- When I know the problem you are trying to solve I can help you to think about the best solution -->
|
||||
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- Describe the config settings, commands and other features that should be added -->
|
||||
@@ -0,0 +1,28 @@
|
||||
---
|
||||
name: Support question
|
||||
about: Ask help with the setup or usage of the plugin
|
||||
|
||||
---
|
||||
|
||||
**Current behavior**
|
||||
<!--- Tell what happens currently -->
|
||||
|
||||
|
||||
**Desired behavior**
|
||||
<!--- Tell what you want to happen instead -->
|
||||
|
||||
|
||||
**Your environment**
|
||||
<!--- Indicate which versions you use -->
|
||||
<!--- Attention: "LATEST" or "NEWEST" are invalid answers! -->
|
||||
<!--- Use '/version' for the Platform version and '/version <plugin>' for plugin versions -->
|
||||
* Server platform (Bukkit, Spigot, etc.):
|
||||
* Server version:
|
||||
* AreaShop version:
|
||||
* WorldEdit version:
|
||||
* WorldGuard version:
|
||||
* Vault version:
|
||||
|
||||
|
||||
**Your config files**
|
||||
<!--- Attach a '.zip' file of the '/plugins/AreaShop' and '/plugins/WorldGuard' directories to show your configuration setup -->
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
# Maven stuff
|
||||
/target
|
||||
|
||||
.project
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*~.nib
|
||||
local.properties
|
||||
.classpath
|
||||
.settings/
|
||||
.loadpath
|
||||
|
||||
# Locally stored "Eclipse launch configurations"
|
||||
*.launch
|
||||
|
||||
# IntelliJ IDEA
|
||||
*.iml
|
||||
.idea
|
||||
dependency-reduced-pom.xml
|
||||
|
||||
desktop.ini
|
||||
@@ -1,17 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<projectDescription>
|
||||
<name>NLThijs48 - AreaShop</name>
|
||||
<comment></comment>
|
||||
<projects>
|
||||
</projects>
|
||||
<buildSpec>
|
||||
<buildCommand>
|
||||
<name>org.eclipse.jdt.core.javabuilder</name>
|
||||
<arguments>
|
||||
</arguments>
|
||||
</buildCommand>
|
||||
</buildSpec>
|
||||
<natures>
|
||||
<nature>org.eclipse.jdt.core.javanature</nature>
|
||||
</natures>
|
||||
</projectDescription>
|
||||
@@ -0,0 +1 @@
|
||||
/target
|
||||
@@ -0,0 +1,280 @@
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>areashop</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<name>AreaShop</name>
|
||||
<version>2.5.0</version> <!-- Main plugin version -->
|
||||
|
||||
<parent>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-parent</artifactId>
|
||||
<version>parent</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<!-- Bukkit, AreaShop aims to support 1.7.9+, but this is the lowest Bukkit version available from the Spigot repo, Bukkit repository is gone -->
|
||||
<dependency>
|
||||
<groupId>org.bukkit</groupId>
|
||||
<artifactId>bukkit</artifactId>
|
||||
<version>${bukkit.version}</version>
|
||||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
|
||||
<!-- InteractiveMessenger library -->
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>interactivemessenger</artifactId>
|
||||
<version>1.1-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<!-- BukkitDo library -->
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>bukkitdo</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldguard-5</artifactId>
|
||||
<version>WorldGuard-5</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldguard-6</artifactId>
|
||||
<version>WorldGuard-6</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldguard-6_1_3</artifactId>
|
||||
<version>WorldGuard-6_1_3</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldguard-7</artifactId>
|
||||
<version>WorldGuard-7</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-interface</artifactId>
|
||||
<version>AreaShopInterface</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldedit-5</artifactId>
|
||||
<version>WorldEdit-5</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldedit-6</artifactId>
|
||||
<version>WorldEdit-6</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>me.wiefferink</groupId>
|
||||
<artifactId>areashop-worldedit-7</artifactId>
|
||||
<version>WorldEdit-7</version>
|
||||
<type>jar</type>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.sk89q</groupId>
|
||||
<artifactId>worldedit</artifactId>
|
||||
<scope>system</scope>
|
||||
<version>any</version>
|
||||
<systemPath>${project.basedir}/../dependencies/worldedit-bukkit-7.0.0-beta-01.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.sk89q</groupId>
|
||||
<artifactId>worldguard</artifactId>
|
||||
<scope>system</scope>
|
||||
<version>any</version>
|
||||
<systemPath>${project.basedir}/../dependencies/worldguard-legacy-7.0.0-beta01.jar</systemPath>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.milkbowl.vault</groupId>
|
||||
<artifactId>VaultAPI</artifactId>
|
||||
<version>1.4</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.bstats</groupId>
|
||||
<artifactId>bstats-bukkit</artifactId>
|
||||
<version>1.1</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<!-- Copy the jar file to a test server, activate by using -DcopyResult="/path/to/test/server" -->
|
||||
<profile>
|
||||
<id>test-locally</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>copyResult</name>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-antrun-plugin</artifactId>
|
||||
<version>1.8</version>
|
||||
<configuration>
|
||||
<target>
|
||||
<copy file="./target/${project.build.finalName}.jar"
|
||||
tofile="${copyResult}\${project.build.finalName}.jar"/>
|
||||
</target>
|
||||
</configuration>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>run</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<!-- Package the source files in a jar, activate by using -Dsources -->
|
||||
<profile>
|
||||
<id>package-sources</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>sources</name>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<version>3.0.0</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<!-- Produce javadoc files, activate by using -Djavadoc -->
|
||||
<profile>
|
||||
<id>generate-javadoc</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>javadoc</name>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<version>2.10.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
<configuration>
|
||||
<excludePackageNames>me.wiefferink.areashop.lib</excludePackageNames>
|
||||
<destDir>${javadoc}</destDir>
|
||||
<links>
|
||||
<link>https://hub.spigotmc.org/javadocs/bukkit/</link>
|
||||
<link>http://docs.sk89q.com/worldedit/apidocs/</link>
|
||||
<link>http://docs.sk89q.com/worldguard/apidocs/</link>
|
||||
</links>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<build>
|
||||
<directory>target</directory>
|
||||
<finalName>AreaShop</finalName>
|
||||
<resources>
|
||||
<resource>
|
||||
<targetPath>.</targetPath>
|
||||
<filtering>true</filtering>
|
||||
<directory>src/main/resources</directory>
|
||||
<includes>
|
||||
<include>plugin.yml</include>
|
||||
<include>config.yml</include>
|
||||
<include>hiddenConfig.yml</include>
|
||||
<include>default.yml</include>
|
||||
<include>README.md</include>
|
||||
<include>lang/*.yml</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-shade-plugin</artifactId>
|
||||
<version>2.4.3</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>shade</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<relocations>
|
||||
<!-- Relocate messaging framework -->
|
||||
<relocation>
|
||||
<pattern>me.wiefferink.interactivemessenger</pattern>
|
||||
<shadedPattern>me.wiefferink.areashop.shaded.interactivemessenger</shadedPattern>
|
||||
</relocation>
|
||||
<!-- Relocate BukkitDo -->
|
||||
<relocation>
|
||||
<pattern>me.wiefferink.bukkitdo</pattern>
|
||||
<shadedPattern>me.wiefferink.areashop.shaded.bukkitdo</shadedPattern>
|
||||
</relocation>
|
||||
<!-- Relocate bstats -->
|
||||
<relocation>
|
||||
<pattern>org.bstats</pattern>
|
||||
<shadedPattern>me.wiefferink.areashop.shaded.bstats</shadedPattern>
|
||||
</relocation>
|
||||
</relocations>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.5.1</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
@@ -0,0 +1,780 @@
|
||||
package me.wiefferink.areashop;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.WorldEditPlugin;
|
||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import me.wiefferink.areashop.interfaces.AreaShopInterface;
|
||||
import me.wiefferink.areashop.interfaces.WorldEditInterface;
|
||||
import me.wiefferink.areashop.interfaces.WorldGuardInterface;
|
||||
import me.wiefferink.areashop.listeners.PlayerLoginLogoutListener;
|
||||
import me.wiefferink.areashop.managers.CommandManager;
|
||||
import me.wiefferink.areashop.managers.FeatureManager;
|
||||
import me.wiefferink.areashop.managers.FileManager;
|
||||
import me.wiefferink.areashop.managers.Manager;
|
||||
import me.wiefferink.areashop.managers.SignLinkerManager;
|
||||
import me.wiefferink.areashop.tools.Analytics;
|
||||
import me.wiefferink.areashop.tools.GithubUpdateCheck;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.bukkitdo.Do;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import me.wiefferink.interactivemessenger.source.LanguageManager;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.exception.ExceptionUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.permissions.Permission;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Main class for the AreaShop plugin.
|
||||
* Contains methods to get parts of the plugins functionality and definitions for constants.
|
||||
*/
|
||||
public final class AreaShop extends JavaPlugin implements AreaShopInterface {
|
||||
// Statically available instance
|
||||
private static AreaShop instance = null;
|
||||
|
||||
// General variables
|
||||
private WorldGuardPlugin worldGuard = null;
|
||||
private WorldGuardInterface worldGuardInterface = null;
|
||||
private WorldEditPlugin worldEdit = null;
|
||||
private WorldEditInterface worldEditInterface = null;
|
||||
private FileManager fileManager = null;
|
||||
private LanguageManager languageManager = null;
|
||||
private CommandManager commandManager = null;
|
||||
private SignLinkerManager signLinkerManager = null;
|
||||
private FeatureManager featureManager = null;
|
||||
private Set<Manager> managers = null;
|
||||
private boolean debug = false;
|
||||
private List<String> chatprefix = null;
|
||||
private boolean ready = false;
|
||||
private GithubUpdateCheck githubUpdateCheck = null;
|
||||
|
||||
// Folders and file names
|
||||
public static final String languageFolder = "lang";
|
||||
public static final String schematicFolder = "schem";
|
||||
public static final String regionsFolder = "regions";
|
||||
public static final String groupsFile = "groups.yml";
|
||||
public static final String defaultFile = "default.yml";
|
||||
public static final String configFile = "config.yml";
|
||||
public static final String configFileHidden = "hiddenConfig.yml";
|
||||
public static final String versionFile = "versions";
|
||||
|
||||
// Euro tag for in the config
|
||||
public static final String currencyEuro = "%euro%";
|
||||
|
||||
// Constants for handling file versions
|
||||
public static final String versionFiles = "files";
|
||||
public static final int versionFilesCurrent = 3;
|
||||
|
||||
// Keys for replacing parts of flags, commands, strings
|
||||
public static final String tagPlayerName = "player";
|
||||
public static final String tagPlayerUUID = "uuid";
|
||||
public static final String tagWorldName = "world";
|
||||
public static final String tagRegionName = "region";
|
||||
public static final String tagRegionType = "type";
|
||||
public static final String tagPrice = "price";
|
||||
public static final String tagRawPrice = "rawprice";
|
||||
public static final String tagDuration = "duration";
|
||||
public static final String tagRentedUntil = "until";
|
||||
public static final String tagRentedUntilShort = "untilshort";
|
||||
public static final String tagWidth = "width"; // x-axis
|
||||
public static final String tagHeight = "height"; // y-axis
|
||||
public static final String tagDepth = "depth"; // z-axis
|
||||
public static final String tagVolume = "volume"; // Number of blocks in the region (accounting for polygon regions)
|
||||
public static final String tagTimeLeft = "timeleft";
|
||||
public static final String tagClicker = "clicker";
|
||||
public static final String tagResellPrice = "resellprice";
|
||||
public static final String tagRawResellPrice = "rawresellprice";
|
||||
public static final String tagFriends = "friends";
|
||||
public static final String tagFriendsUUID = "friendsuuid";
|
||||
public static final String tagMoneyBackPercentage = "moneybackpercent";
|
||||
public static final String tagMoneyBackAmount = "moneyback";
|
||||
public static final String tagRawMoneyBackAmount = "rawmoneyback";
|
||||
public static final String tagTimesExtended = "timesExtended";
|
||||
public static final String tagMaxExtends = "maxextends";
|
||||
public static final String tagExtendsLeft = "extendsleft";
|
||||
public static final String tagMaxRentTime = "maxrenttime";
|
||||
public static final String tagMaxInactiveTime = "inactivetime";
|
||||
public static final String tagLandlord = "landlord";
|
||||
public static final String tagLandlordUUID = "landlorduuid";
|
||||
public static final String tagDateTime = "datetime";
|
||||
public static final String tagDateTimeShort = "datetimeshort";
|
||||
public static final String tagYear = "year";
|
||||
public static final String tagMonth = "month";
|
||||
public static final String tagDay = "day";
|
||||
public static final String tagHour = "hour";
|
||||
public static final String tagMinute = "minute";
|
||||
public static final String tagSecond = "second";
|
||||
public static final String tagMillisecond = "millisecond";
|
||||
public static final String tagEpoch = "epoch";
|
||||
public static final String tagTeleportX = "tpx";
|
||||
public static final String tagTeleportY = "tpy";
|
||||
public static final String tagTeleportZ = "tpz";
|
||||
public static final String tagTeleportBlockX = "tpblockx";
|
||||
public static final String tagTeleportBlockY = "tpblocky";
|
||||
public static final String tagTeleportBlockZ = "tpblockz";
|
||||
public static final String tagTeleportPitch = "tppitch";
|
||||
public static final String tagTeleportYaw = "tpyaw";
|
||||
public static final String tagTeleportPitchRound = "tppitchround";
|
||||
public static final String tagTeleportYawRound = "tpyawround";
|
||||
public static final String tagTeleportWorld = "tpworld";
|
||||
|
||||
public static AreaShop getInstance() {
|
||||
return AreaShop.instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called on start or reload of the server.
|
||||
*/
|
||||
public void onEnable() {
|
||||
AreaShop.instance = this;
|
||||
Do.init(this);
|
||||
managers = new HashSet<>();
|
||||
boolean error = false;
|
||||
|
||||
// Check if WorldGuard is present
|
||||
String wgVersion = null;
|
||||
String rawVersion = null;
|
||||
int major = 0;
|
||||
int minor = 0;
|
||||
int fixes = 0;
|
||||
Integer build = null;
|
||||
Plugin plugin = getServer().getPluginManager().getPlugin("WorldGuard");
|
||||
if(!(plugin instanceof WorldGuardPlugin) || !plugin.isEnabled()) {
|
||||
error("WorldGuard plugin is not present or has not loaded correctly");
|
||||
error = true;
|
||||
} else {
|
||||
worldGuard = (WorldGuardPlugin)plugin;
|
||||
// Get correct WorldGuardInterface (handles things that changed version to version)
|
||||
try {
|
||||
rawVersion = worldGuard.getDescription().getVersion();
|
||||
if(rawVersion.contains("-SNAPSHOT;")) {
|
||||
String buildNumber = rawVersion.substring(rawVersion.indexOf("-SNAPSHOT;") + 10, rawVersion.length());
|
||||
if(buildNumber.contains("-")) {
|
||||
buildNumber = buildNumber.substring(0, buildNumber.indexOf("-"));
|
||||
try {
|
||||
build = Integer.parseInt(buildNumber);
|
||||
} catch(NumberFormatException e) {
|
||||
warn("Could not correctly parse the build of WorldGuard, raw version: " + rawVersion + ", buildNumber: " + buildNumber);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Clear stuff from the version string that is not a number
|
||||
String[] versionParts = rawVersion.split("\\.");
|
||||
for(int i = 0; i < versionParts.length; i++) {
|
||||
Pattern pattern = Pattern.compile("^\\d+");
|
||||
Matcher matcher = pattern.matcher(versionParts[i]);
|
||||
if(matcher.find()) {
|
||||
versionParts[i] = matcher.group();
|
||||
}
|
||||
}
|
||||
// Find major, minor and fix numbers
|
||||
try {
|
||||
if(versionParts.length > 0) {
|
||||
major = Integer.parseInt(versionParts[0]);
|
||||
}
|
||||
if(versionParts.length > 1) {
|
||||
minor = Integer.parseInt(versionParts[1]);
|
||||
}
|
||||
if(versionParts.length > 2) {
|
||||
fixes = Integer.parseInt(versionParts[2]);
|
||||
}
|
||||
} catch(NumberFormatException e) {
|
||||
warn("Something went wrong while parsing WorldGuard version number: " + rawVersion);
|
||||
}
|
||||
// Determine correct implementation to use
|
||||
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
|
||||
wgVersion = "5";
|
||||
} else if(major == 6 && minor == 1 && fixes < 3) {
|
||||
wgVersion = "6";
|
||||
} else if(major == 6) {
|
||||
if(build != null && build == 1672) {
|
||||
error = true;
|
||||
error("Build 1672 of WorldGuard is broken, update to a later build or a stable version!");
|
||||
} else if(build != null && build < 1672) {
|
||||
wgVersion = "6";
|
||||
} else {
|
||||
wgVersion = "6_1_3";
|
||||
}
|
||||
} else {
|
||||
wgVersion = "7";
|
||||
}
|
||||
} catch(Exception e) { // If version detection fails, at least try to load the latest version
|
||||
wgVersion = "7";
|
||||
}
|
||||
// Load chosen implementation
|
||||
try {
|
||||
final Class<?> clazz = Class.forName("me.wiefferink.areashop.handlers.WorldGuardHandler" + wgVersion);
|
||||
// Check if we have a NMSHandler class at that location.
|
||||
if(WorldGuardInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldGuardInterface
|
||||
worldGuardInterface = (WorldGuardInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
|
||||
}
|
||||
} catch(final Exception e) {
|
||||
error("Could not load the handler for WorldGuard (tried to load " + wgVersion + "), report this problem to the author:" + ExceptionUtils.getStackTrace(e));
|
||||
error = true;
|
||||
wgVersion = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if WorldEdit is present
|
||||
String weVersion = null;
|
||||
plugin = getServer().getPluginManager().getPlugin("WorldEdit");
|
||||
if(!(plugin instanceof WorldEditPlugin) || !plugin.isEnabled()) {
|
||||
error("WorldEdit plugin is not present or has not loaded correctly");
|
||||
error = true;
|
||||
} else {
|
||||
worldEdit = (WorldEditPlugin)plugin;
|
||||
// Get correct WorldEditInterface (handles things that changed version to version)
|
||||
if(worldEdit.getDescription().getVersion().startsWith("5.")) {
|
||||
weVersion = "5";
|
||||
} else if(worldEdit.getDescription().getVersion().startsWith("6.")) {
|
||||
weVersion = "6";
|
||||
} else {
|
||||
weVersion = "7";
|
||||
}
|
||||
try {
|
||||
final Class<?> clazz = Class.forName("me.wiefferink.areashop.handlers.WorldEditHandler" + weVersion);
|
||||
// Check if we have a NMSHandler class at that location.
|
||||
if(WorldEditInterface.class.isAssignableFrom(clazz)) { // Make sure it actually implements WorldEditInterface
|
||||
worldEditInterface = (WorldEditInterface)clazz.getConstructor(AreaShopInterface.class).newInstance(this); // Set our handler
|
||||
}
|
||||
} catch(final Exception e) {
|
||||
error("Could not load the handler for WorldEdit (tried to load " + weVersion + "), report this problem to the author: " + ExceptionUtils.getStackTrace(e));
|
||||
error = true;
|
||||
weVersion = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if Vault is present
|
||||
if(getServer().getPluginManager().getPlugin("Vault") == null) {
|
||||
error("Vault plugin is not present or has not loaded correctly");
|
||||
error = true;
|
||||
}
|
||||
|
||||
// Load all data from files and check versions
|
||||
fileManager = new FileManager();
|
||||
managers.add(fileManager);
|
||||
error = error | !fileManager.loadFiles(false);
|
||||
|
||||
// Print loaded version of WG and WE in debug
|
||||
if(wgVersion != null) {
|
||||
AreaShop.debug("Loaded WorldGuardHandler" + wgVersion + " (raw version: " + rawVersion + ", major:" + major + ", minor:" + minor + ", fixes:" + fixes + ", build:" + build + ")");
|
||||
}
|
||||
if(weVersion != null) {
|
||||
AreaShop.debug("Loaded WorldEditHandler" + weVersion);
|
||||
}
|
||||
|
||||
setupLanguageManager();
|
||||
|
||||
if(error) {
|
||||
error("The plugin has not started, fix the errors listed above");
|
||||
} else {
|
||||
featureManager = new FeatureManager();
|
||||
managers.add(featureManager);
|
||||
|
||||
// Register the event listeners
|
||||
getServer().getPluginManager().registerEvents(new PlayerLoginLogoutListener(this), this);
|
||||
|
||||
setupTasks();
|
||||
|
||||
// Startup the CommandManager (registers itself for the command)
|
||||
commandManager = new CommandManager();
|
||||
managers.add(commandManager);
|
||||
|
||||
// Create a signLinkerManager
|
||||
signLinkerManager = new SignLinkerManager();
|
||||
managers.add(signLinkerManager);
|
||||
|
||||
// Enable Metrics if config allows it
|
||||
if(getConfig().getBoolean("sendStats")) {
|
||||
Analytics.start();
|
||||
}
|
||||
|
||||
// Register dynamic permission (things declared in config)
|
||||
registerDynamicPermissions();
|
||||
|
||||
// Don't initialize the updatechecker if disabled in the config
|
||||
if(getConfig().getBoolean("checkForUpdates")) {
|
||||
githubUpdateCheck = new GithubUpdateCheck(
|
||||
AreaShop.getInstance(),
|
||||
"NLThijs48",
|
||||
"AreaShop"
|
||||
).withVersionComparator((latestVersion, currentVersion) ->
|
||||
!cleanVersion(latestVersion).equals(cleanVersion(currentVersion))
|
||||
).checkUpdate((result) -> {
|
||||
AreaShop.debug("Update check result:", result);
|
||||
if(!result.hasUpdate()) {
|
||||
return;
|
||||
}
|
||||
|
||||
AreaShop.info("Update from AreaShop V" + cleanVersion(result.getCurrentVersion()) + " to AreaShop V" + cleanVersion(result.getLatestVersion()) + " available, get the latest version at https://www.spigotmc.org/resources/areashop.2991/");
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
notifyUpdate(player);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify a player about an update if he wants notifications about it and an update is available.
|
||||
* @param sender CommandSender to notify
|
||||
*/
|
||||
public void notifyUpdate(CommandSender sender) {
|
||||
if(githubUpdateCheck != null && githubUpdateCheck.hasUpdate() && sender.hasPermission("areashop.notifyupdate")) {
|
||||
AreaShop.getInstance().message(sender, "update-playerNotify", cleanVersion(githubUpdateCheck.getCurrentVersion()), cleanVersion(githubUpdateCheck.getLatestVersion()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup a version number.
|
||||
* @param version Version to clean
|
||||
* @return Cleaned up version (removed prefixes and suffixes)
|
||||
*/
|
||||
private String cleanVersion(String version) {
|
||||
version = version.toLowerCase();
|
||||
|
||||
// Strip 'v' as used on Github tags
|
||||
if(version.startsWith("v")) {
|
||||
version = version.substring(1);
|
||||
}
|
||||
|
||||
// Strip build number as used by Jenkins
|
||||
if(version.contains("#")) {
|
||||
version = version.substring(0, version.indexOf("#"));
|
||||
}
|
||||
|
||||
return version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called on shutdown or reload of the server.
|
||||
*/
|
||||
public void onDisable() {
|
||||
|
||||
Bukkit.getServer().getScheduler().cancelTasks(this);
|
||||
|
||||
// Cleanup managers
|
||||
for(Manager manager : managers) {
|
||||
manager.shutdown();
|
||||
}
|
||||
managers = null;
|
||||
fileManager = null;
|
||||
languageManager = null;
|
||||
commandManager = null;
|
||||
signLinkerManager = null;
|
||||
featureManager = null;
|
||||
|
||||
// Cleanup plugins
|
||||
worldGuard = null;
|
||||
worldGuardInterface = null;
|
||||
worldEdit = null;
|
||||
worldEditInterface = null;
|
||||
|
||||
// Cleanup other stuff
|
||||
chatprefix = null;
|
||||
debug = false;
|
||||
ready = false;
|
||||
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates if the plugin is ready to be used.
|
||||
* @return true if the plugin is ready, false otherwise
|
||||
*/
|
||||
public boolean isReady() {
|
||||
return ready;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the plugin is ready to be used or not (not to be used from another plugin!).
|
||||
* @param ready Indicate if the plugin is ready to be used
|
||||
*/
|
||||
public void setReady(boolean ready) {
|
||||
this.ready = ready;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the plugin should output debug messages (loaded from config normally).
|
||||
* @param debug Indicates if the plugin should output debug messages or not
|
||||
*/
|
||||
public void setDebug(boolean debug) {
|
||||
this.debug = debug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup a new LanguageManager.
|
||||
*/
|
||||
private void setupLanguageManager() {
|
||||
languageManager = new LanguageManager(
|
||||
this,
|
||||
languageFolder,
|
||||
getConfig().getString("language"),
|
||||
"EN",
|
||||
chatprefix
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the chatprefix to use in the chat (loaded from config normally).
|
||||
* @param chatprefix The string to use in front of chat messages (supports formatting codes)
|
||||
*/
|
||||
public void setChatprefix(List<String> chatprefix) {
|
||||
this.chatprefix = chatprefix;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get the WorldGuard plugin.
|
||||
* @return WorldGuardPlugin
|
||||
*/
|
||||
public WorldGuardPlugin getWorldGuard() {
|
||||
return worldGuard;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get WorldGuardInterface for version dependent things.
|
||||
* @return WorldGuardInterface
|
||||
*/
|
||||
public WorldGuardInterface getWorldGuardHandler() {
|
||||
return this.worldGuardInterface;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the RegionManager.
|
||||
* @param world World to get the RegionManager for
|
||||
* @return RegionManager for the given world, if there is one, otherwise null
|
||||
*/
|
||||
public RegionManager getRegionManager(World world) {
|
||||
return this.worldGuardInterface.getRegionManager(world);
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get the WorldEdit plugin.
|
||||
* @return WorldEditPlugin
|
||||
*/
|
||||
public WorldEditPlugin getWorldEdit() {
|
||||
return worldEdit;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get WorldGuardInterface for version dependent things.
|
||||
* @return WorldGuardInterface
|
||||
*/
|
||||
public WorldEditInterface getWorldEditHandler() {
|
||||
return this.worldEditInterface;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get the LanguageManager.
|
||||
* @return the LanguageManager
|
||||
*/
|
||||
public LanguageManager getLanguageManager() {
|
||||
return languageManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get the CommandManager.
|
||||
* @return the CommandManager
|
||||
*/
|
||||
public CommandManager getCommandManager() {
|
||||
return commandManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the SignLinkerManager.
|
||||
* Handles sign linking mode.
|
||||
* @return The SignLinkerManager
|
||||
*/
|
||||
public SignLinkerManager getSignlinkerManager() {
|
||||
return signLinkerManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the FeatureManager.
|
||||
* Manages region specific features.
|
||||
* @return The FeatureManager
|
||||
*/
|
||||
public FeatureManager getFeatureManager() {
|
||||
return featureManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to get the Vault plugin.
|
||||
* @return Economy
|
||||
*/
|
||||
public Economy getEconomy() {
|
||||
RegisteredServiceProvider<Economy> economy = getServer().getServicesManager().getRegistration(net.milkbowl.vault.economy.Economy.class);
|
||||
if(economy == null || economy.getProvider() == null) {
|
||||
error("There is no economy provider to support Vault, make sure you installed an economy plugin");
|
||||
return null;
|
||||
}
|
||||
return economy.getProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Vault permissions provider.
|
||||
* @return Vault permissions provider
|
||||
*/
|
||||
public net.milkbowl.vault.permission.Permission getPermissionProvider() {
|
||||
RegisteredServiceProvider<net.milkbowl.vault.permission.Permission> permissionProvider = getServer().getServicesManager().getRegistration(net.milkbowl.vault.permission.Permission.class);
|
||||
if (permissionProvider == null || permissionProvider.getProvider() == null) {
|
||||
return null;
|
||||
}
|
||||
return permissionProvider.getProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for a permission of a (possibly offline) player.
|
||||
* @param offlinePlayer OfflinePlayer to check
|
||||
* @param permission Permission to check
|
||||
* @return true if the player has the permission, false if the player does not have permission or, is offline and there is not Vault-compatible permission plugin
|
||||
*/
|
||||
public boolean hasPermission(OfflinePlayer offlinePlayer, String permission) {
|
||||
// Online, return through Bukkit
|
||||
if(offlinePlayer.getPlayer() != null) {
|
||||
return offlinePlayer.getPlayer().hasPermission(permission);
|
||||
}
|
||||
|
||||
// Resolve while offline if possible
|
||||
net.milkbowl.vault.permission.Permission permissionProvider = getPermissionProvider();
|
||||
if(permissionProvider != null) {
|
||||
// TODO: Should we provide a world here?
|
||||
return permissionProvider.playerHas(null, offlinePlayer, permission);
|
||||
}
|
||||
|
||||
// Player offline and no offline permission provider available, safely say that there is no permission
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to get the FileManager (loads/save regions and can be used to get regions).
|
||||
* @return The fileManager
|
||||
*/
|
||||
public FileManager getFileManager() {
|
||||
return fileManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register dynamic permissions controlled by config settings.
|
||||
*/
|
||||
private void registerDynamicPermissions() {
|
||||
// Register limit groups of amount of regions a player can have
|
||||
ConfigurationSection section = getConfig().getConfigurationSection("limitGroups");
|
||||
if(section == null) {
|
||||
return;
|
||||
}
|
||||
for(String group : section.getKeys(false)) {
|
||||
if(!"default".equals(group)) {
|
||||
Permission perm = new Permission("areashop.limits." + group);
|
||||
try {
|
||||
Bukkit.getPluginManager().addPermission(perm);
|
||||
} catch(IllegalArgumentException e) {
|
||||
warn("Could not add the following permission to be used as limit: " + perm.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
Bukkit.getPluginManager().recalculatePermissionDefaults(Bukkit.getPluginManager().getPermission("playerwarps.limits"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Register all required tasks.
|
||||
*/
|
||||
private void setupTasks() {
|
||||
// Rent expiration timer
|
||||
long expirationCheck = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("expiration.delay"));
|
||||
final AreaShop finalPlugin = this;
|
||||
if(expirationCheck > 0) {
|
||||
Do.syncTimer(expirationCheck, () -> {
|
||||
if(isReady()) {
|
||||
finalPlugin.getFileManager().checkRents();
|
||||
AreaShop.debugTask("Checking rent expirations...");
|
||||
} else {
|
||||
AreaShop.debugTask("Skipped checking rent expirations, plugin not ready");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Inactive unrenting/selling timer
|
||||
long inactiveCheck = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("inactive.delay"));
|
||||
if(inactiveCheck > 0) {
|
||||
Do.syncTimer(inactiveCheck, () -> {
|
||||
if(isReady()) {
|
||||
finalPlugin.getFileManager().checkForInactiveRegions();
|
||||
AreaShop.debugTask("Checking for regions with players that are inactive too long...");
|
||||
} else {
|
||||
AreaShop.debugTask("Skipped checking for regions of inactive players, plugin not ready");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Periodic updating of signs for timeleft tags
|
||||
long periodicUpdate = Utils.millisToTicks(Utils.getDurationFromSecondsOrString("signs.delay"));
|
||||
if(periodicUpdate > 0) {
|
||||
Do.syncTimer(periodicUpdate, () -> {
|
||||
if(isReady()) {
|
||||
finalPlugin.getFileManager().performPeriodicSignUpdate();
|
||||
AreaShop.debugTask("Performing periodic sign update...");
|
||||
} else {
|
||||
AreaShop.debugTask("Skipped performing periodic sign update, plugin not ready");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Saving regions and group settings
|
||||
long saveFiles = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("saving.delay"));
|
||||
if(saveFiles > 0) {
|
||||
Do.syncTimer(saveFiles, () -> {
|
||||
if(isReady()) {
|
||||
finalPlugin.getFileManager().saveRequiredFiles();
|
||||
AreaShop.debugTask("Saving required files...");
|
||||
} else {
|
||||
AreaShop.debugTask("Skipped saving required files, plugin not ready");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Sending warnings about rent regions to online players
|
||||
long expireWarning = Utils.millisToTicks(Utils.getDurationFromMinutesOrString("expireWarning.delay"));
|
||||
if(expireWarning > 0) {
|
||||
Do.syncTimer(expireWarning, () -> {
|
||||
if(isReady()) {
|
||||
finalPlugin.getFileManager().sendRentExpireWarnings();
|
||||
AreaShop.debugTask("Sending rent expire warnings...");
|
||||
} else {
|
||||
AreaShop.debugTask("Skipped sending rent expire warnings, plugin not ready");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Update all regions on startup
|
||||
if(getConfig().getBoolean("updateRegionsOnStartup")) {
|
||||
Do.syncLater(20, () -> {
|
||||
finalPlugin.getFileManager().updateAllRegions();
|
||||
AreaShop.debugTask("Updating all regions at startup...");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a target without a prefix.
|
||||
* @param target The target to send the message to
|
||||
* @param key The key of the language string
|
||||
* @param replacements The replacements to insert in the message
|
||||
*/
|
||||
public void messageNoPrefix(Object target, String key, Object... replacements) {
|
||||
Message.fromKey(key).replacements(replacements).send(target);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a target, prefixed by the default chat prefix.
|
||||
* @param target The target to send the message to
|
||||
* @param key The key of the language string
|
||||
* @param replacements The replacements to insert in the message
|
||||
*/
|
||||
public void message(Object target, String key, Object... replacements) {
|
||||
Message.fromKey(key).prefix().replacements(replacements).send(target);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the config.
|
||||
*/
|
||||
@Override
|
||||
public YamlConfiguration getConfig() {
|
||||
return fileManager.getConfig();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends an debug message to the console.
|
||||
* @param message The message that should be printed to the console
|
||||
*/
|
||||
public static void debug(Object... message) {
|
||||
if(AreaShop.getInstance().debug) {
|
||||
info("Debug: " + StringUtils.join(message, " "));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-static debug to use as implementation of the interface.
|
||||
* @param message Object parts of the message that should be logged, toString() will be used
|
||||
*/
|
||||
public void debugI(Object... message) {
|
||||
AreaShop.debug(StringUtils.join(message, " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an information message to the console.
|
||||
* @param message The message to print
|
||||
*/
|
||||
public static void info(Object... message) {
|
||||
AreaShop.getInstance().getLogger().info(StringUtils.join(message, " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a warning to the console.
|
||||
* @param message The message to print
|
||||
*/
|
||||
public static void warn(Object... message) {
|
||||
AreaShop.getInstance().getLogger().warning(StringUtils.join(message, " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* Print an error to the console.
|
||||
* @param message The message to print
|
||||
*/
|
||||
public static void error(Object... message) {
|
||||
AreaShop.getInstance().getLogger().severe(StringUtils.join(message, " "));
|
||||
}
|
||||
|
||||
/**
|
||||
* Print debug message for periodic task.
|
||||
* @param message The message to print
|
||||
*/
|
||||
public static void debugTask(Object... message) {
|
||||
if(AreaShop.getInstance().getConfig().getBoolean("debugTask")) {
|
||||
AreaShop.debug(StringUtils.join(message, " "));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload all files of the plugin and update all regions.
|
||||
* @param confirmationReceiver The CommandSender which should be notified when complete, null for nobody
|
||||
*/
|
||||
public void reload(final CommandSender confirmationReceiver) {
|
||||
setReady(false);
|
||||
fileManager.saveRequiredFilesAtOnce();
|
||||
fileManager.loadFiles(true);
|
||||
setupLanguageManager();
|
||||
message(confirmationReceiver, "reload-reloading");
|
||||
fileManager.checkRents();
|
||||
fileManager.updateAllRegions(confirmationReceiver);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reload all files of the plugin and update all regions.
|
||||
*/
|
||||
public void reload() {
|
||||
reload(null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,300 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.managers.FileManager;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.bukkitdo.Do;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeSet;
|
||||
import java.util.UUID;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class AddCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop add";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.createrent")
|
||||
|| target.hasPermission("areashop.createrent.member")
|
||||
|| target.hasPermission("areashop.createrent.owner")
|
||||
|
||||
|| target.hasPermission("areashop.createbuy")
|
||||
|| target.hasPermission("areashop.createbuy.member")
|
||||
|| target.hasPermission("areashop.createbuy.owner")) {
|
||||
return "help-add";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final String[] args) {
|
||||
if(!sender.hasPermission("areashop.createrent")
|
||||
&& !sender.hasPermission("areashop.createrent.member")
|
||||
&& !sender.hasPermission("areashop.createrent.owner")
|
||||
|
||||
&& !sender.hasPermission("areashop.createbuy")
|
||||
&& !sender.hasPermission("areashop.createbuy.member")
|
||||
&& !sender.hasPermission("areashop.createbuy.owner")) {
|
||||
plugin.message(sender, "add-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 2 || args[1] == null || (!"rent".equals(args[1].toLowerCase()) && !"buy".equals(args[1].toLowerCase()))) {
|
||||
plugin.message(sender, "add-help");
|
||||
return;
|
||||
}
|
||||
Map<String, ProtectedRegion> regions = new HashMap<>();
|
||||
World world;
|
||||
Player player = null;
|
||||
if(sender instanceof Player) {
|
||||
player = (Player)sender;
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if(player == null) {
|
||||
plugin.message(sender, "cmd-weOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "cmd-noSelection");
|
||||
return;
|
||||
}
|
||||
world = selection.getWorld();
|
||||
regions = Utils.getWorldEditRegionsInSelection(selection).stream().collect(Collectors.toMap(ProtectedRegion::getId, region -> region));
|
||||
if(regions.size() == 0) {
|
||||
plugin.message(player, "cmd-noWERegionsFound");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if(player != null) {
|
||||
if(args.length == 4) {
|
||||
world = Bukkit.getWorld(args[3]);
|
||||
if(world == null) {
|
||||
plugin.message(sender, "add-incorrectWorld", args[3]);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
world = ((Player)sender).getWorld();
|
||||
}
|
||||
} else {
|
||||
if(args.length < 4) {
|
||||
plugin.message(sender, "add-specifyWorld");
|
||||
return;
|
||||
} else {
|
||||
world = Bukkit.getWorld(args[3]);
|
||||
if(world == null) {
|
||||
plugin.message(sender, "add-incorrectWorld", args[3]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
ProtectedRegion region = plugin.getRegionManager(world).getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-noRegion", args[2]);
|
||||
return;
|
||||
}
|
||||
regions.put(args[2], region);
|
||||
}
|
||||
final boolean isRent = "rent".equals(args[1].toLowerCase());
|
||||
final Player finalPlayer = player;
|
||||
AreaShop.debug("Starting add task with " + regions.size() + " regions");
|
||||
|
||||
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
|
||||
TreeSet<GeneralRegion> regionsAlready = new TreeSet<>();
|
||||
TreeSet<GeneralRegion> regionsAlreadyOtherWorld = new TreeSet<>();
|
||||
TreeSet<String> namesBlacklisted = new TreeSet<>();
|
||||
TreeSet<String> namesNoPermission = new TreeSet<>();
|
||||
Do.forAll(
|
||||
plugin.getConfig().getInt("adding.regionsPerTick"),
|
||||
regions.entrySet(),
|
||||
regionEntry -> {
|
||||
String regionName = regionEntry.getKey();
|
||||
ProtectedRegion region = regionEntry.getValue();
|
||||
// Determine if the player is an owner or member of the region
|
||||
boolean isMember = finalPlayer != null && plugin.getWorldGuardHandler().containsMember(region, finalPlayer.getUniqueId());
|
||||
boolean isOwner = finalPlayer != null && plugin.getWorldGuardHandler().containsMember(region, finalPlayer.getUniqueId());
|
||||
String type;
|
||||
if(isRent) {
|
||||
type = "rent";
|
||||
} else {
|
||||
type = "buy";
|
||||
}
|
||||
FileManager.AddResult result = plugin.getFileManager().checkRegionAdd(sender, region, world, isRent ? GeneralRegion.RegionType.RENT : GeneralRegion.RegionType.BUY);
|
||||
if(result == FileManager.AddResult.ALREADYADDED) {
|
||||
regionsAlready.add(plugin.getFileManager().getRegion(regionName));
|
||||
} else if(result == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
|
||||
regionsAlreadyOtherWorld.add(plugin.getFileManager().getRegion(regionName));
|
||||
} else if(result == FileManager.AddResult.BLACKLISTED) {
|
||||
namesBlacklisted.add(regionName);
|
||||
} else if(result == FileManager.AddResult.NOPERMISSION) {
|
||||
namesNoPermission.add(regionName);
|
||||
} else {
|
||||
// Check if the player should be landlord
|
||||
boolean landlord = (!sender.hasPermission("areashop.create" + type)
|
||||
&& ((sender.hasPermission("areashop.create" + type + ".owner") && isOwner)
|
||||
|| (sender.hasPermission("areashop.create" + type + ".member") && isMember)));
|
||||
List<UUID> existing = new ArrayList<>();
|
||||
existing.addAll(plugin.getWorldGuardHandler().getOwners(region).asUniqueIdList());
|
||||
existing.addAll(plugin.getWorldGuardHandler().getMembers(region).asUniqueIdList());
|
||||
if(isRent) {
|
||||
RentRegion rent = new RentRegion(regionName, world);
|
||||
// Set landlord
|
||||
if(landlord) {
|
||||
rent.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
|
||||
}
|
||||
// Run commands
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
plugin.getFileManager().addRent(rent);
|
||||
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
|
||||
rent.update();
|
||||
|
||||
// Run commands
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
|
||||
// Add existing owners/members if any
|
||||
if(!landlord && !existing.isEmpty()) {
|
||||
// TODO also execute rent events to notify other plugins?
|
||||
|
||||
// Run commands
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.RENTED, true);
|
||||
|
||||
// Add values to the rent and send it to FileManager
|
||||
rent.setRentedUntil(Calendar.getInstance().getTimeInMillis() + rent.getDuration());
|
||||
rent.setRenter(existing.remove(0));
|
||||
rent.updateLastActiveTime();
|
||||
|
||||
// Add others as friends
|
||||
for(UUID friend : existing) {
|
||||
rent.getFriendsFeature().addFriend(friend, null);
|
||||
}
|
||||
|
||||
// Fire schematic event and updated times extended
|
||||
rent.handleSchematicEvent(GeneralRegion.RegionEvent.RENTED);
|
||||
|
||||
// Notify about updates
|
||||
rent.update();
|
||||
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.RENTED, false);
|
||||
}
|
||||
|
||||
regionsSuccess.add(rent);
|
||||
} else {
|
||||
BuyRegion buy = new BuyRegion(regionName, world);
|
||||
// Set landlord
|
||||
if(landlord) {
|
||||
buy.setLandlord(finalPlayer.getUniqueId(), finalPlayer.getName());
|
||||
}
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
|
||||
plugin.getFileManager().addBuy(buy);
|
||||
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
|
||||
buy.update();
|
||||
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
|
||||
// Add existing owners/members if any
|
||||
if(!landlord && !existing.isEmpty()) {
|
||||
// TODO also execute buy events to notify for other plugins?
|
||||
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.BOUGHT, true);
|
||||
|
||||
// Set the owner
|
||||
buy.setBuyer(existing.remove(0));
|
||||
buy.updateLastActiveTime();
|
||||
// Add others as friends
|
||||
for(UUID friend : existing) {
|
||||
buy.getFriendsFeature().addFriend(friend, null);
|
||||
}
|
||||
|
||||
// Notify about updates
|
||||
buy.update();
|
||||
|
||||
// Update everything
|
||||
buy.handleSchematicEvent(GeneralRegion.RegionEvent.BOUGHT);
|
||||
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.BOUGHT, false);
|
||||
}
|
||||
|
||||
regionsSuccess.add(buy);
|
||||
}
|
||||
}
|
||||
},
|
||||
() -> {
|
||||
if(!regionsSuccess.isEmpty()) {
|
||||
plugin.message(sender, "add-success", args[1], Utils.combinedMessage(regionsSuccess, "region"));
|
||||
}
|
||||
if(!regionsAlready.isEmpty()) {
|
||||
plugin.message(sender, "add-failed", Utils.combinedMessage(regionsAlready, "region"));
|
||||
}
|
||||
if(!regionsAlreadyOtherWorld.isEmpty()) {
|
||||
plugin.message(sender, "add-failedOtherWorld", Utils.combinedMessage(regionsAlreadyOtherWorld, "region"));
|
||||
}
|
||||
if(!namesBlacklisted.isEmpty()) {
|
||||
plugin.message(sender, "add-blacklisted", Utils.createCommaSeparatedList(namesBlacklisted));
|
||||
}
|
||||
if(!namesNoPermission.isEmpty()) {
|
||||
plugin.message(sender, "add-noPermissionRegions", Utils.createCommaSeparatedList(namesNoPermission));
|
||||
plugin.message(sender, "add-noPermissionOwnerMember");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
if(sender.hasPermission("areashop.createrent")) {
|
||||
result.add("rent");
|
||||
}
|
||||
if(sender.hasPermission("areashop.createbuy")) {
|
||||
result.add("buy");
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
if(sender instanceof Player) {
|
||||
Player player = (Player)sender;
|
||||
if(sender.hasPermission("areashop.createrent") || sender.hasPermission("areashop.createbuy")) {
|
||||
for(ProtectedRegion region : plugin.getRegionManager(player.getWorld()).getRegions().values()) {
|
||||
result.add(region.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,141 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AddfriendCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop addfriend";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.addfriendall") || target.hasPermission("areashop.addfriend")) {
|
||||
return "help-addFriend";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.addfriend") && !sender.hasPermission("areashop.addfriendall")) {
|
||||
plugin.message(sender, "addfriend-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "addfriend-help");
|
||||
return;
|
||||
}
|
||||
|
||||
GeneralRegion region;
|
||||
if(args.length <= 2) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(sender.hasPermission("areashop.addfriendall")) {
|
||||
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|
||||
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
|
||||
plugin.message(sender, "addfriend-noOwner", region);
|
||||
return;
|
||||
}
|
||||
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
|
||||
plugin.message(sender, "addfriend-notVisited", args[1], region);
|
||||
return;
|
||||
}
|
||||
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
|
||||
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
if(region.isOwner(friend.getUniqueId())) {
|
||||
plugin.message(sender, "addfriend-self", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
|
||||
region.update();
|
||||
plugin.message(sender, "addfriend-successOther", friend.getName(), region);
|
||||
}
|
||||
} else {
|
||||
if(sender.hasPermission("areashop.addfriend") && sender instanceof Player) {
|
||||
if(region.isOwner((Player)sender)) {
|
||||
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(friend.getLastPlayed() == 0 && !friend.isOnline() && !plugin.getConfig().getBoolean("addFriendNotExistingPlayers")) {
|
||||
plugin.message(sender, "addfriend-notVisited", args[1], region);
|
||||
return;
|
||||
}
|
||||
if(region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
|
||||
plugin.message(sender, "addfriend-alreadyAdded", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
if(region.isOwner(friend.getUniqueId())) {
|
||||
plugin.message(sender, "addfriend-self", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
|
||||
if(region.getFriendsFeature().addFriend(friend.getUniqueId(), sender)) {
|
||||
region.update();
|
||||
plugin.message(sender, "addfriend-success", friend.getName(), region);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "addfriend-noPermissionOther", region);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "addfriend-noPermission", region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+125
-133
@@ -1,133 +1,125 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.material.Sign;
|
||||
import org.bukkit.util.BlockIterator;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
|
||||
|
||||
public class AddsignCommand extends CommandAreaShop {
|
||||
|
||||
public AddsignCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop addsign";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.addsign")) {
|
||||
return plugin.getLanguageManager().getLang("help-addsign");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.addsign")) {
|
||||
plugin.message(sender, "addsign-noPermission");
|
||||
return;
|
||||
}
|
||||
if (!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
|
||||
// Get the sign
|
||||
Block block = null;
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext() && block == null) {
|
||||
Block next = blockIterator.next();
|
||||
if(next.getType() != Material.AIR) {
|
||||
block = next;
|
||||
}
|
||||
}
|
||||
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
|
||||
plugin.message(sender, "addsign-noSign");
|
||||
return;
|
||||
}
|
||||
|
||||
GeneralRegion region = null;
|
||||
if(args.length > 1) {
|
||||
// Get region by argument
|
||||
region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "addsign-noRegion", args[1]);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Get region by sign position
|
||||
List<GeneralRegion> regions = plugin.getFileManager().getASRegionsInSelection(new CuboidSelection(block.getWorld(), block.getLocation(), block.getLocation()));
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "addsign-noRegions");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "addsign-couldNotDetect", regions.get(0).getName(), regions.get(1).getName());
|
||||
return;
|
||||
}
|
||||
region = regions.get(0);
|
||||
}
|
||||
Sign sign = (Sign)block.getState().getData();
|
||||
String profile = null;
|
||||
if(args.length > 2) {
|
||||
profile = args[2];
|
||||
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
|
||||
if(!profiles.contains(profile)) {
|
||||
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles));
|
||||
return;
|
||||
}
|
||||
}
|
||||
GeneralRegion signRegion = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
|
||||
if(signRegion != null) {
|
||||
plugin.message(sender, "addsign-alreadyRegistered", signRegion.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
region.addSign(block.getLocation(), block.getType(), sign.getFacing(), profile);
|
||||
if(profile == null) {
|
||||
plugin.message(sender, "addsign-success", region.getName());
|
||||
} else {
|
||||
plugin.message(sender, "addsign-successProfile", region.getName(), profile);
|
||||
}
|
||||
region.updateSigns();
|
||||
region.saveRequired();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getConfig().getStringList("signProfiles"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.features.signs.RegionSign;
|
||||
import me.wiefferink.areashop.features.signs.SignsFeature;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.material.Sign;
|
||||
import org.bukkit.util.BlockIterator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class AddsignCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop addsign";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.addsign")) {
|
||||
return "help-addsign";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.addsign")) {
|
||||
plugin.message(sender, "addsign-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
|
||||
// Get the sign
|
||||
Block block = null;
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext() && block == null) {
|
||||
Block next = blockIterator.next();
|
||||
if(next.getType() != Material.AIR) {
|
||||
block = next;
|
||||
}
|
||||
}
|
||||
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
|
||||
plugin.message(sender, "addsign-noSign");
|
||||
return;
|
||||
}
|
||||
|
||||
GeneralRegion region;
|
||||
if(args.length > 1) {
|
||||
// Get region by argument
|
||||
region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Get region by sign position
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(block.getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "addsign-noRegions");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "addsign-couldNotDetect", regions.get(0).getName(), regions.get(1).getName());
|
||||
return;
|
||||
}
|
||||
region = regions.get(0);
|
||||
}
|
||||
Sign sign = (Sign)block.getState().getData();
|
||||
String profile = null;
|
||||
if(args.length > 2) {
|
||||
profile = args[2];
|
||||
Set<String> profiles = plugin.getConfig().getConfigurationSection("signProfiles").getKeys(false);
|
||||
if(!profiles.contains(profile)) {
|
||||
plugin.message(sender, "addsign-wrongProfile", Utils.createCommaSeparatedList(profiles), region);
|
||||
return;
|
||||
}
|
||||
}
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
|
||||
if(regionSign != null) {
|
||||
plugin.message(sender, "addsign-alreadyRegistered", regionSign.getRegion());
|
||||
return;
|
||||
}
|
||||
|
||||
region.getSignsFeature().addSign(block.getLocation(), block.getType(), sign.getFacing(), profile);
|
||||
if(profile == null) {
|
||||
plugin.message(sender, "addsign-success", region);
|
||||
} else {
|
||||
plugin.message(sender, "addsign-successProfile", profile, region);
|
||||
}
|
||||
region.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getConfig().getStringList("signProfiles"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+69
-77
@@ -1,77 +1,69 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.BuyRegion;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class BuyCommand extends CommandAreaShop {
|
||||
|
||||
public BuyCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop buy";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.buy")) {
|
||||
return plugin.getLanguageManager().getLang("help-buy");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.buy")) {
|
||||
plugin.message(sender, "buy-noPermission");
|
||||
return;
|
||||
}
|
||||
if (!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
if(args.length > 1 && args[1] != null) {
|
||||
BuyRegion region = plugin.getFileManager().getBuy(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(player, "buy-notBuyable");
|
||||
} else {
|
||||
region.buy(player);
|
||||
}
|
||||
} else {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
|
||||
if (regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if (regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
regions.get(0).buy(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(!region.isSold()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class BuyCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop buy";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.buy")) {
|
||||
return "help-buy";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.buy")) {
|
||||
plugin.message(sender, "buy-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
if(args.length > 1 && args[1] != null) {
|
||||
BuyRegion region = plugin.getFileManager().getBuy(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(player, "buy-notBuyable", args[1]);
|
||||
} else {
|
||||
region.buy(player);
|
||||
}
|
||||
} else {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
} else {
|
||||
regions.get(0).buy(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(!region.isSold()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Abstract class for generalising command classes.
|
||||
*/
|
||||
public abstract class CommandAreaShop {
|
||||
|
||||
final AreaShop plugin = AreaShop.getInstance();
|
||||
|
||||
private final Map<String, CommandTime> lastUsed;
|
||||
|
||||
public CommandAreaShop() {
|
||||
lastUsed = new HashMap<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this Command instance can execute the given command and arguments.
|
||||
* @param command The command to check for execution
|
||||
* @param args The arguments to check
|
||||
* @return true if it can execute the command, false otherwise
|
||||
*/
|
||||
public boolean canExecute(Command command, String[] args) {
|
||||
String commandString = command.getName() + " " + StringUtils.join(args, " ");
|
||||
if(commandString.length() > getCommandStart().length()) {
|
||||
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase() + " ");
|
||||
}
|
||||
return commandString.toLowerCase().startsWith(getCommandStart().toLowerCase());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of string to complete a command with (raw list, not matching ones not filtered out).
|
||||
* @param toComplete The number of the argument that has to be completed
|
||||
* @param start The already given start of the command
|
||||
* @param sender The CommandSender that wants to tab complete
|
||||
* @return A collection with all the possibilities for argument to complete
|
||||
*/
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the argument that comes after the base command that this command reacts to.
|
||||
* @return The string that should be in front of the command for this class to act
|
||||
*/
|
||||
public abstract String getCommandStart();
|
||||
|
||||
/**
|
||||
* Returns the correct help string key to be used on the help page.
|
||||
* @param target The CommandSender that the help message is for
|
||||
* @return The help message key according to the permissions of the reciever
|
||||
*/
|
||||
public abstract String getHelp(CommandSender target);
|
||||
|
||||
/**
|
||||
* Execute a (sub)command if the conditions are met.
|
||||
* @param sender The commandSender that executed the command
|
||||
* @param args The arguments that are given
|
||||
*/
|
||||
public abstract void execute(CommandSender sender, String[] args);
|
||||
|
||||
/**
|
||||
* Confirm a command.
|
||||
* @param sender To confirm it for, or send a message to confirm
|
||||
* @param args Command args
|
||||
* @param message Message to send when confirmation is required
|
||||
* @return true if confirmed, false if confirmation is required
|
||||
*/
|
||||
public boolean confirm(CommandSender sender, String[] args, Message message) {
|
||||
String command = "/" + getCommandStart() + " " + StringUtils.join(args, " ", 1, args.length);
|
||||
long now = System.currentTimeMillis();
|
||||
CommandTime last = lastUsed.get(sender.getName());
|
||||
if(last != null && last.command.equalsIgnoreCase(command) && last.time > (now - 1000 * 60)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
message.prefix().append(Message.fromKey("confirm-yes").replacements(command)).send(sender);
|
||||
lastUsed.put(sender.getName(), new CommandTime(command, now));
|
||||
return false;
|
||||
}
|
||||
|
||||
private class CommandTime {
|
||||
public String command;
|
||||
public long time;
|
||||
|
||||
CommandTime(String command, long time) {
|
||||
this.command = command;
|
||||
this.time = time;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,131 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class DelCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop del";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.destroyrent") || target.hasPermission("areashop.destroybuy") || target.hasPermission("areashop.destroyrent.landlord") || target.hasPermission("areashop.destroybuy.landlord")) {
|
||||
return "help-del";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.destroybuy")
|
||||
&& !sender.hasPermission("areashop.destroybuy.landlord")
|
||||
|
||||
&& !sender.hasPermission("areashop.destroyrent")
|
||||
&& !sender.hasPermission("areashop.destroyrent.landlord")) {
|
||||
plugin.message(sender, "del-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2) {
|
||||
// Only players can have a selection
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-weOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "cmd-noSelection");
|
||||
return;
|
||||
}
|
||||
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
|
||||
if(regions == null || regions.size() == 0) {
|
||||
plugin.message(player, "cmd-noRegionsFound");
|
||||
return;
|
||||
}
|
||||
// Start removing the regions that he has permission for
|
||||
ArrayList<String> namesSuccess = new ArrayList<>();
|
||||
TreeSet<GeneralRegion> namesFailed = new TreeSet<>();
|
||||
for(GeneralRegion region : regions) {
|
||||
boolean isLandlord = region.isLandlord(((Player)sender).getUniqueId());
|
||||
if(region instanceof RentRegion) {
|
||||
if(!sender.hasPermission("areashop.destroyrent") && !(isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
|
||||
namesFailed.add(region);
|
||||
} else {
|
||||
plugin.getFileManager().removeRent((RentRegion)region, true);
|
||||
namesSuccess.add(region.getName());
|
||||
}
|
||||
} else if(region instanceof BuyRegion) {
|
||||
if(!sender.hasPermission("areashop.destroybuy") && !(isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
|
||||
namesFailed.add(region);
|
||||
} else {
|
||||
plugin.getFileManager().removeBuy((BuyRegion)region, true);
|
||||
namesSuccess.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
// send messages
|
||||
if(namesSuccess.size() != 0) {
|
||||
plugin.message(sender, "del-success", Utils.createCommaSeparatedList(namesSuccess));
|
||||
}
|
||||
if(namesFailed.size() != 0) {
|
||||
plugin.message(sender, "del-failed", Utils.combinedMessage(namesFailed, "region"));
|
||||
}
|
||||
} else {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
boolean isLandlord = sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId());
|
||||
if(region instanceof RentRegion) {
|
||||
// Remove the rent if the player has permission
|
||||
if(sender.hasPermission("areashop.destroyrent") || (isLandlord && sender.hasPermission("areashop.destroyrent.landlord"))) {
|
||||
plugin.getFileManager().removeRent((RentRegion)region, true);
|
||||
plugin.message(sender, "destroy-successRent", region);
|
||||
} else {
|
||||
plugin.message(sender, "destroy-noPermissionRent", region);
|
||||
}
|
||||
} else if(region instanceof BuyRegion) {
|
||||
// Remove the buy if the player has permission
|
||||
if(sender.hasPermission("areashop.destroybuy") || (isLandlord && sender.hasPermission("areashop.destroybuy.landlord"))) {
|
||||
plugin.getFileManager().removeBuy((BuyRegion)region, true);
|
||||
plugin.message(sender, "destroy-successBuy", region);
|
||||
} else {
|
||||
plugin.message(sender, "destroy-noPermissionBuy", region);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,139 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DelfriendCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop delfriend";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.delfriendall") || target.hasPermission("areashop.delfriend")) {
|
||||
return "help-delFriend";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a person can remove friends.
|
||||
* @param person The person to check
|
||||
* @param region The region to check for
|
||||
* @return true if the person can remove friends, otherwise false
|
||||
*/
|
||||
public static boolean canUse(CommandSender person, GeneralRegion region) {
|
||||
if(person.hasPermission("areashop.delfriendall")) {
|
||||
return true;
|
||||
}
|
||||
if(person instanceof Player) {
|
||||
Player player = (Player)person;
|
||||
return region.isOwner(player) && player.hasPermission("areashop.delfriend");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@SuppressWarnings("deprecation")
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.delfriend") && !sender.hasPermission("areashop.delfriendall")) {
|
||||
plugin.message(sender, "delfriend-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "delfriend-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region;
|
||||
if(args.length <= 2) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(sender.hasPermission("areashop.delfriendall")) {
|
||||
if((region instanceof RentRegion && !((RentRegion)region).isRented())
|
||||
|| (region instanceof BuyRegion && !((BuyRegion)region).isSold())) {
|
||||
plugin.message(sender, "delfriend-noOwner", region);
|
||||
return;
|
||||
}
|
||||
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
|
||||
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
|
||||
region.update();
|
||||
plugin.message(sender, "delfriend-successOther", friend.getName(), region);
|
||||
}
|
||||
} else {
|
||||
if(sender.hasPermission("areashop.delfriend") && sender instanceof Player) {
|
||||
if(region.isOwner((Player)sender)) {
|
||||
OfflinePlayer friend = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(!region.getFriendsFeature().getFriends().contains(friend.getUniqueId())) {
|
||||
plugin.message(sender, "delfriend-notAdded", friend.getName(), region);
|
||||
return;
|
||||
}
|
||||
if(region.getFriendsFeature().deleteFriend(friend.getUniqueId(), sender)) {
|
||||
region.update();
|
||||
plugin.message(sender, "delfriend-success", friend.getName(), region);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "delfriend-noPermissionOther", region);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "delfriend-noPermission", region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+78
-86
@@ -1,86 +1,78 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.BlockIterator;
|
||||
|
||||
public class DelsignCommand extends CommandAreaShop {
|
||||
|
||||
public DelsignCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop delsign";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.delsign")) {
|
||||
return plugin.getLanguageManager().getLang("help-delsign");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.delsign")) {
|
||||
plugin.message(sender, "delsign-noPermission");
|
||||
return;
|
||||
}
|
||||
if (!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
|
||||
// Get the sign
|
||||
Block block = null;
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext() && block == null) {
|
||||
Block next = blockIterator.next();
|
||||
if(next.getType() != Material.AIR) {
|
||||
block = next;
|
||||
}
|
||||
}
|
||||
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
|
||||
plugin.message(sender, "delsign-noSign");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region = plugin.getFileManager().getRegionBySignLocation(block.getLocation());
|
||||
if(region == null) {
|
||||
plugin.message(sender, "delsign-noRegion");
|
||||
return;
|
||||
}
|
||||
plugin.message(sender, "delsign-success", region.getName());
|
||||
region.removeSign(block.getLocation());
|
||||
region.updateSigns();
|
||||
region.saveRequired();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
return new ArrayList<String>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.features.signs.RegionSign;
|
||||
import me.wiefferink.areashop.features.signs.SignsFeature;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.BlockIterator;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class DelsignCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop delsign";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.delsign")) {
|
||||
return "help-delsign";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.delsign")) {
|
||||
plugin.message(sender, "delsign-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
|
||||
// Get the sign
|
||||
Block block = null;
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext() && block == null) {
|
||||
Block next = blockIterator.next();
|
||||
if(next.getType() != Material.AIR) {
|
||||
block = next;
|
||||
}
|
||||
}
|
||||
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
|
||||
plugin.message(sender, "delsign-noSign");
|
||||
return;
|
||||
}
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
|
||||
if(regionSign == null) {
|
||||
plugin.message(sender, "delsign-noRegion");
|
||||
return;
|
||||
}
|
||||
plugin.message(sender, "delsign-success", regionSign.getRegion());
|
||||
regionSign.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
public class FindCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop find";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.find")) {
|
||||
return "help-find";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.find")) {
|
||||
plugin.message(sender, "find-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
if(args.length <= 1 || args[1] == null || (!args[1].equalsIgnoreCase("buy") && !args[1].equalsIgnoreCase("rent"))) {
|
||||
plugin.message(sender, "find-help");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
double balance = 0.0;
|
||||
if(plugin.getEconomy() != null) {
|
||||
balance = plugin.getEconomy().getBalance(player);
|
||||
}
|
||||
double maxPrice = 0;
|
||||
boolean maxPriceSet = false;
|
||||
RegionGroup group = null;
|
||||
// Parse optional price argument
|
||||
if(args.length >= 3) {
|
||||
try {
|
||||
maxPrice = Double.parseDouble(args[2]);
|
||||
maxPriceSet = true;
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "find-wrongMaxPrice", args[2]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Parse optional group argument
|
||||
if(args.length >= 4) {
|
||||
group = plugin.getFileManager().getGroup(args[3]);
|
||||
if(group == null) {
|
||||
plugin.message(sender, "find-wrongGroup", args[3]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Find buy regions
|
||||
if(args[1].equalsIgnoreCase("buy")) {
|
||||
List<BuyRegion> regions = plugin.getFileManager().getBuys();
|
||||
List<BuyRegion> results = new ArrayList<>();
|
||||
for(BuyRegion region : regions) {
|
||||
if(!region.isSold()
|
||||
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
|
||||
&& (group == null || group.isMember(region))
|
||||
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
|
||||
results.add(region);
|
||||
}
|
||||
}
|
||||
if(!results.isEmpty()) {
|
||||
// Draw a random one
|
||||
BuyRegion region = results.get(new Random().nextInt(results.size()));
|
||||
Message onlyInGroup = Message.empty();
|
||||
if(group != null) {
|
||||
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
|
||||
}
|
||||
|
||||
// Teleport
|
||||
if(maxPriceSet) {
|
||||
plugin.message(player, "find-successMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup, region);
|
||||
} else {
|
||||
plugin.message(player, "find-success", "buy", Utils.formatCurrency(balance), onlyInGroup, region);
|
||||
}
|
||||
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
|
||||
} else {
|
||||
Message onlyInGroup = Message.empty();
|
||||
if(group != null) {
|
||||
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
|
||||
}
|
||||
if(maxPriceSet) {
|
||||
plugin.message(player, "find-noneFoundMax", "buy", Utils.formatCurrency(maxPrice), onlyInGroup);
|
||||
} else {
|
||||
plugin.message(player, "find-noneFound", "buy", Utils.formatCurrency(balance), onlyInGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Find rental regions
|
||||
else {
|
||||
List<RentRegion> regions = plugin.getFileManager().getRents();
|
||||
List<RentRegion> results = new ArrayList<>();
|
||||
for(RentRegion region : regions) {
|
||||
if(!region.isRented()
|
||||
&& ((region.getPrice() <= balance && !maxPriceSet) || (region.getPrice() <= maxPrice && maxPriceSet))
|
||||
&& (group == null || group.isMember(region))
|
||||
&& (region.getBooleanSetting("general.findCrossWorld") || player.getWorld().equals(region.getWorld()))) {
|
||||
results.add(region);
|
||||
}
|
||||
}
|
||||
if(!results.isEmpty()) {
|
||||
// Draw a random one
|
||||
RentRegion region = results.get(new Random().nextInt(results.size()));
|
||||
Message onlyInGroup = Message.empty();
|
||||
if(group != null) {
|
||||
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
|
||||
}
|
||||
|
||||
// Teleport
|
||||
if(maxPriceSet) {
|
||||
plugin.message(player, "find-successMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup, region);
|
||||
} else {
|
||||
plugin.message(player, "find-success", "rent", Utils.formatCurrency(balance), onlyInGroup, region);
|
||||
}
|
||||
region.getTeleportFeature().teleportPlayer(player, region.getBooleanSetting("general.findTeleportToSign"), false);
|
||||
} else {
|
||||
Message onlyInGroup = Message.empty();
|
||||
if(group != null) {
|
||||
onlyInGroup = Message.fromKey("find-onlyInGroup").replacements(args[3]);
|
||||
}
|
||||
if(maxPriceSet) {
|
||||
plugin.message(player, "find-noneFoundMax", "rent", Utils.formatCurrency(maxPrice), onlyInGroup);
|
||||
} else {
|
||||
plugin.message(player, "find-noneFound", "rent", Utils.formatCurrency(balance), onlyInGroup);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.add("buy");
|
||||
result.add("rent");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+113
-126
@@ -1,126 +1,113 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
import nl.evolutioncoding.areashop.regions.RegionGroup;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import com.sk89q.worldedit.bukkit.selections.Selection;
|
||||
|
||||
public class GroupaddCommand extends CommandAreaShop {
|
||||
|
||||
public GroupaddCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop groupadd";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.groupadd")) {
|
||||
return plugin.getLanguageManager().getLang("help-groupadd");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.groupadd")) {
|
||||
plugin.message(sender, "groupadd-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "groupadd-help");
|
||||
return;
|
||||
}
|
||||
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
|
||||
if(group == null) {
|
||||
group = new RegionGroup(plugin, args[1]);
|
||||
plugin.getFileManager().addGroup(group);
|
||||
group.saveRequired();
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-weOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
Selection selection = plugin.getWorldEdit().getSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "cmd-noSelection");
|
||||
return;
|
||||
}
|
||||
List<GeneralRegion> regions = plugin.getFileManager().getASRegionsInSelection(selection);
|
||||
if(regions.size() == 0) {
|
||||
plugin.message(player, "cmd-noRegionsFound");
|
||||
return;
|
||||
}
|
||||
ArrayList<String> namesSuccess = new ArrayList<String>();
|
||||
ArrayList<String> namesFailed = new ArrayList<String>();
|
||||
ArrayList<GeneralRegion> toUpdate = new ArrayList<GeneralRegion>();
|
||||
for(GeneralRegion region : regions) {
|
||||
if(group.addMember(region)) {
|
||||
namesSuccess.add(region.getName());
|
||||
toUpdate.add(region);
|
||||
} else {
|
||||
namesFailed.add(region.getName());
|
||||
}
|
||||
}
|
||||
// Update all regions, this does it in a task, updating them without lag
|
||||
plugin.getFileManager().updateRegions(toUpdate);
|
||||
if(namesSuccess.size() != 0) {
|
||||
plugin.message(player, "groupadd-weSuccess", group.getName(), Utils.createCommaSeparatedList(namesSuccess));
|
||||
}
|
||||
if(namesFailed.size() != 0) {
|
||||
plugin.message(player, "groupadd-weFailed", group.getName(), Utils.createCommaSeparatedList(namesFailed));
|
||||
}
|
||||
group.saveRequired();
|
||||
} else {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "groupadd-noRegion", args[2]);
|
||||
return;
|
||||
}
|
||||
if(group.addMember(region)) {
|
||||
region.updateRegionFlags();
|
||||
region.updateSigns();
|
||||
plugin.message(sender, "groupadd-success", region.getName(), group.getName(), group.getMembers().size());
|
||||
} else {
|
||||
plugin.message(sender, "groupadd-failed", region.getName(), group.getName());
|
||||
}
|
||||
group.saveRequired();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getGroupNames();
|
||||
} else if(toComplete == 3) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class GroupaddCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop groupadd";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.groupadd")) {
|
||||
return "help-groupadd";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.groupadd")) {
|
||||
plugin.message(sender, "groupadd-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "groupadd-help");
|
||||
return;
|
||||
}
|
||||
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
|
||||
if(group == null) {
|
||||
group = new RegionGroup(plugin, args[1]);
|
||||
plugin.getFileManager().addGroup(group);
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-weOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "cmd-noSelection");
|
||||
return;
|
||||
}
|
||||
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
|
||||
if(regions.size() == 0) {
|
||||
plugin.message(player, "cmd-noRegionsFound");
|
||||
return;
|
||||
}
|
||||
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
|
||||
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
|
||||
for(GeneralRegion region : regions) {
|
||||
if(group.addMember(region)) {
|
||||
regionsSuccess.add(region);
|
||||
} else {
|
||||
regionsFailed.add(region);
|
||||
}
|
||||
}
|
||||
if(regionsSuccess.size() != 0) {
|
||||
plugin.message(player, "groupadd-weSuccess", group.getName(), Utils.combinedMessage(regionsSuccess, "region"));
|
||||
}
|
||||
if(regionsFailed.size() != 0) {
|
||||
plugin.message(player, "groupadd-weFailed", group.getName(), Utils.combinedMessage(regionsFailed, "region"));
|
||||
}
|
||||
// Update all regions, this does it in a task, updating them without lag
|
||||
plugin.getFileManager().updateRegions(new ArrayList<>(regionsSuccess), player);
|
||||
} else {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
if(group.addMember(region)) {
|
||||
region.update();
|
||||
plugin.message(sender, "groupadd-success", group.getName(), group.getMembers().size(), region);
|
||||
} else {
|
||||
plugin.message(sender, "groupadd-failed", group.getName(), region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getGroupNames();
|
||||
} else if(toComplete == 3) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class GroupdelCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop groupdel";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.groupdel")) {
|
||||
return "help-groupdel";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.groupdel")) {
|
||||
plugin.message(sender, "groupdel-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "groupdel-help");
|
||||
return;
|
||||
}
|
||||
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
|
||||
if(group == null) {
|
||||
plugin.message(sender, "groupdel-wrongGroup", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length == 2) {
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-weOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "cmd-noSelection");
|
||||
return;
|
||||
}
|
||||
List<GeneralRegion> regions = Utils.getRegionsInSelection(selection);
|
||||
if(regions.size() == 0) {
|
||||
plugin.message(player, "cmd-noRegionsFound");
|
||||
return;
|
||||
}
|
||||
TreeSet<GeneralRegion> regionsSuccess = new TreeSet<>();
|
||||
TreeSet<GeneralRegion> regionsFailed = new TreeSet<>();
|
||||
for(GeneralRegion region : regions) {
|
||||
if(group.removeMember(region)) {
|
||||
regionsSuccess.add(region);
|
||||
} else {
|
||||
regionsFailed.add(region);
|
||||
}
|
||||
}
|
||||
if(regionsSuccess.size() != 0) {
|
||||
plugin.message(player, "groupdel-weSuccess", group.getName(), Utils.combinedMessage(regionsSuccess, "region"));
|
||||
}
|
||||
if(regionsFailed.size() != 0) {
|
||||
plugin.message(player, "groupdel-weFailed", group.getName(), Utils.combinedMessage(regionsFailed, "region"));
|
||||
}
|
||||
// Update all regions, this does it in a task, updating them without lag
|
||||
plugin.getFileManager().updateRegions(new ArrayList<>(regionsSuccess), player);
|
||||
group.saveRequired();
|
||||
} else {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[2]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
if(group.removeMember(region)) {
|
||||
region.update();
|
||||
plugin.message(sender, "groupdel-success", group.getName(), group.getMembers().size(), region);
|
||||
} else {
|
||||
plugin.message(sender, "groupdel-failed", group.getName(), region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getGroupNames();
|
||||
} else if(toComplete == 3) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+69
-75
@@ -1,75 +1,69 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
import nl.evolutioncoding.areashop.regions.RegionGroup;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class GroupinfoCommand extends CommandAreaShop {
|
||||
|
||||
public GroupinfoCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop groupinfo";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.groupinfo")) {
|
||||
return plugin.getLanguageManager().getLang("help-groupinfo");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.groupinfo")) {
|
||||
plugin.message(sender, "groupinfo-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "groupinfo-help");
|
||||
return;
|
||||
}
|
||||
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
|
||||
if(group == null) {
|
||||
plugin.message(sender, "groupinfo-noGroup", args[1]);
|
||||
return;
|
||||
}
|
||||
List<String> members = group.getMembers();
|
||||
if(members.size() == 0) {
|
||||
plugin.message(sender, "groupinfo-noMembers", group.getName());
|
||||
} else {
|
||||
plugin.message(sender, "groupinfo-members", group.getName(), Utils.createCommaSeparatedList(members));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getGroupNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class GroupinfoCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop groupinfo";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.groupinfo")) {
|
||||
return "help-groupinfo";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.groupinfo")) {
|
||||
plugin.message(sender, "groupinfo-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "groupinfo-help");
|
||||
return;
|
||||
}
|
||||
RegionGroup group = plugin.getFileManager().getGroup(args[1]);
|
||||
if(group == null) {
|
||||
plugin.message(sender, "groupinfo-noGroup", args[1]);
|
||||
return;
|
||||
}
|
||||
Set<String> members = group.getMembers();
|
||||
if(members.size() == 0) {
|
||||
plugin.message(sender, "groupinfo-noMembers", group.getName());
|
||||
} else {
|
||||
plugin.message(sender, "groupinfo-members", group.getName(), Utils.createCommaSeparatedList(members));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getGroupNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+53
-60
@@ -1,60 +1,53 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class GrouplistCommand extends CommandAreaShop {
|
||||
|
||||
public GrouplistCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop grouplist";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.grouplist")) {
|
||||
return plugin.getLanguageManager().getLang("help-grouplist");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.grouplist")) {
|
||||
plugin.message(sender, "grouplist-noPermission");
|
||||
return;
|
||||
}
|
||||
List<String> groups = plugin.getFileManager().getGroupNames();
|
||||
if(groups.size() == 0) {
|
||||
plugin.message(sender, "grouplist-noGroups");
|
||||
} else {
|
||||
plugin.message(sender, "grouplist-success", Utils.createCommaSeparatedList(groups));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
return new ArrayList<String>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class GrouplistCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop grouplist";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.grouplist")) {
|
||||
return "help-grouplist";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.grouplist")) {
|
||||
plugin.message(sender, "grouplist-noPermission");
|
||||
return;
|
||||
}
|
||||
List<String> groups = plugin.getFileManager().getGroupNames();
|
||||
if(groups.size() == 0) {
|
||||
plugin.message(sender, "grouplist-noGroups");
|
||||
} else {
|
||||
plugin.message(sender, "grouplist-success", Utils.createCommaSeparatedList(groups));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class HelpCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop help";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.help")) {
|
||||
return "help-help";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
plugin.getCommandManager().showHelp(sender);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ImportCommand extends CommandAreaShop {
|
||||
|
||||
/* RegionGroup priority usage:
|
||||
0: Settings from /config.yml
|
||||
1: Settings from /worlds/<world>/config.yml
|
||||
2: Settings from /worlds/<world>/parent-regions.yml (if their priority is set it is added to this value)
|
||||
*/
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop import";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.import")) {
|
||||
return "help-import";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO
|
||||
// - Landlord?
|
||||
// - Friends
|
||||
// - Region flags?
|
||||
// - Settings from the 'permissions' section in RegionForSale/config.yml?
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.import")) {
|
||||
plugin.message(sender, "import-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "import-help");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!"RegionForSale".equalsIgnoreCase(args[1])) {
|
||||
plugin.message(sender, "import-wrongSource");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!confirm(sender, args, Message.fromKey("import-confirm"))) {
|
||||
return;
|
||||
}
|
||||
|
||||
ImportJob importJob = new ImportJob(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.add("RegionForSale");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,477 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.features.signs.RegionSign;
|
||||
import me.wiefferink.areashop.features.signs.SignsFeature;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.ConsoleCommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class ImportJob {
|
||||
|
||||
private final AreaShop plugin;
|
||||
private final CommandSender sender;
|
||||
|
||||
/**
|
||||
* Create and execute the import.
|
||||
* @param sender CommandSender that should receive progress updates
|
||||
*/
|
||||
public ImportJob(CommandSender sender) {
|
||||
this.sender = sender;
|
||||
this.plugin = AreaShop.getInstance();
|
||||
execute();
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute the job.
|
||||
*/
|
||||
private void execute() {
|
||||
// Check for RegionForSale data
|
||||
File regionForSaleFolder = new File(plugin.getDataFolder().getParentFile().getAbsolutePath(), "RegionForSale");
|
||||
if(!regionForSaleFolder.exists()) {
|
||||
message("import-noPluginFolder", regionForSaleFolder.getName());
|
||||
return;
|
||||
}
|
||||
|
||||
File worldsFolder = new File(regionForSaleFolder.getAbsolutePath(), "worlds");
|
||||
if(!worldsFolder.exists()) {
|
||||
message("import-noWorldsFolder");
|
||||
return;
|
||||
}
|
||||
|
||||
File[] worldFolders = worldsFolder.listFiles();
|
||||
if(worldFolders == null) {
|
||||
message("import-noWorldsFolder");
|
||||
return;
|
||||
}
|
||||
|
||||
// Import data for each world
|
||||
message("import-start");
|
||||
|
||||
// Group with settings for all imported regions
|
||||
RegionGroup regionForSaleGroup = new RegionGroup(plugin, "RegionForSale");
|
||||
plugin.getFileManager().addGroup(regionForSaleGroup);
|
||||
|
||||
// Import /RegionForSale/config.yml settings
|
||||
File regionForSaleConfigFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
|
||||
YamlConfiguration regionForSaleConfig = loadConfiguration(regionForSaleConfigFile);
|
||||
if(regionForSaleConfig == null) {
|
||||
messageNoPrefix("import-loadConfigFailed", regionForSaleConfigFile.getAbsolutePath());
|
||||
regionForSaleConfig = new YamlConfiguration();
|
||||
} else {
|
||||
importRegionSettings(regionForSaleConfig, regionForSaleGroup.getSettings(), null, false);
|
||||
regionForSaleGroup.setSetting("priority", 0);
|
||||
}
|
||||
|
||||
// Import /RegionForSale/general.yml settings
|
||||
File regionForSaleGeneralFile = new File(regionForSaleFolder.getAbsolutePath(), "config.yml");
|
||||
YamlConfiguration regionForSaleGeneral = loadConfiguration(regionForSaleConfigFile);
|
||||
if(regionForSaleGeneral == null) {
|
||||
messageNoPrefix("import-loadConfigFailed", regionForSaleGeneralFile.getAbsolutePath());
|
||||
} else {
|
||||
// Collection interval of RegionForSale maps to rent duration
|
||||
String duration = "1 day";
|
||||
if(regionForSaleGeneral.isLong("interval.collect_money")) {
|
||||
duration = minutesToString(regionForSaleGeneral.getLong("interval.collect_money"));
|
||||
}
|
||||
regionForSaleGroup.setSetting("rent.duration", duration);
|
||||
|
||||
// Global economy account has an effect close to landlord in AreaShop
|
||||
if(regionForSaleGeneral.isString("global_econ_account")) {
|
||||
regionForSaleGroup.setSetting("general.landlordName", regionForSaleGeneral.getString("global_econ_account"));
|
||||
}
|
||||
}
|
||||
regionForSaleGroup.saveRequired();
|
||||
|
||||
////////// Handle defaults of RegionForSale
|
||||
|
||||
// Set autoExtend, to keep the same behavior as RegionForSale had
|
||||
regionForSaleGroup.setSetting("rent.autoExtend", true);
|
||||
|
||||
// Import regions from each world
|
||||
for(File worldFolder : worldFolders) {
|
||||
// Skip files
|
||||
if(!worldFolder.isDirectory() || worldFolder.isHidden()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
messageNoPrefix("import-doWorld", worldFolder.getName());
|
||||
|
||||
// Get the Bukkit world
|
||||
World world = Bukkit.getWorld(worldFolder.getName());
|
||||
if(world == null) {
|
||||
messageNoPrefix("import-noBukkitWorld");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get the WorldGuard RegionManager
|
||||
RegionManager regionManager = plugin.getRegionManager(world);
|
||||
if(regionManager == null) {
|
||||
messageNoPrefix("import-noRegionManger");
|
||||
continue;
|
||||
}
|
||||
|
||||
// Load the /worlds/<world>/regions.yml file
|
||||
File regionsFile = new File(worldFolder.getAbsolutePath(), "regions.yml");
|
||||
YamlConfiguration regions = loadConfiguration(regionsFile);
|
||||
if(regions == null) {
|
||||
messageNoPrefix("import-loadRegionsFailed", regionsFile.getAbsolutePath());
|
||||
continue;
|
||||
}
|
||||
|
||||
// Load /worlds/<world>/config.yml file
|
||||
File worldConfigFile = new File(worldFolder.getAbsolutePath(), "config.yml");
|
||||
YamlConfiguration worldConfig = loadConfiguration(worldConfigFile);
|
||||
if(worldConfig == null) {
|
||||
messageNoPrefix("import-loadWorldConfigFailed", worldConfigFile.getAbsolutePath());
|
||||
// Simply skip importing the settings, since this is not really fatal
|
||||
worldConfig = new YamlConfiguration();
|
||||
} else {
|
||||
// RegionGroup with all world settings
|
||||
RegionGroup worldGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName());
|
||||
importRegionSettings(worldConfig, worldGroup.getSettings(), null, false);
|
||||
worldGroup.setSetting("priority", 1);
|
||||
worldGroup.addWorld(worldFolder.getName());
|
||||
plugin.getFileManager().addGroup(regionForSaleGroup);
|
||||
worldGroup.saveRequired();
|
||||
}
|
||||
|
||||
// Create groups to hold settings of /worlds/<world>/parent-regions.yml
|
||||
File parentRegionsFile = new File(worldFolder.getAbsolutePath(), "parent-regions.yml");
|
||||
YamlConfiguration parentRegions = loadConfiguration(parentRegionsFile);
|
||||
if(parentRegions == null) {
|
||||
messageNoPrefix("import-loadParentRegionsFailed", parentRegionsFile.getAbsolutePath());
|
||||
// Non-fatal, so just continue
|
||||
} else {
|
||||
for(String parentRegionName : parentRegions.getKeys(false)) {
|
||||
// Get WorldGuard region
|
||||
ProtectedRegion worldGuardRegion = regionManager.getRegion(parentRegionName);
|
||||
if(worldGuardRegion == null) {
|
||||
messageNoPrefix("import-noWorldGuardRegionParent", parentRegionName);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get settings section
|
||||
ConfigurationSection parentRegionSection = parentRegions.getConfigurationSection(parentRegionName);
|
||||
if(parentRegionSection == null) {
|
||||
messageNoPrefix("import-improperParentRegion", parentRegionName);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip if it does not have any settings
|
||||
if(parentRegionSection.getKeys(false).isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Import parent region settings into a RegionGroup
|
||||
RegionGroup parentRegionGroup = new RegionGroup(plugin, "RegionForSale-" + worldFolder.getName() + "-" + parentRegionName);
|
||||
importRegionSettings(parentRegionSection, parentRegionGroup.getSettings(), null, false);
|
||||
parentRegionGroup.setSetting("priority", 2 + parentRegionSection.getLong("info.priority", 0));
|
||||
parentRegionGroup.saveRequired();
|
||||
|
||||
// TODO add all regions that are contained in this parent region
|
||||
// Utils.getWorldEditRegionsInSelection()
|
||||
}
|
||||
}
|
||||
|
||||
// Read and import regions
|
||||
for(String regionKey : regions.getKeys(false)) {
|
||||
GeneralRegion existingRegion = plugin.getFileManager().getRegion(regionKey);
|
||||
if(existingRegion != null) {
|
||||
if(world.getName().equalsIgnoreCase(existingRegion.getWorldName())) {
|
||||
messageNoPrefix("import-alreadyAdded", regionKey);
|
||||
} else {
|
||||
messageNoPrefix("import-alreadyAddedOtherWorld", regionKey, existingRegion.getWorldName(), world.getName());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
ConfigurationSection regionSection = regions.getConfigurationSection(regionKey);
|
||||
if(regionSection == null) {
|
||||
messageNoPrefix("import-invalidRegionSection", regionKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Get WorldGuard region
|
||||
ProtectedRegion worldGuardRegion = regionManager.getRegion(regionKey);
|
||||
if(worldGuardRegion == null) {
|
||||
messageNoPrefix("import-noWorldGuardRegion", regionKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
String owner = regionSection.getString("info.owner", null);
|
||||
boolean isBought = regionSection.getBoolean("info.is-bought");
|
||||
// TODO: should also take into config settings of parent regions
|
||||
boolean rentable = regionSection.getBoolean("economic-settings.rentable", worldConfig.getBoolean("economic-settings.rentable", regionForSaleConfig.getBoolean("economic-settings.rentable")));
|
||||
boolean buyable = regionSection.getBoolean("economic-settings.buyable", worldConfig.getBoolean("economic-settings.buyable", regionForSaleConfig.getBoolean("economic-settings.buyable")));
|
||||
|
||||
// Can be bought and rented, import as buy
|
||||
if(buyable && rentable) {
|
||||
messageNoPrefix("import-buyAndRent", regionKey);
|
||||
}
|
||||
|
||||
// Cannot be bought or rented, skip
|
||||
if(!buyable && !rentable && owner == null) {
|
||||
messageNoPrefix("import-noBuyAndNoRent", regionKey);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create region
|
||||
GeneralRegion region;
|
||||
if(rentable || (owner != null && !isBought)) {
|
||||
region = new RentRegion(regionKey, world);
|
||||
plugin.getFileManager().addRent((RentRegion)region);
|
||||
} else {
|
||||
region = new BuyRegion(regionKey, world);
|
||||
plugin.getFileManager().addBuy((BuyRegion)region);
|
||||
}
|
||||
|
||||
// Import settings
|
||||
importRegionSettings(regionSection, region.getConfig(), region, !buyable && !rentable);
|
||||
region.getConfig().set("general.importedFrom", "RegionForSale");
|
||||
|
||||
// Get existing owners and members
|
||||
List<UUID> existing = new ArrayList<>();
|
||||
if(owner != null) {
|
||||
@SuppressWarnings("deprecation")
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(owner);
|
||||
if(offlinePlayer != null) {
|
||||
existing.add(offlinePlayer.getUniqueId());
|
||||
}
|
||||
}
|
||||
for(UUID uuid : plugin.getWorldGuardHandler().getOwners(worldGuardRegion).asUniqueIdList()) {
|
||||
if(!existing.contains(uuid)) {
|
||||
existing.add(uuid);
|
||||
}
|
||||
}
|
||||
for(UUID uuid : plugin.getWorldGuardHandler().getMembers(worldGuardRegion).asUniqueIdList()) {
|
||||
if(!existing.contains(uuid)) {
|
||||
existing.add(uuid);
|
||||
}
|
||||
}
|
||||
|
||||
// First owner (or if none, the first member) will be the renter/buyer
|
||||
if(!existing.isEmpty()) {
|
||||
region.setOwner(existing.remove(0));
|
||||
}
|
||||
// Add others as friends
|
||||
for(UUID friend : existing) {
|
||||
region.getFriendsFeature().addFriend(friend, null);
|
||||
}
|
||||
|
||||
region.saveRequired();
|
||||
|
||||
messageNoPrefix("import-imported", regionKey);
|
||||
}
|
||||
}
|
||||
|
||||
// Update all regions
|
||||
plugin.getFileManager().updateAllRegions(sender);
|
||||
// Write all imported regions and settings to disk
|
||||
plugin.getFileManager().saveRequiredFiles();
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a YamlConfiguration from disk using UTF-8 encoding.
|
||||
* @param from File to read the configuration from
|
||||
* @return YamlConfiguration if the file exists and got read wihout problems, otherwise null
|
||||
*/
|
||||
private YamlConfiguration loadConfiguration(File from) {
|
||||
try(
|
||||
InputStreamReader reader = new InputStreamReader(new FileInputStream(from), Charsets.UTF_8)
|
||||
) {
|
||||
return YamlConfiguration.loadConfiguration(reader);
|
||||
} catch(IOException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Import region specific settings from a RegionForSale source to an AreaShop target ConfigurationSection.
|
||||
* @param from RegionForSale config section that specifies region settings
|
||||
* @param to AreaShop config section that specifies region settings
|
||||
* @param region GeneralRegion to copy settings to, or null if doing generic settings
|
||||
* @param permanent Region cannot be rented or bought, disables some features
|
||||
*/
|
||||
private void importRegionSettings(ConfigurationSection from, ConfigurationSection to, GeneralRegion region, boolean permanent) {
|
||||
// Maximum rental time, TODO check if this is actually the same
|
||||
if(from.isLong("permissions.max-rent-time")) {
|
||||
to.set("rent.maxRentTime", minutesToString(from.getLong("permissions.max-rent-time")));
|
||||
}
|
||||
|
||||
// Region rebuild
|
||||
if(from.getBoolean("region-rebuilding.auto-rebuild")) {
|
||||
to.set("general.enableRestore", true);
|
||||
}
|
||||
|
||||
// Get price settings
|
||||
String unit = from.getString("economic-settings.unit-type");
|
||||
String rentPrice = from.getString("economic-settings.cost-per-unit.rent");
|
||||
String buyPrice = from.getString("economic-settings.cost-per-unit.buy");
|
||||
String sellPrice = from.getString("economic-settings.cost-per-unit.selling-price");
|
||||
// TODO: There is no easy way to import this, setup eventCommandsProfile?
|
||||
String taxes = from.getString("economic-settings.cost-per-unit.taxes");
|
||||
|
||||
// Determine unit and add that to the price
|
||||
String unitSuffix = "";
|
||||
if("region".equalsIgnoreCase(unit)) {
|
||||
// add nothing
|
||||
} else if("m3".equalsIgnoreCase(unit)) {
|
||||
unitSuffix = "*%volume%";
|
||||
} else { // m2 or nothing (in case not set, we should actually look in parent files to correctly set this...)
|
||||
unitSuffix = "*(%volume%/%height%)"; // This is better than width*depth because of polygon regions
|
||||
}
|
||||
|
||||
// Apply settings
|
||||
if(rentPrice != null) {
|
||||
to.set("rent.price", rentPrice + unitSuffix);
|
||||
}
|
||||
if(buyPrice != null) {
|
||||
to.set("buy.price", buyPrice + unitSuffix);
|
||||
if(sellPrice != null) {
|
||||
try {
|
||||
double buyPriceAmount = Double.parseDouble(buyPrice);
|
||||
double sellPriceAmount = Double.parseDouble(sellPrice);
|
||||
to.set("buy.moneyBack", sellPriceAmount / buyPriceAmount * 100);
|
||||
} catch(NumberFormatException e) {
|
||||
// There is not always a region here for the message, should probably indicate something though
|
||||
message("import-moneyBackFailed", buyPrice, sellPrice);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply permanent region settings
|
||||
if(permanent) {
|
||||
to.set("buy.resellDisabled", true);
|
||||
to.set("buy.sellDisabled", true);
|
||||
to.set("general.countForLimits", false);
|
||||
}
|
||||
|
||||
// Set rented until
|
||||
if(from.isLong("info.last-withdrawal")
|
||||
&& region instanceof RentRegion) {
|
||||
RentRegion rentRegion = (RentRegion)region;
|
||||
long lastWithdrawal = from.getLong("info.last-withdrawal");
|
||||
// Because the rental duration is already imported into the region and its parents this should be correct
|
||||
rentRegion.setRentedUntil(lastWithdrawal + rentRegion.getDuration());
|
||||
}
|
||||
|
||||
// Import signs (list of strings like "297, 71, -22")
|
||||
if(from.isList("info.signs") && region != null) {
|
||||
for(String signLocation : from.getStringList("info.signs")) {
|
||||
String[] locationParts = signLocation.split(", ");
|
||||
if(locationParts.length != 3) {
|
||||
message("import-invalidSignLocation", region.getName(), signLocation);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Parse the location
|
||||
Location location;
|
||||
try {
|
||||
location = new Location(region.getWorld(), Double.parseDouble(locationParts[0]), Double.parseDouble(locationParts[1]), Double.parseDouble(locationParts[2]));
|
||||
} catch(NumberFormatException e) {
|
||||
message("import-invalidSignLocation", region.getName(), signLocation);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if this location is already added to a region
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(location);
|
||||
if(regionSign != null) {
|
||||
if(!regionSign.getRegion().equals(region)) {
|
||||
message("import-signAlreadyAdded", region.getName(), signLocation, regionSign.getRegion().getName());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// SignType and Facing will be written when the sign is updated later
|
||||
region.getSignsFeature().addSign(location, null, null, null);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TimeUnit {
|
||||
public long minutes;
|
||||
public String identifier;
|
||||
|
||||
TimeUnit(long minutes, String identifier) {
|
||||
this.minutes = minutes;
|
||||
this.identifier = identifier;
|
||||
}
|
||||
}
|
||||
|
||||
private static final List<TimeUnit> timeUnitLookup = new ArrayList<TimeUnit>() {
|
||||
{
|
||||
add(new TimeUnit(60 * 24 * 30 * 12, "year"));
|
||||
add(new TimeUnit(60 * 24 * 30, "month"));
|
||||
add(new TimeUnit(60 * 24, "day"));
|
||||
add(new TimeUnit(60, "hour"));
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert minutes to a human-readable string.
|
||||
* @param minutes Value to convert
|
||||
* @return String that represents the same length of time in a readable format, like "1 day", "5 minutes", "3 months"
|
||||
*/
|
||||
private String minutesToString(long minutes) {
|
||||
// If the specified number of minutes can map nicely to a higher unit, use that one
|
||||
String resultUnit = "minute";
|
||||
long resultValue = minutes;
|
||||
for(TimeUnit unit : timeUnitLookup) {
|
||||
long result = minutes / unit.minutes;
|
||||
if(resultValue * unit.minutes == minutes) {
|
||||
resultUnit = unit.identifier;
|
||||
resultValue = result;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return resultValue + " " + resultUnit + (resultValue == 1 ? "" : "s");
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a target without a prefix.
|
||||
* @param key The key of the language string
|
||||
* @param replacements The replacements to insert in the message
|
||||
*/
|
||||
public void messageNoPrefix(String key, Object... replacements) {
|
||||
plugin.messageNoPrefix(sender, key, replacements);
|
||||
|
||||
if(!(sender instanceof ConsoleCommandSender)) {
|
||||
plugin.messageNoPrefix(Bukkit.getConsoleSender(), key, replacements);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a message to a target, prefixed by the default chat prefix.
|
||||
* @param key The key of the language string
|
||||
* @param replacements The replacements to insert in the message
|
||||
*/
|
||||
public void message(String key, Object... replacements) {
|
||||
plugin.message(sender, key, replacements);
|
||||
|
||||
if(!(sender instanceof ConsoleCommandSender)) {
|
||||
plugin.message(Bukkit.getConsoleSender(), key, replacements);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,484 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
// TODO fix '/as info' help message hitting replacement limit (improve depth tracking?)
|
||||
// TODO add info about autoExtend
|
||||
public class InfoCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop info";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.info")) {
|
||||
return "help-info";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display a page of a list of regions.
|
||||
* @param sender The CommandSender to send the messages to
|
||||
* @param regions The regions to display
|
||||
* @param filterGroup The group to filter the regions by
|
||||
* @param keyHeader The header to print above the page
|
||||
* @param pageInput The page number, if any
|
||||
* @param baseCommand The command to execute for next/previous page (/areashop will be added)
|
||||
*/
|
||||
private void showSortedPagedList(CommandSender sender, List<? extends GeneralRegion> regions, RegionGroup filterGroup, String keyHeader, String pageInput, String baseCommand) {
|
||||
int maximumItems = 20;
|
||||
int itemsPerPage = maximumItems - 2;
|
||||
int page = 1;
|
||||
if(pageInput != null && Utils.isNumeric(pageInput)) {
|
||||
try {
|
||||
page = Integer.parseInt(pageInput);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "info-wrongPage", pageInput);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(filterGroup != null) {
|
||||
regions.removeIf(generalRegion -> !filterGroup.isMember(generalRegion));
|
||||
}
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "info-noRegions");
|
||||
} else {
|
||||
// First sort by type, then by name
|
||||
regions.sort((one, two) -> {
|
||||
int typeCompare = getTypeOrder(two).compareTo(getTypeOrder(one));
|
||||
if(typeCompare != 0) {
|
||||
return typeCompare;
|
||||
} else {
|
||||
return one.getName().compareTo(two.getName());
|
||||
}
|
||||
});
|
||||
// Header
|
||||
Message limitedToGroup = Message.empty();
|
||||
if(filterGroup != null) {
|
||||
limitedToGroup = Message.fromKey("info-limitedToGroup").replacements(filterGroup.getName());
|
||||
}
|
||||
plugin.message(sender, keyHeader, limitedToGroup);
|
||||
// Page entries
|
||||
int totalPages = (int)Math.ceil(regions.size() / (double)itemsPerPage); // Clip page to correct boundaries, not much need to tell the user
|
||||
if(regions.size() == itemsPerPage + 1) { // 19 total items is mapped to 1 page of 19
|
||||
itemsPerPage++;
|
||||
totalPages = 1;
|
||||
}
|
||||
page = Math.max(1, Math.min(totalPages, page));
|
||||
int linesPrinted = 1; // header
|
||||
for(int i = (page - 1) * itemsPerPage; i < page * itemsPerPage && i < regions.size(); i++) {
|
||||
String state;
|
||||
GeneralRegion region = regions.get(i);
|
||||
if(region.getType() == GeneralRegion.RegionType.RENT) {
|
||||
if(region.getOwner() == null) {
|
||||
state = "Forrent";
|
||||
} else {
|
||||
state = "Rented";
|
||||
}
|
||||
} else {
|
||||
if(region.getOwner() == null) {
|
||||
state = "Forsale";
|
||||
} else if(!((BuyRegion)region).isInResellingMode()) {
|
||||
state = "Sold";
|
||||
} else {
|
||||
state = "Reselling";
|
||||
}
|
||||
}
|
||||
plugin.messageNoPrefix(sender, "info-entry" + state, region);
|
||||
linesPrinted++;
|
||||
}
|
||||
Message footer = Message.empty();
|
||||
// Previous button
|
||||
if(page > 1) {
|
||||
footer.append(Message.fromKey("info-pagePrevious").replacements(baseCommand + " " + (page - 1)));
|
||||
} else {
|
||||
footer.append(Message.fromKey("info-pageNoPrevious"));
|
||||
}
|
||||
// Page status
|
||||
if(totalPages > 1) {
|
||||
String pageString = "" + page;
|
||||
for(int i = pageString.length(); i < (totalPages + "").length(); i++) {
|
||||
pageString = "0" + pageString;
|
||||
}
|
||||
footer.append(Message.fromKey("info-pageStatus").replacements(page, totalPages));
|
||||
if(page < totalPages) {
|
||||
footer.append(Message.fromKey("info-pageNext").replacements(baseCommand + " " + (page + 1)));
|
||||
} else {
|
||||
footer.append(Message.fromKey("info-pageNoNext"));
|
||||
}
|
||||
// Fill up space if the page is not full (aligns header nicely)
|
||||
for(int i = linesPrinted; i < maximumItems - 1; i++) {
|
||||
sender.sendMessage(" ");
|
||||
}
|
||||
footer.send(sender);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an integer to order by type, usable for Comparators.
|
||||
* @param region The region to get the order for
|
||||
* @return An integer for sorting by type
|
||||
*/
|
||||
private Integer getTypeOrder(GeneralRegion region) {
|
||||
if(region.getType() == GeneralRegion.RegionType.RENT) {
|
||||
if(region.getOwner() == null) {
|
||||
return 1;
|
||||
} else {
|
||||
return 2;
|
||||
}
|
||||
} else {
|
||||
if(region.getOwner() == null) {
|
||||
return 3;
|
||||
} else if(!((BuyRegion)region).isInResellingMode()) {
|
||||
return 4;
|
||||
} else {
|
||||
return 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.info")) {
|
||||
plugin.message(sender, "info-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length > 1 && args[1] != null) {
|
||||
// Get filter group (only used by some commands)
|
||||
RegionGroup filterGroup = null;
|
||||
Set<String> groupFilters = new HashSet<>(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "reselling"));
|
||||
if(groupFilters.contains(args[1].toLowerCase()) && args.length > 2) {
|
||||
if(!Utils.isNumeric(args[2])) {
|
||||
filterGroup = plugin.getFileManager().getGroup(args[2]);
|
||||
if(filterGroup == null) {
|
||||
plugin.message(sender, "info-noFiltergroup", args[2]);
|
||||
return;
|
||||
}
|
||||
// Pass page number to args[2] if available
|
||||
if(args.length > 3) {
|
||||
args[2] = args[3];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// All regions
|
||||
if(args[1].equalsIgnoreCase("all")) {
|
||||
showSortedPagedList(sender, plugin.getFileManager().getRegions(), filterGroup, "info-allHeader", (args.length > 2 ? args[2] : null), "info all");
|
||||
}
|
||||
|
||||
// Rented regions
|
||||
else if(args[1].equalsIgnoreCase("rented")) {
|
||||
List<RentRegion> regions = plugin.getFileManager().getRents();
|
||||
regions.removeIf(RentRegion::isAvailable);
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-rentedHeader", (args.length > 2 ? args[2] : null), "info rented");
|
||||
}
|
||||
// Forrent regions
|
||||
else if(args[1].equalsIgnoreCase("forrent")) {
|
||||
List<RentRegion> regions = plugin.getFileManager().getRents();
|
||||
regions.removeIf(RentRegion::isRented);
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-forrentHeader", (args.length > 2 ? args[2] : null), "info forrent");
|
||||
}
|
||||
// Sold regions
|
||||
else if(args[1].equalsIgnoreCase("sold")) {
|
||||
List<BuyRegion> regions = plugin.getFileManager().getBuys();
|
||||
regions.removeIf(BuyRegion::isAvailable);
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-soldHeader", (args.length > 2 ? args[2] : null), "info sold");
|
||||
}
|
||||
// Forsale regions
|
||||
else if(args[1].equalsIgnoreCase("forsale")) {
|
||||
List<BuyRegion> regions = plugin.getFileManager().getBuys();
|
||||
regions.removeIf(BuyRegion::isSold);
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-forsaleHeader", (args.length > 2 ? args[2] : null), "info forsale");
|
||||
}
|
||||
// Reselling regions
|
||||
else if(args[1].equalsIgnoreCase("reselling")) {
|
||||
List<BuyRegion> regions = plugin.getFileManager().getBuys();
|
||||
regions.removeIf(region -> !region.isInResellingMode());
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-resellingHeader", (args.length > 2 ? args[2] : null), "info reselling");
|
||||
}
|
||||
|
||||
// List of regions without a group
|
||||
else if(args[1].equalsIgnoreCase("nogroup")) {
|
||||
List<GeneralRegion> regions = plugin.getFileManager().getRegions();
|
||||
for(RegionGroup group : plugin.getFileManager().getGroups()) {
|
||||
regions.removeAll(group.getMemberRegions());
|
||||
}
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "info-nogroupNone");
|
||||
} else {
|
||||
showSortedPagedList(sender, regions, filterGroup, "info-nogroupHeader", (args.length > 2 ? args[2] : null), "info nogroup");
|
||||
}
|
||||
}
|
||||
|
||||
// Region info
|
||||
else if(args[1].equalsIgnoreCase("region")) {
|
||||
if(args.length > 1) {
|
||||
RentRegion rent = null;
|
||||
BuyRegion buy = null;
|
||||
if(args.length > 2) {
|
||||
rent = plugin.getFileManager().getRent(args[2]);
|
||||
buy = plugin.getFileManager().getBuy(args[2]);
|
||||
} else {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
if(regions.get(0) instanceof RentRegion) {
|
||||
rent = (RentRegion)regions.get(0);
|
||||
} else if(regions.get(0) instanceof BuyRegion) {
|
||||
buy = (BuyRegion)regions.get(0);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(rent == null && buy == null) {
|
||||
plugin.message(sender, "info-regionNotExisting", args[2]);
|
||||
return;
|
||||
}
|
||||
|
||||
if(rent != null) {
|
||||
plugin.message(sender, "info-regionHeaderRent", rent);
|
||||
if(rent.isRented()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRented", rent);
|
||||
plugin.messageNoPrefix(sender, "info-regionExtending", rent);
|
||||
// Money back
|
||||
if(UnrentCommand.canUse(sender, rent)) {
|
||||
plugin.messageNoPrefix(sender, "info-regionMoneyBackRentClick", rent);
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionMoneyBackRent", rent);
|
||||
}
|
||||
// Friends
|
||||
if(!rent.getFriendsFeature().getFriendNames().isEmpty()) {
|
||||
String messagePart = "info-friend";
|
||||
if(DelfriendCommand.canUse(sender, rent)) {
|
||||
messagePart = "info-friendRemove";
|
||||
}
|
||||
plugin.messageNoPrefix(sender, "info-regionFriends", rent, Utils.combinedMessage(rent.getFriendsFeature().getFriendNames(), messagePart));
|
||||
}
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionCanBeRented", rent);
|
||||
}
|
||||
if(rent.getLandlordName() != null) {
|
||||
plugin.messageNoPrefix(sender, "info-regionLandlord", rent);
|
||||
}
|
||||
// Maximum extends
|
||||
if(rent.getMaxExtends() != -1) {
|
||||
if(rent.getMaxExtends() == 0) {
|
||||
plugin.messageNoPrefix(sender, "info-regionNoExtending", rent);
|
||||
} else if(rent.isRented()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionExtendsLeft", rent);
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionMaxExtends", rent);
|
||||
}
|
||||
}
|
||||
// If maxExtends is zero it does not make sense to show this message
|
||||
if(rent.getMaxRentTime() != -1 && rent.getMaxExtends() != 0) {
|
||||
plugin.messageNoPrefix(sender, "info-regionMaxRentTime", rent);
|
||||
}
|
||||
if(rent.getInactiveTimeUntilUnrent() != -1) {
|
||||
plugin.messageNoPrefix(sender, "info-regionInactiveUnrent", rent);
|
||||
}
|
||||
// Teleport
|
||||
Message tp = Message.fromKey("info-prefix");
|
||||
boolean foundSomething = false;
|
||||
if(TeleportCommand.canUse(sender, rent)) {
|
||||
foundSomething = true;
|
||||
tp.append(Message.fromKey("info-regionTeleport").replacements(rent));
|
||||
}
|
||||
if(SetteleportCommand.canUse(sender, rent)) {
|
||||
if(foundSomething) {
|
||||
tp.append(", ");
|
||||
}
|
||||
foundSomething = true;
|
||||
tp.append(Message.fromKey("info-setRegionTeleport").replacements(rent));
|
||||
}
|
||||
if(foundSomething) {
|
||||
tp.append(".");
|
||||
tp.send(sender);
|
||||
}
|
||||
// Signs
|
||||
List<String> signLocations = new ArrayList<>();
|
||||
for(Location location : rent.getSignsFeature().getSignLocations()) {
|
||||
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
|
||||
}
|
||||
if(!signLocations.isEmpty()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
|
||||
}
|
||||
// Groups
|
||||
if(sender.hasPermission("areashop.groupinfo") && !rent.getGroupNames().isEmpty()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(rent.getGroupNames()));
|
||||
}
|
||||
// Restoring
|
||||
if(rent.isRestoreEnabled()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestoringRent", rent);
|
||||
}
|
||||
// Restrictions
|
||||
if(!rent.isRented()) {
|
||||
if(rent.restrictedToRegion()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionRent", rent);
|
||||
} else if(rent.restrictedToWorld()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldRent", rent);
|
||||
}
|
||||
}
|
||||
plugin.messageNoPrefix(sender, "info-regionFooterRent", rent);
|
||||
} else if(buy != null) {
|
||||
plugin.message(sender, "info-regionHeaderBuy", buy);
|
||||
if(buy.isSold()) {
|
||||
if(buy.isInResellingMode()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionReselling", buy);
|
||||
plugin.messageNoPrefix(sender, "info-regionReselPrice", buy);
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionBought", buy);
|
||||
}
|
||||
// Money back
|
||||
if(!buy.getBooleanSetting("buy.sellDisabled")) {
|
||||
if (SellCommand.canUse(sender, buy)) {
|
||||
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuyClick", buy);
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionMoneyBackBuy", buy);
|
||||
}
|
||||
}
|
||||
// Friends
|
||||
if(!buy.getFriendsFeature().getFriendNames().isEmpty()) {
|
||||
String messagePart = "info-friend";
|
||||
if(DelfriendCommand.canUse(sender, buy)) {
|
||||
messagePart = "info-friendRemove";
|
||||
}
|
||||
plugin.messageNoPrefix(sender, "info-regionFriends", buy, Utils.combinedMessage(buy.getFriendsFeature().getFriendNames(), messagePart));
|
||||
}
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "info-regionCanBeBought", buy);
|
||||
}
|
||||
if(buy.getLandlord() != null) {
|
||||
plugin.messageNoPrefix(sender, "info-regionLandlord", buy);
|
||||
}
|
||||
if(buy.getInactiveTimeUntilSell() != -1) {
|
||||
plugin.messageNoPrefix(sender, "info-regionInactiveSell", buy);
|
||||
}
|
||||
// Teleport
|
||||
Message tp = Message.fromKey("info-prefix");
|
||||
boolean foundSomething = false;
|
||||
if(TeleportCommand.canUse(sender, buy)) {
|
||||
foundSomething = true;
|
||||
tp.append(Message.fromKey("info-regionTeleport").replacements(buy));
|
||||
}
|
||||
if(SetteleportCommand.canUse(sender, buy)) {
|
||||
if(foundSomething) {
|
||||
tp.append(", ");
|
||||
}
|
||||
foundSomething = true;
|
||||
tp.append(Message.fromKey("info-setRegionTeleport").replacements(buy));
|
||||
}
|
||||
if(foundSomething) {
|
||||
tp.append(".");
|
||||
tp.send(sender);
|
||||
}
|
||||
// Signs
|
||||
List<String> signLocations = new ArrayList<>();
|
||||
for(Location location : buy.getSignsFeature().getSignLocations()) {
|
||||
signLocations.add(Message.fromKey("info-regionSignLocation").replacements(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ()).getPlain());
|
||||
}
|
||||
if(!signLocations.isEmpty()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionSigns", Utils.createCommaSeparatedList(signLocations));
|
||||
}
|
||||
// Groups
|
||||
if(sender.hasPermission("areashop.groupinfo") && !buy.getGroupNames().isEmpty()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionGroups", Utils.createCommaSeparatedList(buy.getGroupNames()));
|
||||
}
|
||||
// Restoring
|
||||
if(buy.isRestoreEnabled()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestoringBuy", buy);
|
||||
}
|
||||
// Restrictions
|
||||
if(!buy.isSold()) {
|
||||
if(buy.restrictedToRegion()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestrictedRegionBuy", buy);
|
||||
} else if(buy.restrictedToWorld()) {
|
||||
plugin.messageNoPrefix(sender, "info-regionRestrictedWorldBuy", buy);
|
||||
}
|
||||
}
|
||||
plugin.messageNoPrefix(sender, "info-regionFooterBuy", buy);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "info-regionHelp");
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "info-help");
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "info-help");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(Arrays.asList("all", "rented", "forrent", "sold", "forsale", "player", "region", "nogroup", "reselling"));
|
||||
} else if(toComplete == 3) {
|
||||
if(start[2].equalsIgnoreCase("player")) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(start[2].equalsIgnoreCase("region")) {
|
||||
result.addAll(plugin.getFileManager().getBuyNames());
|
||||
result.addAll(plugin.getFileManager().getRentNames());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class LinksignsCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop linksigns";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.linksigns")) {
|
||||
return "help-linksigns";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.linksigns")) {
|
||||
plugin.message(sender, "linksigns-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player)sender;
|
||||
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
|
||||
plugin.getSignlinkerManager().exitSignLinkMode(player);
|
||||
} else {
|
||||
// Get the profile
|
||||
String profile = null;
|
||||
if(args.length > 1) {
|
||||
profile = args[1];
|
||||
ConfigurationSection signProfilesSection = plugin.getConfig().getConfigurationSection("signProfiles");
|
||||
if(signProfilesSection != null) {
|
||||
Set<String> profiles = signProfilesSection.getKeys(false);
|
||||
if(!profiles.contains(profile)) {
|
||||
ArrayList<String> message = new ArrayList<>();
|
||||
for(String p : profiles) {
|
||||
if(!message.isEmpty()) {
|
||||
message.add(", ");
|
||||
}
|
||||
message.addAll(Message.fromKey("addsign-profile").replacements(p).get());
|
||||
}
|
||||
plugin.message(sender, "addsign-wrongProfile", Message.fromList(message));
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
plugin.getSignlinkerManager().enterSignLinkMode(player, profile);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getConfig().getStringList("signProfiles"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,143 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class MeCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop me";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.me")) {
|
||||
return "help-me";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.me")) {
|
||||
plugin.message(sender, "me-noPermission");
|
||||
return;
|
||||
}
|
||||
OfflinePlayer player = null;
|
||||
if(!(sender instanceof Player)) {
|
||||
if(args.length <= 1) {
|
||||
plugin.message(sender, "me-notAPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
player = (OfflinePlayer)sender;
|
||||
}
|
||||
if(args.length > 1) {
|
||||
player = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(player == null) {
|
||||
plugin.message(sender, "me-noPlayer", args[1]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(player == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the regions owned by the player
|
||||
Set<RentRegion> rentRegions = new HashSet<>();
|
||||
for(RentRegion region : plugin.getFileManager().getRents()) {
|
||||
if(region.isOwner(player)) {
|
||||
rentRegions.add(region);
|
||||
}
|
||||
}
|
||||
Set<BuyRegion> buyRegions = new HashSet<>();
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isOwner(player)) {
|
||||
buyRegions.add(region);
|
||||
}
|
||||
}
|
||||
// Get the regions the player is added as friend
|
||||
Set<GeneralRegion> friendRegions = new HashSet<>();
|
||||
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
|
||||
if(region.getFriendsFeature().getFriends().contains(player.getUniqueId())) {
|
||||
friendRegions.add(region);
|
||||
}
|
||||
}
|
||||
|
||||
// Send messages
|
||||
boolean foundSome = !rentRegions.isEmpty() || !buyRegions.isEmpty() || !friendRegions.isEmpty();
|
||||
if(foundSome) {
|
||||
plugin.message(sender, "me-header", player.getName());
|
||||
}
|
||||
if(!rentRegions.isEmpty()) {
|
||||
for(RentRegion region : rentRegions) {
|
||||
plugin.messageNoPrefix(sender, "me-rentLine", region);
|
||||
}
|
||||
}
|
||||
if(!buyRegions.isEmpty()) {
|
||||
for(BuyRegion region : buyRegions) {
|
||||
plugin.messageNoPrefix(sender, "me-buyLine", region);
|
||||
}
|
||||
}
|
||||
if(!friendRegions.isEmpty()) {
|
||||
for(GeneralRegion region : friendRegions) {
|
||||
plugin.messageNoPrefix(sender, "me-friendLine", region);
|
||||
}
|
||||
}
|
||||
|
||||
if(!foundSome) {
|
||||
plugin.message(sender, "me-nothing", player.getName());
|
||||
} else {
|
||||
plugin.messageNoPrefix(sender, "me-clickHint");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MessageCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop message";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.message")) {
|
||||
return null; // Internal command, no need to show in the help list
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(final CommandSender sender, final String[] args) {
|
||||
if(!sender.hasPermission("areashop.message")) {
|
||||
plugin.message(sender, "message-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 3) {
|
||||
plugin.message(sender, "message-help");
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = Bukkit.getPlayer(args[1]);
|
||||
if(player == null) {
|
||||
plugin.message(sender, "message-notOnline", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
String[] messageArgs = new String[args.length - 2];
|
||||
System.arraycopy(args, 2, messageArgs, 0, args.length - 2);
|
||||
String message = StringUtils.join(messageArgs, " ");
|
||||
|
||||
Message.fromString(message).send(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
# Commands
|
||||
|
||||
This module contains all AreaShop commands.
|
||||
|
||||
* `CommandAreaShop` is extended by all other classes, and implements some general functionality and defines which methods should be implemented.
|
||||
* Other classes implement specific sub-commands, supply their help messages and tab completion.
|
||||
* `CommandManager` class in the `managers` package handles incoming commands and dispatches them to the classes in this package.
|
||||
@@ -0,0 +1,29 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class ReloadCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop reload";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.reload")) {
|
||||
return "help-reload";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(sender.hasPermission("areashop.reload")) {
|
||||
// Reload the configuration files and update all region flags/signs
|
||||
plugin.reload(sender);
|
||||
} else {
|
||||
plugin.message(sender, "reload-noPermission");
|
||||
}
|
||||
}
|
||||
}
|
||||
+69
-77
@@ -1,77 +1,69 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.RentRegion;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class RentCommand extends CommandAreaShop {
|
||||
|
||||
public RentCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop rent";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.rent")) {
|
||||
return plugin.getLanguageManager().getLang("help-rent");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.rent")) {
|
||||
plugin.message(sender, "rent-noPermission");
|
||||
return;
|
||||
}
|
||||
if (!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
if(args.length > 1 && args[1] != null) {
|
||||
RentRegion rent = plugin.getFileManager().getRent(args[1]);
|
||||
if(rent == null) {
|
||||
plugin.message(sender, "rent-notRentable");
|
||||
} else {
|
||||
rent.rent(player);
|
||||
}
|
||||
} else {
|
||||
// get the region by location
|
||||
List<RentRegion> regions = plugin.getFileManager().getApplicableRentRegions(((Player) sender).getLocation());
|
||||
if (regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if (regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
regions.get(0).rent(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
for(RentRegion region : plugin.getFileManager().getRents()) {
|
||||
if(!region.isRented()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RentCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop rent";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.rent")) {
|
||||
return "help-rent";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.rent")) {
|
||||
plugin.message(sender, "rent-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
if(args.length > 1 && args[1] != null) {
|
||||
RentRegion rent = plugin.getFileManager().getRent(args[1]);
|
||||
if(rent == null) {
|
||||
plugin.message(sender, "rent-notRentable", args[1]);
|
||||
} else {
|
||||
rent.rent(player);
|
||||
}
|
||||
} else {
|
||||
// get the region by location
|
||||
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
} else {
|
||||
regions.get(0).rent(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(RentRegion region : plugin.getFileManager().getRents()) {
|
||||
if(!region.isRented()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
+134
-134
@@ -1,134 +1,134 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.BuyRegion;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ResellCommand extends CommandAreaShop {
|
||||
|
||||
public ResellCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop resell";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.resellall")) {
|
||||
return plugin.getLanguageManager().getLang("help-resellAll");
|
||||
} else if(target.hasPermission("areashop.resell")) {
|
||||
return plugin.getLanguageManager().getLang("help-resell");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.resell") && !sender.hasPermission("areashop.resellall")) {
|
||||
plugin.message(sender, "resell-noPermissionOther");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length <= 1) {
|
||||
plugin.message(sender, "resell-help");
|
||||
return;
|
||||
}
|
||||
double price = 0.0;
|
||||
try {
|
||||
price = Double.parseDouble(args[1]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "resell-wrongPrice", args[1]);
|
||||
return;
|
||||
}
|
||||
BuyRegion buy = null;
|
||||
if(args.length <= 2) {
|
||||
if (sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
|
||||
if (regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if (regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
buy = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
buy = plugin.getFileManager().getBuy(args[2]);
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "resell-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "resell-noRegionFound");
|
||||
return;
|
||||
}
|
||||
if(!buy.isSold()) {
|
||||
plugin.message(sender, "resell-notBought", buy);
|
||||
return;
|
||||
}
|
||||
if(sender.hasPermission("areashop.resellall")) {
|
||||
buy.enableReselling(price);
|
||||
buy.saveRequired();
|
||||
plugin.message(sender, "resell-success", buy);
|
||||
buy.updateSigns();
|
||||
buy.updateRegionFlags();
|
||||
} else if(sender.hasPermission("areashop.resell") && sender instanceof Player) {
|
||||
if(buy.isOwner((Player)sender)) {
|
||||
buy.enableReselling(price);
|
||||
buy.saveRequired();
|
||||
plugin.message(sender, "resell-success", buy);
|
||||
buy.updateSigns();
|
||||
buy.updateRegionFlags();
|
||||
} else {
|
||||
plugin.message(sender, "resell-noPermissionOther");
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "resell-noPermission");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 3) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isSold() && !region.isInResellingMode()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ResellCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop resell";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.resellall") || target.hasPermission("areashop.resell")) {
|
||||
return "help-resell";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.resell") && !sender.hasPermission("areashop.resellall")) {
|
||||
plugin.message(sender, "resell-noPermissionOther");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length <= 1) {
|
||||
plugin.message(sender, "resell-help");
|
||||
return;
|
||||
}
|
||||
double price;
|
||||
try {
|
||||
price = Double.parseDouble(args[1]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "resell-wrongPrice", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
if(price < 0) {
|
||||
plugin.message(sender, "resell-wrongPrice", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
BuyRegion buy;
|
||||
if(args.length <= 2) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
buy = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
buy = plugin.getFileManager().getBuy(args[2]);
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "resell-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
}
|
||||
if(!buy.isSold()) {
|
||||
plugin.message(sender, "resell-notBought", buy);
|
||||
return;
|
||||
}
|
||||
if(sender.hasPermission("areashop.resellall")) {
|
||||
buy.enableReselling(price);
|
||||
buy.update();
|
||||
plugin.message(sender, "resell-success", buy);
|
||||
} else if(sender.hasPermission("areashop.resell") && sender instanceof Player) {
|
||||
if(!buy.isOwner((Player)sender)) {
|
||||
plugin.message(sender, "resell-noPermissionOther", buy);
|
||||
return;
|
||||
}
|
||||
|
||||
if(buy.getBooleanSetting("buy.resellDisabled")) {
|
||||
plugin.message(sender, "resell-disabled", buy);
|
||||
return;
|
||||
}
|
||||
|
||||
buy.enableReselling(price);
|
||||
buy.update();
|
||||
plugin.message(sender, "resell-success", buy);
|
||||
} else {
|
||||
plugin.message(sender, "resell-noPermission", buy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 3) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isSold() && !region.isInResellingMode()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+86
-88
@@ -1,88 +1,86 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.Utils;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion.RegionEvent;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class SchematiceventCommand extends CommandAreaShop {
|
||||
|
||||
public SchematiceventCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop schemevent";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.schematicevents")) {
|
||||
return plugin.getLanguageManager().getLang("help-schemevent");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.schematicevents")) {
|
||||
plugin.message(sender, "schemevent-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 3 || args[1] == null || args[2] == null) {
|
||||
plugin.message(sender, "schemevent-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "schemevent-noRegion", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
RegionEvent event = null;
|
||||
boolean exception = false;
|
||||
try {
|
||||
event = RegionEvent.valueOf(args[2].toUpperCase());
|
||||
} catch(IllegalArgumentException e) {
|
||||
exception = true;
|
||||
}
|
||||
// Check for a totally wrong event or a non matching event
|
||||
if(exception) {
|
||||
ArrayList<String> values = new ArrayList<String>();
|
||||
for(RegionEvent value : RegionEvent.values()) {
|
||||
values.add(value.getValue().toLowerCase());
|
||||
}
|
||||
plugin.message(sender, "schemevent-wrongEvent", args[2], Utils.createCommaSeparatedList(values));
|
||||
return;
|
||||
}
|
||||
region.handleSchematicEvent(event);
|
||||
plugin.message(sender, "schemevent-success", args[2], region.getName());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(start[2]);
|
||||
if(region != null) {
|
||||
if(region.isRentRegion()) {
|
||||
result.addAll(Arrays.asList("created", "deleted", "rented", "unrented"));
|
||||
} else if(region.isBuyRegion()) {
|
||||
result.addAll(Arrays.asList("created", "deleted", "bought", "sold"));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
public class SchematiceventCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop schemevent";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.schematicevents")) {
|
||||
return "help-schemevent";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.schematicevents")) {
|
||||
plugin.message(sender, "schemevent-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
if(args.length < 3 || args[1] == null || args[2] == null) {
|
||||
plugin.message(sender, "schemevent-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
if(region.getRegion() == null) {
|
||||
plugin.message(sender, "general-noRegion", region);
|
||||
return;
|
||||
}
|
||||
GeneralRegion.RegionEvent event = null;
|
||||
boolean exception = false;
|
||||
try {
|
||||
event = GeneralRegion.RegionEvent.valueOf(args[2].toUpperCase());
|
||||
} catch(IllegalArgumentException e) {
|
||||
exception = true;
|
||||
}
|
||||
// Check for a totally wrong event or a non matching event
|
||||
if(exception) {
|
||||
ArrayList<String> values = new ArrayList<>();
|
||||
for(GeneralRegion.RegionEvent value : GeneralRegion.RegionEvent.values()) {
|
||||
values.add(value.getValue().toLowerCase());
|
||||
}
|
||||
plugin.message(sender, "schemevent-wrongEvent", args[2], Utils.createCommaSeparatedList(values), region);
|
||||
return;
|
||||
}
|
||||
region.handleSchematicEvent(event);
|
||||
region.update();
|
||||
plugin.message(sender, "schemevent-success", args[2], region);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(start[2]);
|
||||
if(region != null) {
|
||||
if(region instanceof RentRegion) {
|
||||
result.addAll(Arrays.asList("created", "deleted", "rented", "unrented"));
|
||||
} else if(region instanceof BuyRegion) {
|
||||
result.addAll(Arrays.asList("created", "deleted", "bought", "sold"));
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SellCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop sell";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.sell") || target.hasPermission("areashop.sellown")) {
|
||||
return "help-sell";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a person can sell the region.
|
||||
* @param person The person to check
|
||||
* @param region The region to check for
|
||||
* @return true if the person can sell it, otherwise false
|
||||
*/
|
||||
public static boolean canUse(CommandSender person, GeneralRegion region) {
|
||||
if(person.hasPermission("areashop.sell")) {
|
||||
return true;
|
||||
}
|
||||
if(person instanceof Player) {
|
||||
Player player = (Player)person;
|
||||
return region.isOwner(player) && person.hasPermission("areashop.sellown");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.sell") && !sender.hasPermission("areashop.sellown")) {
|
||||
plugin.message(sender, "sell-noPermission");
|
||||
return;
|
||||
}
|
||||
BuyRegion buy;
|
||||
if(args.length <= 1) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
buy = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
buy = plugin.getFileManager().getBuy(args[1]);
|
||||
}
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "sell-notRegistered");
|
||||
return;
|
||||
}
|
||||
if(!buy.isSold()) {
|
||||
plugin.message(sender, "sell-notBought", buy);
|
||||
return;
|
||||
}
|
||||
buy.sell(true, sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isSold()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SetdurationCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setduration";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setduration")) {
|
||||
return "help-setduration";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setduration") && (!sender.hasPermission("areashop.setduration.landlord") && sender instanceof Player)) {
|
||||
plugin.message(sender, "setduration-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 3 || args[1] == null || args[2] == null) {
|
||||
plugin.message(sender, "setduration-help");
|
||||
return;
|
||||
}
|
||||
int regionArgument = 3;
|
||||
if(args.length >= 2 && ("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1]))) {
|
||||
regionArgument = 2;
|
||||
}
|
||||
RentRegion rent;
|
||||
if(args.length <= regionArgument) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
rent = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
rent = plugin.getFileManager().getRent(args[regionArgument]);
|
||||
}
|
||||
if(rent == null) {
|
||||
plugin.message(sender, "setduration-notRegistered", args[regionArgument]);
|
||||
return;
|
||||
}
|
||||
if(!sender.hasPermission("areashop.setduration") && !(sender instanceof Player && rent.isLandlord(((Player)sender).getUniqueId()))) {
|
||||
plugin.message(sender, "setduration-noLandlord", rent);
|
||||
return;
|
||||
}
|
||||
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
|
||||
rent.setDuration(null);
|
||||
rent.update();
|
||||
plugin.message(sender, "setduration-successRemoved", rent);
|
||||
return;
|
||||
}
|
||||
try {
|
||||
Integer.parseInt(args[1]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "setduration-wrongAmount", args[1], rent);
|
||||
return;
|
||||
}
|
||||
if(!Utils.checkTimeFormat(args[1] + " " + args[2])) {
|
||||
plugin.message(sender, "setduration-wrongFormat", args[1] + " " + args[2], rent);
|
||||
return;
|
||||
}
|
||||
rent.setDuration(args[1] + " " + args[2]);
|
||||
rent.update();
|
||||
plugin.message(sender, "setduration-success", rent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getRentNames();
|
||||
} else if(toComplete == 4) {
|
||||
result.addAll(plugin.getConfig().getStringList("minutes"));
|
||||
result.addAll(plugin.getConfig().getStringList("hours"));
|
||||
result.addAll(plugin.getConfig().getStringList("days"));
|
||||
result.addAll(plugin.getConfig().getStringList("months"));
|
||||
result.addAll(plugin.getConfig().getStringList("years"));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SetlandlordCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setlandlord";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setlandlord")) {
|
||||
return "help-setlandlord";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setlandlord")) {
|
||||
plugin.message(sender, "setlandlord-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "setlandlord-help");
|
||||
return;
|
||||
}
|
||||
@SuppressWarnings("deprecation")
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
|
||||
GeneralRegion region;
|
||||
if(args.length < 3) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
}
|
||||
if(region == null) {
|
||||
plugin.message(sender, "cmd-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
String playerName = player.getName();
|
||||
if(playerName == null || playerName.isEmpty()) {
|
||||
playerName = args[1];
|
||||
}
|
||||
region.setLandlord(player.getUniqueId(), playerName);
|
||||
region.update();
|
||||
plugin.message(sender, "setlandlord-success", playerName, region);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+134
-147
@@ -1,147 +1,134 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.BuyRegion;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
import nl.evolutioncoding.areashop.regions.RentRegion;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class SetownerCommand extends CommandAreaShop {
|
||||
|
||||
public SetownerCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setowner";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setownerrent") || target.hasPermission("areashop.setownerbuy")) {
|
||||
return plugin.getLanguageManager().getLang("help-setowner");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setownerrent") && !sender.hasPermission("areashop.setownerbuy")) {
|
||||
plugin.message(sender, "setowner-noPermission");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region;
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "setowner-help");
|
||||
return;
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if (sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = plugin.getFileManager().getAllApplicableRegions(((Player) sender).getLocation());
|
||||
if (regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if (regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
}
|
||||
if(region == null) {
|
||||
plugin.message(sender, "setowner-notRegistered");
|
||||
return;
|
||||
}
|
||||
|
||||
if(region.isRentRegion() && !sender.hasPermission("areashop.setownerrent")) {
|
||||
plugin.message(sender, "setowner-noPermissionRent");
|
||||
return;
|
||||
}
|
||||
if(region.isBuyRegion() && !sender.hasPermission("areashop.setownerbuy")) {
|
||||
plugin.message(sender, "setowner-noPermissionBuy");
|
||||
return;
|
||||
}
|
||||
|
||||
UUID uuid = null;
|
||||
@SuppressWarnings("deprecation")
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(player != null) {
|
||||
uuid = player.getUniqueId();
|
||||
}
|
||||
if(uuid == null) {
|
||||
plugin.message(sender, "setowner-noPlayer", args[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
if(region.isRentRegion()) {
|
||||
RentRegion rent = (RentRegion)region;
|
||||
if(rent.isRenter(uuid)) {
|
||||
// extend
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTimeInMillis(rent.getRentedUntil() + rent.getDuration());
|
||||
rent.setRentedUntil(calendar.getTimeInMillis());
|
||||
rent.setRenter(uuid);
|
||||
plugin.message(sender, "setowner-succesRentExtend", region);
|
||||
} else {
|
||||
// change
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
long current = calendar.getTimeInMillis();
|
||||
if(rent.isRented()) {
|
||||
current = rent.getRentedUntil();
|
||||
}
|
||||
calendar.setTimeInMillis(current + rent.getDuration());
|
||||
rent.setRentedUntil(calendar.getTimeInMillis());
|
||||
rent.setRenter(uuid);
|
||||
plugin.message(sender, "setowner-succesRent", region);
|
||||
}
|
||||
rent.updateRegionFlags();
|
||||
rent.updateSigns();
|
||||
}
|
||||
if(region.isBuyRegion()) {
|
||||
BuyRegion buy = (BuyRegion)region;
|
||||
buy.setBuyer(uuid);
|
||||
plugin.message(sender, "setowner-succesBuy", region);
|
||||
buy.updateRegionFlags();
|
||||
buy.updateSigns();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Bukkit.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
public class SetownerCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setowner";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setownerrent") || target.hasPermission("areashop.setownerbuy")) {
|
||||
return "help-setowner";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setownerrent") && !sender.hasPermission("areashop.setownerbuy")) {
|
||||
plugin.message(sender, "setowner-noPermission");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region;
|
||||
if(args.length < 2) {
|
||||
plugin.message(sender, "setowner-help");
|
||||
return;
|
||||
}
|
||||
if(args.length == 2) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
}
|
||||
if(region == null) {
|
||||
plugin.message(sender, "setowner-notRegistered");
|
||||
return;
|
||||
}
|
||||
|
||||
if(region instanceof RentRegion && !sender.hasPermission("areashop.setownerrent")) {
|
||||
plugin.message(sender, "setowner-noPermissionRent", region);
|
||||
return;
|
||||
}
|
||||
if(region instanceof BuyRegion && !sender.hasPermission("areashop.setownerbuy")) {
|
||||
plugin.message(sender, "setowner-noPermissionBuy", region);
|
||||
return;
|
||||
}
|
||||
|
||||
UUID uuid = null;
|
||||
@SuppressWarnings("deprecation")
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(args[1]);
|
||||
if(player != null) {
|
||||
uuid = player.getUniqueId();
|
||||
}
|
||||
if(uuid == null) {
|
||||
plugin.message(sender, "setowner-noPlayer", args[1], region);
|
||||
return;
|
||||
}
|
||||
|
||||
if(region instanceof RentRegion) {
|
||||
RentRegion rent = (RentRegion)region;
|
||||
if(rent.isRenter(uuid)) {
|
||||
// extend
|
||||
rent.setRentedUntil(rent.getRentedUntil() + rent.getDuration());
|
||||
rent.setRenter(uuid);
|
||||
plugin.message(sender, "setowner-succesRentExtend", region);
|
||||
} else {
|
||||
// change
|
||||
if(!rent.isRented()) {
|
||||
rent.setRentedUntil(Calendar.getInstance().getTimeInMillis() + rent.getDuration());
|
||||
}
|
||||
rent.setRenter(uuid);
|
||||
plugin.message(sender, "setowner-succesRent", region);
|
||||
}
|
||||
}
|
||||
if(region instanceof BuyRegion) {
|
||||
BuyRegion buy = (BuyRegion)region;
|
||||
buy.setBuyer(uuid);
|
||||
plugin.message(sender, "setowner-succesBuy", region);
|
||||
}
|
||||
region.getFriendsFeature().deleteFriend(region.getOwner(), null);
|
||||
region.update();
|
||||
region.saveRequired();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(Player player : Utils.getOnlinePlayers()) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
} else if(toComplete == 3) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SetpriceCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setprice";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setprice")) {
|
||||
return "help-setprice";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setprice") && (!sender.hasPermission("areashop.setprice.landlord") && sender instanceof Player)) {
|
||||
plugin.message(sender, "setprice-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length < 2 || args[1] == null) {
|
||||
plugin.message(sender, "setprice-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region;
|
||||
if(args.length < 3) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[2]);
|
||||
}
|
||||
if(region == null) {
|
||||
plugin.message(sender, "setprice-notRegistered", args[2]);
|
||||
return;
|
||||
}
|
||||
if(!sender.hasPermission("areashop.setprice") && !(sender instanceof Player && region.isLandlord(((Player)sender).getUniqueId()))) {
|
||||
plugin.message(sender, "setprice-noLandlord", region);
|
||||
return;
|
||||
}
|
||||
if("default".equalsIgnoreCase(args[1]) || "reset".equalsIgnoreCase(args[1])) {
|
||||
if(region instanceof RentRegion) {
|
||||
((RentRegion)region).setPrice(null);
|
||||
} else if(region instanceof BuyRegion) {
|
||||
((BuyRegion)region).setPrice(null);
|
||||
}
|
||||
region.update();
|
||||
plugin.message(sender, "setprice-successRemoved", region);
|
||||
return;
|
||||
}
|
||||
double price;
|
||||
try {
|
||||
price = Double.parseDouble(args[1]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(sender, "setprice-wrongPrice", args[1], region);
|
||||
return;
|
||||
}
|
||||
if(region instanceof RentRegion) {
|
||||
((RentRegion)region).setPrice(price);
|
||||
plugin.message(sender, "setprice-successRent", region);
|
||||
} else if(region instanceof BuyRegion) {
|
||||
((BuyRegion)region).setPrice(price);
|
||||
plugin.message(sender, "setprice-successBuy", region);
|
||||
}
|
||||
region.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 3) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
+73
-77
@@ -1,77 +1,73 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.GeneralRegion;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class SetrestoreCommand extends CommandAreaShop {
|
||||
|
||||
public SetrestoreCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setrestore";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setrestore")) {
|
||||
return plugin.getLanguageManager().getLang("help-setrestore");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setrestore")) {
|
||||
plugin.message(sender, "setrestore-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length <= 2 || args[1] == null || args[2] == null) {
|
||||
plugin.message(sender, "setrestore-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "setrestore-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
String value = null;
|
||||
if(args[2].equalsIgnoreCase("true") || args[2].equalsIgnoreCase("false") || args[2].equalsIgnoreCase("general")) {
|
||||
value = args[2].toLowerCase();
|
||||
} else {
|
||||
plugin.message(sender, "setrestore-invalidSetting", args[2]);
|
||||
return;
|
||||
}
|
||||
region.setRestoreSetting(value);
|
||||
if(args.length > 3) {
|
||||
region.setRestoreProfile(args[3]);
|
||||
plugin.message(sender, "setrestore-successProfile", region.getName(), value, args[3]);
|
||||
} else {
|
||||
plugin.message(sender, "setrestore-success", region.getName(), value);
|
||||
}
|
||||
region.saveRequired();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
} else if(toComplete == 3) {
|
||||
result.add("true");
|
||||
result.add("false");
|
||||
result.add("general");
|
||||
} else if(toComplete == 4) {
|
||||
result.addAll(plugin.getConfig().getConfigurationSection("schematicProfiles").getKeys(false));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SetrestoreCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop setrestore";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.setrestore")) {
|
||||
return "help-setrestore";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setrestore")) {
|
||||
plugin.message(sender, "setrestore-noPermission");
|
||||
return;
|
||||
}
|
||||
if(args.length <= 2 || args[1] == null || args[2] == null) {
|
||||
plugin.message(sender, "setrestore-help");
|
||||
return;
|
||||
}
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(sender, "setrestore-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
Boolean value = null;
|
||||
if(args[2].equalsIgnoreCase("true")) {
|
||||
value = true;
|
||||
} else if(args[2].equalsIgnoreCase("false")) {
|
||||
value = false;
|
||||
}
|
||||
region.setRestoreSetting(value);
|
||||
String valueString = "general";
|
||||
if(value != null) {
|
||||
valueString = value + "";
|
||||
}
|
||||
if(args.length > 3) {
|
||||
region.setSchematicProfile(args[3]);
|
||||
plugin.message(sender, "setrestore-successProfile", valueString, args[3], region);
|
||||
} else {
|
||||
plugin.message(sender, "setrestore-success", valueString, region);
|
||||
}
|
||||
region.update();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result = plugin.getFileManager().getRegionNames();
|
||||
} else if(toComplete == 3) {
|
||||
result.add("true");
|
||||
result.add("false");
|
||||
result.add("general");
|
||||
} else if(toComplete == 4) {
|
||||
result.addAll(plugin.getConfig().getConfigurationSection("schematicProfiles").getKeys(false));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SetteleportCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop settp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.teleportall") || target.hasPermission("areashop.teleport")) {
|
||||
return "help-setteleport";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a person can set the teleport location of the region.
|
||||
* @param person The person to check
|
||||
* @param region The region to check for
|
||||
* @return true if the person can set the teleport location, otherwise false
|
||||
*/
|
||||
public static boolean canUse(CommandSender person, GeneralRegion region) {
|
||||
if(!(person instanceof Player)) {
|
||||
return false;
|
||||
}
|
||||
Player player = (Player)person;
|
||||
return player.hasPermission("areashop.setteleportall")
|
||||
|| region.isOwner(player) && player.hasPermission("areashop.setteleport");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.setteleport") && !sender.hasPermission("areashop.setteleportall")) {
|
||||
plugin.message(sender, "setteleport-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
GeneralRegion region;
|
||||
if(args.length < 2) {
|
||||
// get the region by location
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
region = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
region = plugin.getFileManager().getRegion(args[1]);
|
||||
}
|
||||
|
||||
boolean owner;
|
||||
|
||||
if(region == null) {
|
||||
plugin.message(player, "setteleport-noRentOrBuy", args[1]);
|
||||
return;
|
||||
}
|
||||
if(region instanceof RentRegion) {
|
||||
owner = player.getUniqueId().equals(((RentRegion)region).getRenter());
|
||||
} else {
|
||||
owner = player.getUniqueId().equals(((BuyRegion)region).getBuyer());
|
||||
}
|
||||
if(!player.hasPermission("areashop.setteleport")) {
|
||||
plugin.message(player, "setteleport-noPermission", region);
|
||||
return;
|
||||
} else if(!owner && !player.hasPermission("areashop.setteleportall")) {
|
||||
plugin.message(player, "setteleport-noPermissionOther", region);
|
||||
return;
|
||||
}
|
||||
|
||||
ProtectedRegion wgRegion = region.getRegion();
|
||||
if(args.length > 2 && args[2] != null && (args[2].equalsIgnoreCase("reset") || args[2].equalsIgnoreCase("yes") || args[2].equalsIgnoreCase("true"))) {
|
||||
region.getTeleportFeature().setTeleport(null);
|
||||
region.update();
|
||||
plugin.message(player, "setteleport-reset", region);
|
||||
return;
|
||||
}
|
||||
if(!player.hasPermission("areashop.setteleportoutsideregion") && (wgRegion == null || !wgRegion.contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
|
||||
plugin.message(player, "setteleport-notInside", region);
|
||||
return;
|
||||
}
|
||||
region.getTeleportFeature().setTeleport(player.getLocation());
|
||||
region.update();
|
||||
plugin.message(player, "setteleport-success", region);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
result.add("reset");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,262 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import com.sk89q.worldedit.BlockVector;
|
||||
import com.sk89q.worldedit.Vector;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedCuboidRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RegionGroup;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StackCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop stack";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.stack")) {
|
||||
return "help-stack";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
// Check permission
|
||||
if(!sender.hasPermission("areashop.stack")) {
|
||||
plugin.message(sender, "stack-noPermission");
|
||||
return;
|
||||
}
|
||||
// Only from ingame
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
final Player player = (Player)sender;
|
||||
// Specify enough arguments
|
||||
if(args.length < 5) {
|
||||
plugin.message(sender, "stack-help");
|
||||
return;
|
||||
}
|
||||
// Check amount
|
||||
int tempAmount = -1;
|
||||
try {
|
||||
tempAmount = Integer.parseInt(args[1]);
|
||||
} catch(NumberFormatException e) {
|
||||
// Incorrect number
|
||||
}
|
||||
if(tempAmount <= 0) {
|
||||
plugin.message(player, "stack-wrongAmount", args[1]);
|
||||
return;
|
||||
}
|
||||
// Check gap
|
||||
int gap;
|
||||
try {
|
||||
gap = Integer.parseInt(args[2]);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(player, "stack-wrongGap", args[2]);
|
||||
return;
|
||||
}
|
||||
// Check region type
|
||||
if(!"rent".equalsIgnoreCase(args[4]) && !"buy".equalsIgnoreCase(args[4])) {
|
||||
plugin.message(sender, "stack-help");
|
||||
return;
|
||||
}
|
||||
// Get WorldEdit selection
|
||||
final WorldEditSelection selection = plugin.getWorldEditHandler().getPlayerSelection(player);
|
||||
if(selection == null) {
|
||||
plugin.message(player, "stack-noSelection");
|
||||
return;
|
||||
}
|
||||
// Get or create group
|
||||
RegionGroup group = null;
|
||||
if(args.length > 5) {
|
||||
group = plugin.getFileManager().getGroup(args[5]);
|
||||
if(group == null) {
|
||||
group = new RegionGroup(plugin, args[5]);
|
||||
plugin.getFileManager().addGroup(group);
|
||||
}
|
||||
}
|
||||
// Get facing of the player (must be clearly one of the four directions to make sure it is no mistake)
|
||||
BlockFace facing = Utils.yawToFacing(player.getLocation().getYaw());
|
||||
if(player.getLocation().getPitch() > 45) {
|
||||
facing = BlockFace.DOWN;
|
||||
} else if(player.getLocation().getPitch() < -45) {
|
||||
facing = BlockFace.UP;
|
||||
}
|
||||
if(!(facing == BlockFace.NORTH || facing == BlockFace.EAST || facing == BlockFace.SOUTH || facing == BlockFace.WEST || facing == BlockFace.UP || facing == BlockFace.DOWN)) {
|
||||
plugin.message(player, "stack-unclearDirection", facing.toString().toLowerCase().replace('_', '-'));
|
||||
return;
|
||||
}
|
||||
Vector shift = new BlockVector(0, 0, 0);
|
||||
if(facing == BlockFace.SOUTH) {
|
||||
shift = shift.setZ(-selection.getLength() - gap);
|
||||
} else if(facing == BlockFace.WEST) {
|
||||
shift = shift.setX(selection.getWidth() + gap);
|
||||
} else if(facing == BlockFace.NORTH) {
|
||||
shift = shift.setZ(selection.getLength() + gap);
|
||||
} else if(facing == BlockFace.EAST) {
|
||||
shift = shift.setX(-selection.getWidth() - gap);
|
||||
} else if(facing == BlockFace.DOWN) {
|
||||
shift = shift.setY(-selection.getHeight() - gap);
|
||||
} else if(facing == BlockFace.UP) {
|
||||
shift = shift.setY(selection.getHeight() + gap);
|
||||
}
|
||||
AreaShop.debug(" calculated shift vector: " + shift + ", with facing=" + facing);
|
||||
// Create regions and add them to AreaShop
|
||||
final String nameTemplate = args[3];
|
||||
|
||||
|
||||
final int regionsPerTick = plugin.getConfig().getInt("adding.regionsPerTick");
|
||||
final boolean rentRegions = "rent".equalsIgnoreCase(args[4]);
|
||||
final int amount = tempAmount;
|
||||
final RegionGroup finalGroup = group;
|
||||
final Vector finalShift = shift;
|
||||
String type;
|
||||
if(rentRegions) {
|
||||
type = "rent";
|
||||
} else {
|
||||
type = "buy";
|
||||
}
|
||||
Message groupsMessage = Message.empty();
|
||||
if(group != null) {
|
||||
groupsMessage = Message.fromKey("stack-addToGroup").replacements(group.getName());
|
||||
}
|
||||
plugin.message(player, "stack-accepted", amount, type, gap, nameTemplate, groupsMessage);
|
||||
plugin.message(player, "stack-addStart", amount, regionsPerTick * 20);
|
||||
|
||||
Location minimumLocation = selection.getMinimumLocation();
|
||||
Vector minimumVector = new Vector(minimumLocation.getX(), minimumLocation.getY(), minimumLocation.getZ());
|
||||
Location maximumLocation = selection.getMaximumLocation();
|
||||
Vector maximumVector = new Vector(maximumLocation.getX(), maximumLocation.getY(), maximumLocation.getZ());
|
||||
new BukkitRunnable() {
|
||||
private int current = -1;
|
||||
private final RegionManager manager = AreaShop.getInstance().getRegionManager(selection.getWorld());
|
||||
private int counter = 1;
|
||||
private int tooLow = 0;
|
||||
private int tooHigh = 0;
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
for(int i = 0; i < regionsPerTick; i++) {
|
||||
current++;
|
||||
if(current < amount) {
|
||||
// Create the region name
|
||||
String counterName = counter + "";
|
||||
int minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
|
||||
while(counterName.length() < minimumLength) {
|
||||
counterName = "0" + counterName;
|
||||
}
|
||||
String regionName;
|
||||
if(nameTemplate.contains("#")) {
|
||||
regionName = nameTemplate.replace("#", counterName);
|
||||
} else {
|
||||
regionName = nameTemplate + counterName;
|
||||
}
|
||||
while(manager.getRegion(regionName) != null || AreaShop.getInstance().getFileManager().getRegion(regionName) != null) {
|
||||
counter++;
|
||||
counterName = counter + "";
|
||||
minimumLength = plugin.getConfig().getInt("stackRegionNumberLength");
|
||||
while(counterName.length() < minimumLength) {
|
||||
counterName = "0" + counterName;
|
||||
}
|
||||
if(nameTemplate.contains("#")) {
|
||||
regionName = nameTemplate.replace("#", counterName);
|
||||
} else {
|
||||
regionName = nameTemplate + counterName;
|
||||
}
|
||||
}
|
||||
// Add the region to WorldGuard (at startposition shifted by the number of this region times the blocks it should shift)
|
||||
BlockVector minimum = new BlockVector(minimumVector.add(finalShift.multiply(current)));
|
||||
BlockVector maximum = new BlockVector(maximumVector.add(finalShift.multiply(current)));
|
||||
// Check for out of bounds
|
||||
if(minimum.getBlockY() < 0) {
|
||||
tooLow++;
|
||||
continue;
|
||||
} else if(maximum.getBlockY() > 256) {
|
||||
tooHigh++;
|
||||
continue;
|
||||
}
|
||||
ProtectedCuboidRegion region = new ProtectedCuboidRegion(regionName, minimum, maximum);
|
||||
manager.addRegion(region);
|
||||
// Add the region to AreaShop
|
||||
if(rentRegions) {
|
||||
RentRegion rent = new RentRegion(regionName, selection.getWorld());
|
||||
if(finalGroup != null) {
|
||||
finalGroup.addMember(rent);
|
||||
}
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
plugin.getFileManager().addRent(rent);
|
||||
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
rent.update();
|
||||
} else {
|
||||
BuyRegion buy = new BuyRegion(regionName, selection.getWorld());
|
||||
if(finalGroup != null) {
|
||||
finalGroup.addMember(buy);
|
||||
}
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
plugin.getFileManager().addBuy(buy);
|
||||
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
buy.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
if(current >= amount) {
|
||||
if(player.isOnline()) {
|
||||
int added = amount - tooLow - tooHigh;
|
||||
Message wrong = Message.empty();
|
||||
if(tooHigh > 0) {
|
||||
wrong.append(Message.fromKey("stack-tooHigh").replacements(tooHigh));
|
||||
}
|
||||
if(tooLow > 0) {
|
||||
wrong.append(Message.fromKey("stack-tooLow").replacements(tooLow));
|
||||
}
|
||||
plugin.message(player, "stack-addComplete", added, wrong);
|
||||
}
|
||||
this.cancel();
|
||||
}
|
||||
}
|
||||
}.runTaskTimer(plugin, 1, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(toComplete == 5) {
|
||||
result.add("rent");
|
||||
result.add("buy");
|
||||
} else if(toComplete == 6) {
|
||||
result.addAll(plugin.getFileManager().getGroupNames());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+111
-123
@@ -1,123 +1,111 @@
|
||||
package nl.evolutioncoding.areashop.commands;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import nl.evolutioncoding.areashop.AreaShop;
|
||||
import nl.evolutioncoding.areashop.regions.BuyRegion;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class StopresellCommand extends CommandAreaShop {
|
||||
|
||||
public StopresellCommand(AreaShop plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop stopresell";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.stopresellall")) {
|
||||
return plugin.getLanguageManager().getLang("help-stopResellAll");
|
||||
} else if(target.hasPermission("areashop.stopresell")) {
|
||||
return plugin.getLanguageManager().getLang("help-stopResell");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, Command command, String[] args) {
|
||||
if(!sender.hasPermission("areashop.stopresell") && !sender.hasPermission("areashop.stopresellall")) {
|
||||
plugin.message(sender, "stopresell-noPermissionOther");
|
||||
return;
|
||||
}
|
||||
|
||||
BuyRegion buy = null;
|
||||
if(args.length <= 1) {
|
||||
if (sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = plugin.getFileManager().getApplicableBuyRegions(((Player) sender).getLocation());
|
||||
if (regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if (regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
buy = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
buy = plugin.getFileManager().getBuy(args[1]);
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "stopresell-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "stopresell-noRegionFound");
|
||||
return;
|
||||
}
|
||||
if(!buy.isInResellingMode()) {
|
||||
plugin.message(sender, "stopresell-notResell", buy);
|
||||
return;
|
||||
}
|
||||
if(sender.hasPermission("areashop.stopresellall")) {
|
||||
buy.disableReselling();
|
||||
buy.saveRequired();
|
||||
plugin.message(sender, "stopresell-success", buy);
|
||||
buy.updateSigns();
|
||||
buy.updateRegionFlags();
|
||||
} else if(sender.hasPermission("areashop.stopresell") && sender instanceof Player) {
|
||||
if(buy.isOwner((Player)sender)) {
|
||||
buy.disableReselling();
|
||||
buy.saveRequired();
|
||||
plugin.message(sender, "stopresell-success", buy);
|
||||
buy.updateSigns();
|
||||
buy.updateRegionFlags();
|
||||
} else {
|
||||
plugin.message(sender, "stopresell-noPermissionOther");
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "stopresell-noPermission");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start) {
|
||||
ArrayList<String> result = new ArrayList<String>();
|
||||
if(toComplete == 2) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isSold() && region.isInResellingMode()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class StopresellCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop stopresell";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.stopresellall") || target.hasPermission("areashop.stopresell")) {
|
||||
return "help-stopResell";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.stopresell") && !sender.hasPermission("areashop.stopresellall")) {
|
||||
plugin.message(sender, "stopresell-noPermissionOther");
|
||||
return;
|
||||
}
|
||||
|
||||
BuyRegion buy;
|
||||
if(args.length <= 1) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<BuyRegion> regions = Utils.getImportantBuyRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
buy = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
buy = plugin.getFileManager().getBuy(args[1]);
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "stopresell-notRegistered", args[1]);
|
||||
return;
|
||||
}
|
||||
}
|
||||
if(buy == null) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
}
|
||||
if(!buy.isInResellingMode()) {
|
||||
plugin.message(sender, "stopresell-notResell", buy);
|
||||
return;
|
||||
}
|
||||
if(sender.hasPermission("areashop.stopresellall")) {
|
||||
buy.disableReselling();
|
||||
buy.update();
|
||||
plugin.message(sender, "stopresell-success", buy);
|
||||
} else if(sender.hasPermission("areashop.stopresell") && sender instanceof Player) {
|
||||
if(buy.isOwner((Player)sender)) {
|
||||
buy.disableReselling();
|
||||
buy.update();
|
||||
plugin.message(sender, "stopresell-success", buy);
|
||||
} else {
|
||||
plugin.message(sender, "stopresell-noPermissionOther", buy);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "stopresell-noPermission", buy);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(BuyRegion region : plugin.getFileManager().getBuys()) {
|
||||
if(region.isSold() && region.isInResellingMode()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TeleportCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop tp";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.teleportall") || target.hasPermission("areashop.teleport")) {
|
||||
return "help-teleport";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a person can teleport to the region (assuming he is not teleporting to a sign).
|
||||
* @param person The person to check
|
||||
* @param region The region to check for
|
||||
* @return true if the person can teleport to it, otherwise false
|
||||
*/
|
||||
public static boolean canUse(CommandSender person, GeneralRegion region) {
|
||||
if(!(person instanceof Player)) {
|
||||
return false;
|
||||
}
|
||||
Player player = (Player)person;
|
||||
return player.hasPermission("areashop.teleportall")
|
||||
|| region.isOwner(player) && player.hasPermission("areashop.teleport")
|
||||
|| region.isAvailable() && player.hasPermission("areashop.teleportavailable")
|
||||
|| region.getFriendsFeature().getFriends().contains(player.getUniqueId()) && player.hasPermission("areashop.teleportfriend");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.teleport") && !sender.hasPermission("areashop.teleportall") && !sender.hasPermission("areashop.teleportavailable") && !sender.hasPermission("areashop.teleportavailablesign") && !sender.hasPermission("areashop.teleportsign") && !sender.hasPermission("areashop.teleportsignall") && !sender.hasPermission("areashop.teleportfriend") && !sender.hasPermission("teleportfriendsign")) {
|
||||
plugin.message(sender, "teleport-noPermission");
|
||||
return;
|
||||
}
|
||||
if(!(sender instanceof Player)) {
|
||||
plugin.message(sender, "cmd-onlyByPlayer");
|
||||
return;
|
||||
}
|
||||
if(args.length <= 1 || args[1] == null) {
|
||||
plugin.message(sender, "teleport-help");
|
||||
return;
|
||||
}
|
||||
Player player = (Player)sender;
|
||||
GeneralRegion region = plugin.getFileManager().getRegion(args[1]);
|
||||
if(region == null) {
|
||||
plugin.message(player, "teleport-noRentOrBuy", args[1]);
|
||||
return;
|
||||
}
|
||||
if(args.length >= 3 && (args[2].equalsIgnoreCase("sign") || args[2].equalsIgnoreCase("yes") || args[2].equalsIgnoreCase("true"))) {
|
||||
region.getTeleportFeature().teleportPlayer(player, true);
|
||||
} else {
|
||||
region.getTeleportFeature().teleportPlayer(player, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
result.addAll(plugin.getFileManager().getRegionNames());
|
||||
} else if(toComplete == 3) {
|
||||
result.add("sign");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
package me.wiefferink.areashop.commands;
|
||||
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class UnrentCommand extends CommandAreaShop {
|
||||
|
||||
@Override
|
||||
public String getCommandStart() {
|
||||
return "areashop unrent";
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHelp(CommandSender target) {
|
||||
if(target.hasPermission("areashop.unrent") || target.hasPermission("areashop.unrentown")) {
|
||||
return "help-unrent";
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a person can unrent the region.
|
||||
* @param person The person to check
|
||||
* @param region The region to check for
|
||||
* @return true if the person can unrent it, otherwise false
|
||||
*/
|
||||
public static boolean canUse(CommandSender person, GeneralRegion region) {
|
||||
if(person.hasPermission("areashop.unrent")) {
|
||||
return true;
|
||||
}
|
||||
if(person instanceof Player) {
|
||||
Player player = (Player)person;
|
||||
return region.isOwner(player) && person.hasPermission("areashop.unrentown");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void execute(CommandSender sender, String[] args) {
|
||||
if(!sender.hasPermission("areashop.unrent") && !sender.hasPermission("areashop.unrentown")) {
|
||||
plugin.message(sender, "unrent-noPermission");
|
||||
return;
|
||||
}
|
||||
RentRegion rent;
|
||||
if(args.length <= 1) {
|
||||
if(sender instanceof Player) {
|
||||
// get the region by location
|
||||
List<RentRegion> regions = Utils.getImportantRentRegions(((Player)sender).getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(sender, "cmd-noRegionsAtLocation");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(sender, "cmd-moreRegionsAtLocation");
|
||||
return;
|
||||
} else {
|
||||
rent = regions.get(0);
|
||||
}
|
||||
} else {
|
||||
plugin.message(sender, "cmd-automaticRegionOnlyByPlayer");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
rent = plugin.getFileManager().getRent(args[1]);
|
||||
}
|
||||
if(rent == null) {
|
||||
plugin.message(sender, "unrent-notRegistered");
|
||||
return;
|
||||
}
|
||||
if(!rent.isRented()) {
|
||||
plugin.message(sender, "unrent-notRented", rent);
|
||||
return;
|
||||
}
|
||||
rent.unRent(true, sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> getTabCompleteList(int toComplete, String[] start, CommandSender sender) {
|
||||
ArrayList<String> result = new ArrayList<>();
|
||||
if(toComplete == 2) {
|
||||
for(RentRegion region : plugin.getFileManager().getRents()) {
|
||||
if(region.isRented()) {
|
||||
result.add(region.getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
package me.wiefferink.areashop.events;
|
||||
|
||||
public class CancellableRegionEvent<T> extends RegionEvent<T> {
|
||||
|
||||
private boolean cancelled;
|
||||
private String reason;
|
||||
|
||||
public CancellableRegionEvent(T region) {
|
||||
super(region);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel the event from happening.
|
||||
* @param reason The reason of cancelling, used for display to the user, should end with a dot
|
||||
*/
|
||||
public void cancel(String reason) {
|
||||
this.cancelled = true;
|
||||
this.reason = reason;
|
||||
}
|
||||
|
||||
/**
|
||||
* Let the event continue, possible overwriting a cancel() call from another plugin.
|
||||
*/
|
||||
public void allow() {
|
||||
this.cancelled = false;
|
||||
this.reason = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the event has been cancelled.
|
||||
* @return true if the event has been cancelled, otherwise false
|
||||
*/
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the reason why this event is cancelled.
|
||||
* @return null if there is no reason or the event is not cancelled, otherwise a string
|
||||
*/
|
||||
public String getReason() {
|
||||
return reason;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package me.wiefferink.areashop.events;
|
||||
|
||||
public class NotifyRegionEvent<T> extends RegionEvent<T> {
|
||||
public NotifyRegionEvent(T region) {
|
||||
super(region);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
# Events
|
||||
|
||||
This package contains event classes that allow other plugins to listen to events about AreaShop regions.
|
||||
|
||||
* `RegionEvent` class represents a generic event.
|
||||
* `CancellableRegionEvent` represents an event that has a region and can be cancelled.
|
||||
* `NotifyRegionEvent` represents events that are to inform only, and cannot be cancelled anymore (an `CancellableRegionEvent` would be sent first).
|
||||
@@ -0,0 +1,30 @@
|
||||
package me.wiefferink.areashop.events;
|
||||
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.HandlerList;
|
||||
|
||||
public class RegionEvent<T> extends Event {
|
||||
protected T region;
|
||||
private static final HandlerList handlers = new HandlerList();
|
||||
|
||||
public RegionEvent(T region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
||||
@Override
|
||||
public HandlerList getHandlers() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
public static HandlerList getHandlerList() {
|
||||
return handlers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the region of this event.
|
||||
* @return The region the event is about
|
||||
*/
|
||||
public T getRegion() {
|
||||
return region;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package me.wiefferink.areashop.events.ask;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
/**
|
||||
* Broadcasted when a player tries to buy a region.
|
||||
*/
|
||||
public class BuyingRegionEvent extends CancellableRegionEvent<BuyRegion> {
|
||||
|
||||
private final OfflinePlayer player;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that is about to get bought
|
||||
* @param player The player that tries to buy the region
|
||||
*/
|
||||
public BuyingRegionEvent(BuyRegion region, OfflinePlayer player) {
|
||||
super(region);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that is trying to buy the region.
|
||||
* @return The player that is trying to buy the region
|
||||
*/
|
||||
public OfflinePlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
package me.wiefferink.areashop.events.ask;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
/**
|
||||
* Broadcasted when a player tries to rent a region.
|
||||
*/
|
||||
public class RentingRegionEvent extends CancellableRegionEvent<RentRegion> {
|
||||
|
||||
private final OfflinePlayer player;
|
||||
private final boolean extending;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that is about to be rented
|
||||
* @param player The player that tries to rent the region
|
||||
* @param extending true if the player is extending the rental of the region, otherwise false
|
||||
*/
|
||||
public RentingRegionEvent(RentRegion region, OfflinePlayer player, boolean extending) {
|
||||
super(region);
|
||||
this.player = player;
|
||||
this.extending = extending;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that is trying to rent the region.
|
||||
* @return The player that is trying to rent the region
|
||||
*/
|
||||
public OfflinePlayer getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the player is extending the region or renting it for the first time.
|
||||
* @return true if the player tries to extend the region, false if he tries to rent it the first time
|
||||
*/
|
||||
public boolean isExtending() {
|
||||
return extending;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package me.wiefferink.areashop.events.ask;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
|
||||
/**
|
||||
* Broadcasted when a player tries to resell a region.
|
||||
*/
|
||||
public class ResellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
|
||||
|
||||
private final OfflinePlayer player;
|
||||
|
||||
/**
|
||||
* Contructor.
|
||||
* @param region The region that the player is trying to resell
|
||||
* @param player The player that is trying to buy this region from the current owner
|
||||
*/
|
||||
public ResellingRegionEvent(BuyRegion region, OfflinePlayer player) {
|
||||
super(region);
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that is trying to buy the region.
|
||||
* @return The player that is trying to buy the region
|
||||
*/
|
||||
public OfflinePlayer getBuyer() {
|
||||
return player;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package me.wiefferink.areashop.events.ask;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region is about to get sold.
|
||||
*/
|
||||
public class SellingRegionEvent extends CancellableRegionEvent<BuyRegion> {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that is about to get sold
|
||||
*/
|
||||
public SellingRegionEvent(BuyRegion region) {
|
||||
super(region);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package me.wiefferink.areashop.events.ask;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region is about to be unrented.
|
||||
*/
|
||||
public class UnrentingRegionEvent extends CancellableRegionEvent<RentRegion> {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that is about to be unrented
|
||||
*/
|
||||
public UnrentingRegionEvent(RentRegion region) {
|
||||
super(region);
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
package me.wiefferink.areashop.events.askandnotify;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
/**
|
||||
* Broadcasted when a friend is being added to a region.
|
||||
*/
|
||||
public class AddedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
|
||||
|
||||
private final OfflinePlayer friend;
|
||||
private final CommandSender by;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region the friend is getting added to
|
||||
* @param friend The friend that is about to be added
|
||||
* @param by The CommandSender that is adding the friend, or null if none
|
||||
*/
|
||||
public AddedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
|
||||
super(region);
|
||||
this.friend = friend;
|
||||
this.by = by;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the OfflinePlayer that is getting added as friend.
|
||||
* @return The friend that is getting added
|
||||
*/
|
||||
public OfflinePlayer getFriend() {
|
||||
return friend;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the CommandSender that is adding the friend.
|
||||
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
|
||||
*/
|
||||
public CommandSender getBy() {
|
||||
return by;
|
||||
}
|
||||
}
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
package me.wiefferink.areashop.events.askandnotify;
|
||||
|
||||
import me.wiefferink.areashop.events.CancellableRegionEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
/**
|
||||
* Broadcasted when a friend is being added to a region.
|
||||
*/
|
||||
public class DeletedFriendEvent extends CancellableRegionEvent<GeneralRegion> {
|
||||
|
||||
private final OfflinePlayer friend;
|
||||
private final CommandSender by;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region the friend is getting added to
|
||||
* @param friend The friend that is about to be added
|
||||
* @param by The CommandSender that is adding the friend, or null if none
|
||||
*/
|
||||
public DeletedFriendEvent(GeneralRegion region, OfflinePlayer friend, CommandSender by) {
|
||||
super(region);
|
||||
this.friend = friend;
|
||||
this.by = by;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the OfflinePlayer that is getting added as friend.
|
||||
* @return The friend that is getting added
|
||||
*/
|
||||
public OfflinePlayer getFriend() {
|
||||
return friend;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the CommandSender that is adding the friend.
|
||||
* @return null if none, a CommandSender if done by someone (likely Player or ConsoleCommandSender)
|
||||
*/
|
||||
public CommandSender getBy() {
|
||||
return by;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been added to AreaShop.
|
||||
*/
|
||||
public class AddedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been added
|
||||
*/
|
||||
public AddedRegionEvent(GeneralRegion region) {
|
||||
super(region);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been bought.
|
||||
*/
|
||||
public class BoughtRegionEvent extends NotifyRegionEvent<BuyRegion> {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been bought
|
||||
*/
|
||||
public BoughtRegionEvent(BuyRegion region) {
|
||||
super(region);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been removed from AreaShop.
|
||||
*/
|
||||
public class DeletedRegionEvent extends NotifyRegionEvent<GeneralRegion> {
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been removed
|
||||
*/
|
||||
public DeletedRegionEvent(GeneralRegion region) {
|
||||
super(region);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been rented.
|
||||
*/
|
||||
public class RentedRegionEvent extends NotifyRegionEvent<RentRegion> {
|
||||
|
||||
private final boolean extended;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been rented
|
||||
* @param extended true if the region has been extended, false if this is the first time buying the region
|
||||
*/
|
||||
public RentedRegionEvent(RentRegion region, boolean extended) {
|
||||
super(region);
|
||||
this.region = region;
|
||||
this.extended = extended;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the region was extended or rented for the first time.
|
||||
* @return true if the region was extended, false when rented for the first time
|
||||
*/
|
||||
public boolean hasExtended() {
|
||||
return extended;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been resold.
|
||||
*/
|
||||
public class ResoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
|
||||
|
||||
private final UUID from;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been resold
|
||||
* @param from The player from who the region has been resold to the current owner
|
||||
*/
|
||||
public ResoldRegionEvent(BuyRegion region, UUID from) {
|
||||
super(region);
|
||||
this.from = from;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that the region has been bought from.
|
||||
* @return The UUID of the player that the region has been bought from
|
||||
*/
|
||||
public UUID getFromPlayer() {
|
||||
return from;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region is sold.
|
||||
*/
|
||||
public class SoldRegionEvent extends NotifyRegionEvent<BuyRegion> {
|
||||
|
||||
private final UUID oldBuyer;
|
||||
private final double refundedMoney;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been sold
|
||||
* @param oldBuyer The player for which the region has been sold
|
||||
* @param refundedMoney The amount of money that has been refunded
|
||||
*/
|
||||
public SoldRegionEvent(BuyRegion region, UUID oldBuyer, double refundedMoney) {
|
||||
super(region);
|
||||
this.oldBuyer = oldBuyer;
|
||||
this.refundedMoney = refundedMoney;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that the region is sold for.
|
||||
* @return The UUID of the player that the region is sold for
|
||||
*/
|
||||
public UUID getOldBuyer() {
|
||||
return oldBuyer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount that is paid back to the player.
|
||||
* @return The amount of money paid back to the player
|
||||
*/
|
||||
public double getRefundedMoney() {
|
||||
return refundedMoney;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* Broadcasted when a region has been unrented.
|
||||
*/
|
||||
public class UnrentedRegionEvent extends NotifyRegionEvent<RentRegion> {
|
||||
|
||||
private final UUID oldRenter;
|
||||
private final double refundedMoney;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region that has been unrented
|
||||
* @param oldRenter The player that rented the region before it was unrented
|
||||
* @param refundedMoney The amount of money that has been refunded
|
||||
*/
|
||||
public UnrentedRegionEvent(RentRegion region, UUID oldRenter, double refundedMoney) {
|
||||
super(region);
|
||||
this.oldRenter = oldRenter;
|
||||
this.refundedMoney = refundedMoney;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player that the region was unrented for.
|
||||
* @return The UUID of the player that the region was unrented for
|
||||
*/
|
||||
public UUID getOldRenter() {
|
||||
return oldRenter;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount that is paid back to the player.
|
||||
* @return The amount of money paid back to the player
|
||||
*/
|
||||
public double getRefundedMoney() {
|
||||
return refundedMoney;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
package me.wiefferink.areashop.events.notify;
|
||||
|
||||
import me.wiefferink.areashop.events.NotifyRegionEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
|
||||
/**
|
||||
* Broadcasted when the data of a region changes.
|
||||
* Should be used for updating displays that use region data.
|
||||
*/
|
||||
public class UpdateRegionEvent extends NotifyRegionEvent<GeneralRegion> {
|
||||
|
||||
/**
|
||||
* Contructor.
|
||||
* @param region The region that has been updated
|
||||
*/
|
||||
public UpdateRegionEvent(GeneralRegion region) {
|
||||
super(region);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,98 @@
|
||||
package me.wiefferink.areashop.features;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
|
||||
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
|
||||
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
|
||||
import me.wiefferink.areashop.events.notify.AddedRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.DeletedRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
public class DebugFeature extends RegionFeature {
|
||||
|
||||
@EventHandler
|
||||
public void buyingRegion(BuyingRegionEvent event) {
|
||||
AreaShop.debug("BuyingRegionEvent: " + event.getPlayer().getName() + " is trying to buy " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void boughtRegion(BoughtRegionEvent event) {
|
||||
AreaShop.debug("BoughtRegionEvent: " + event.getRegion().getPlayerName() + " bought " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void sellingRegion(SellingRegionEvent event) {
|
||||
AreaShop.debug("SellingRegionEvent: " + event.getRegion().getName() + " is trying to sell " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void soldRegion(SoldRegionEvent event) {
|
||||
AreaShop.debug("SoldRegionEvent: " + Utils.toName(event.getOldBuyer()) + " sold " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void resellingRegion(ResellingRegionEvent event) {
|
||||
AreaShop.debug("ResellingRegionEvent: " + event.getRegion().getName() + " is trying to resell " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void resoldRegion(ResoldRegionEvent event) {
|
||||
AreaShop.debug("ResoldRegionEvent: " + Utils.toName(event.getFromPlayer()) + " resold " + event.getRegion().getName() + " to " + event.getRegion().getPlayerName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void rentingRegion(RentingRegionEvent event) {
|
||||
AreaShop.debug("RentingRegionEvent: " + event.getPlayer().getName() + " is trying to rent " + event.getRegion().getName() + ", extending=" + event.isExtending());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void rentedRegion(RentedRegionEvent event) {
|
||||
AreaShop.debug("RentedRegionEvent: " + event.getRegion().getPlayerName() + " rented " + event.getRegion().getName() + ", extending=" + event.hasExtended());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void unrentingRegion(UnrentingRegionEvent event) {
|
||||
AreaShop.debug("UnrentingRegionEvent: " + event.getRegion().getPlayerName() + " is trying to unrent " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void unrentedRegion(UnrentedRegionEvent event) {
|
||||
AreaShop.debug("UnrentedRegionEvent: " + Utils.toName(event.getOldRenter()) + " unrented " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void regionUpdate(UpdateRegionEvent event) {
|
||||
//AreaShop.debug("UpdateRegionEvent: " + event.getRegion().getName() + " updated");
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void addedRegion(AddedRegionEvent event) {
|
||||
AreaShop.debug("AddedRegionEvent: " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void removedRegion(DeletedRegionEvent event) {
|
||||
AreaShop.debug("DeletedRegionEvent: " + event.getRegion().getName());
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void addedFriend(AddedFriendEvent event) {
|
||||
AreaShop.debug("AddedFriendEvent: region " + event.getRegion().getName() + ", " + event.getFriend().getName() + " by " + (event.getBy() == null ? "<nobody>" : event.getBy().getName()));
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void deleteFriend(DeletedFriendEvent event) {
|
||||
AreaShop.debug("DeletedFriendEvent: region " + event.getRegion().getName() + ", " + event.getFriend().getName() + " by " + (event.getBy() == null ? "<nobody>" : event.getBy().getName()));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,109 @@
|
||||
package me.wiefferink.areashop.features;
|
||||
|
||||
import me.wiefferink.areashop.events.askandnotify.AddedFriendEvent;
|
||||
import me.wiefferink.areashop.events.askandnotify.DeletedFriendEvent;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class FriendsFeature extends RegionFeature {
|
||||
|
||||
public FriendsFeature(GeneralRegion region) {
|
||||
setRegion(region);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a friend to the region.
|
||||
* @param player The UUID of the player to add
|
||||
* @param by The CommandSender that is adding the friend, or null
|
||||
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
|
||||
*/
|
||||
public boolean addFriend(UUID player, CommandSender by) {
|
||||
// Fire and check event
|
||||
AddedFriendEvent event = new AddedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
plugin.message(by, "general-cancelled", event.getReason(), this);
|
||||
return false;
|
||||
}
|
||||
|
||||
Set<String> friends = new HashSet<>(getRegion().getConfig().getStringList("general.friends"));
|
||||
friends.add(player.toString());
|
||||
List<String> list = new ArrayList<>(friends);
|
||||
getRegion().setSetting("general.friends", list);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a friend from the region.
|
||||
* @param player The UUID of the player to delete
|
||||
* @param by The CommandSender that is adding the friend, or null
|
||||
* @return true if the friend has been added, false if adding a friend was cancelled by another plugin
|
||||
*/
|
||||
public boolean deleteFriend(UUID player, CommandSender by) {
|
||||
// Fire and check event
|
||||
DeletedFriendEvent event = new DeletedFriendEvent(getRegion(), Bukkit.getOfflinePlayer(player), by);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
plugin.message(by, "general-cancelled", event.getReason(), this);
|
||||
return false;
|
||||
}
|
||||
|
||||
Set<String> friends = new HashSet<>(getRegion().getConfig().getStringList("general.friends"));
|
||||
friends.remove(player.toString());
|
||||
List<String> list = new ArrayList<>(friends);
|
||||
if(list.isEmpty()) {
|
||||
getRegion().setSetting("general.friends", null);
|
||||
} else {
|
||||
getRegion().setSetting("general.friends", list);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of friends added to this region.
|
||||
* @return Friends added to this region
|
||||
*/
|
||||
public Set<UUID> getFriends() {
|
||||
HashSet<UUID> result = new HashSet<>();
|
||||
for(String friend : getRegion().getConfig().getStringList("general.friends")) {
|
||||
try {
|
||||
UUID id = UUID.fromString(friend);
|
||||
result.add(id);
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Don't add it
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of friends added to this region.
|
||||
* @return Friends added to this region
|
||||
*/
|
||||
public Set<String> getFriendNames() {
|
||||
HashSet<String> result = new HashSet<>();
|
||||
for(UUID friend : getFriends()) {
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(friend);
|
||||
if(player != null && player.getName() != null) {
|
||||
result.add(player.getName());
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove all friends that are added to this region.
|
||||
*/
|
||||
public void clearFriends() {
|
||||
getRegion().setSetting("general.friends", null);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
# Features
|
||||
|
||||
This package contains classes that represent a certain feature and implement it for all regions.
|
||||
|
||||
* `RegionFeature` represents a single feature, for each implementing class one instance is created without an assigned region, to listen for events etc, and an instance per region is created on-demand to handle region specific things.
|
||||
* More features will be moved from `GeneralRegion` to these kind of classes, to keep all code for a feature together and cleanup `GeneralRegion`.
|
||||
@@ -0,0 +1,52 @@
|
||||
package me.wiefferink.areashop.features;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public abstract class RegionFeature implements Listener {
|
||||
public static final AreaShop plugin = AreaShop.getInstance();
|
||||
|
||||
public YamlConfiguration config = plugin.getConfig();
|
||||
private GeneralRegion region;
|
||||
|
||||
/**
|
||||
* Set the region for this feature.
|
||||
* @param region Feature region
|
||||
*/
|
||||
public void setRegion(GeneralRegion region) {
|
||||
this.region = region;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the region of this feature.
|
||||
* @return region of this feature, or null if generic
|
||||
*/
|
||||
public GeneralRegion getRegion() {
|
||||
return region;
|
||||
}
|
||||
|
||||
/**
|
||||
* Start listening to events.
|
||||
*/
|
||||
public void listen() {
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Destroy the feature and deregister everything.
|
||||
*/
|
||||
public void shutdownFeature() {
|
||||
HandlerList.unregisterAll(this);
|
||||
shutdown();
|
||||
}
|
||||
|
||||
/**
|
||||
* Dummy method a RegionFeature implementation can override.
|
||||
*/
|
||||
public void shutdown() {
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,520 @@
|
||||
package me.wiefferink.areashop.features;
|
||||
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.features.signs.RegionSign;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.areashop.tools.Value;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public class TeleportFeature extends RegionFeature {
|
||||
|
||||
private static final ArrayList<Material> canSpawnIn = new ArrayList<>(Arrays.asList(Material.WOOD_DOOR, Material.WOODEN_DOOR, Material.SIGN_POST, Material.WALL_SIGN, Material.STONE_PLATE, Material.IRON_DOOR_BLOCK, Material.WOOD_PLATE, Material.TRAP_DOOR, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.DRAGON_EGG, Material.GOLD_PLATE, Material.IRON_PLATE));
|
||||
private static final ArrayList<Material> cannotSpawnOn = new ArrayList<>(Arrays.asList(Material.PISTON_EXTENSION, Material.PISTON_MOVING_PIECE, Material.SIGN_POST, Material.WALL_SIGN, Material.STONE_PLATE, Material.IRON_DOOR_BLOCK, Material.WOOD_PLATE, Material.TRAP_DOOR, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.CACTUS, Material.IRON_FENCE, Material.FENCE_GATE, Material.THIN_GLASS, Material.NETHER_FENCE, Material.DRAGON_EGG, Material.GOLD_PLATE, Material.IRON_PLATE, Material.STAINED_GLASS_PANE));
|
||||
private static final ArrayList<Material> cannotSpawnBeside = new ArrayList<>(Arrays.asList(Material.LAVA, Material.STATIONARY_LAVA, Material.CACTUS));
|
||||
|
||||
public TeleportFeature() {
|
||||
}
|
||||
|
||||
|
||||
public TeleportFeature(GeneralRegion region) {
|
||||
setRegion(region);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the teleportlocation set for this region.
|
||||
* @return The teleport location, or null if not set
|
||||
*/
|
||||
public Location getTeleportLocation() {
|
||||
return Utils.configToLocation(getRegion().getConfigurationSectionSetting("general.teleportLocation"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the region has a teleportLocation specified.
|
||||
* @return true if the region has a teleportlocation, false otherwise
|
||||
*/
|
||||
public boolean hasTeleportLocation() {
|
||||
return getRegion().getConfigurationSectionSetting("general.teleportLocation") != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the teleport location of this region.
|
||||
* @param location The location to set as teleport location
|
||||
*/
|
||||
public void setTeleport(Location location) {
|
||||
if(location == null) {
|
||||
getRegion().setSetting("general.teleportLocation", null);
|
||||
} else {
|
||||
getRegion().setSetting("general.teleportLocation", Utils.locationToConfig(location, true));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Teleport a player to the region or sign.
|
||||
* @param player Player that should be teleported
|
||||
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
|
||||
* @param checkRestrictions Set to true if teleport permissions should be checked, false otherwise, also toggles cross-world check
|
||||
* @return true if the teleport succeeded, otherwise false
|
||||
*/
|
||||
public boolean teleportPlayer(Player player, boolean toSign, boolean checkRestrictions) {
|
||||
|
||||
// Check basics
|
||||
if(getRegion().getWorld() == null) {
|
||||
getRegion().message(player, "general-noWorld");
|
||||
return false;
|
||||
}
|
||||
if(getRegion().getRegion() == null) {
|
||||
getRegion().message(player, "general-noRegion");
|
||||
return false;
|
||||
}
|
||||
|
||||
if(checkRestrictions) {
|
||||
// Check correct world
|
||||
if(!getRegion().getBooleanSetting("general.teleportCrossWorld") && !player.getWorld().equals(getRegion().getWorld())) {
|
||||
getRegion().message(player, "teleport-wrongWorld", player.getWorld().getName());
|
||||
return false;
|
||||
}
|
||||
|
||||
boolean owner = player.getUniqueId().equals(getRegion().getOwner());
|
||||
boolean friend = getRegion().getFriendsFeature().getFriends().contains(player.getUniqueId());
|
||||
boolean available = getRegion().isAvailable();
|
||||
// Teleport to sign instead if they dont have permission for teleporting to region
|
||||
if((!toSign && owner && !player.hasPermission("areashop.teleport") && player.hasPermission("areashop.teleportsign")
|
||||
|| !toSign && !owner && !friend && !player.hasPermission("areashop.teleportall") && player.hasPermission("areashop.teleportsignall")
|
||||
|| !toSign && !owner && friend && !player.hasPermission("areashop.teleportfriend") && player.hasPermission("areashop.teleportfriendsign")
|
||||
|| !toSign && !owner && !friend && available && !player.hasPermission("areashop.teleportavailable") && player.hasPermission("areashop.teleportavailablesign"))) {
|
||||
getRegion().message(player, "teleport-changedToSign");
|
||||
toSign = true;
|
||||
}
|
||||
// Check permissions
|
||||
if(owner && !available && !player.hasPermission("areashop.teleport") && !toSign) {
|
||||
getRegion().message(player, "teleport-noPermission");
|
||||
return false;
|
||||
} else if(!owner && !available && !player.hasPermission("areashop.teleportall") && !toSign && !friend) {
|
||||
getRegion().message(player, "teleport-noPermissionOther");
|
||||
return false;
|
||||
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriend") && !toSign && friend) {
|
||||
getRegion().message(player, "teleport-noPermissionFriend");
|
||||
return false;
|
||||
} else if(available && !player.hasPermission("areashop.teleportavailable") && !toSign) {
|
||||
getRegion().message(player, "teleport-noPermissionAvailable");
|
||||
return false;
|
||||
} else if(owner && !available && !player.hasPermission("areashop.teleportsign") && toSign) {
|
||||
getRegion().message(player, "teleport-noPermissionSign");
|
||||
return false;
|
||||
} else if(!owner && !available && !player.hasPermission("areashop.teleportsignall") && toSign && !friend) {
|
||||
getRegion().message(player, "teleport-noPermissionOtherSign");
|
||||
return false;
|
||||
} else if(!owner && !available && !player.hasPermission("areashop.teleportfriendsign") && toSign && friend) {
|
||||
getRegion().message(player, "teleport-noPermissionFriendSign");
|
||||
return false;
|
||||
} else if(available && !player.hasPermission("areashop.teleportavailablesign") && toSign) {
|
||||
getRegion().message(player, "teleport-noPermissionAvailableSign");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Get the starting location
|
||||
Value<Boolean> toSignRef = new Value<>(toSign);
|
||||
Location startLocation = getStartLocation(player, toSignRef);
|
||||
toSign = toSignRef.get();
|
||||
|
||||
boolean insideRegion;
|
||||
if(toSign) {
|
||||
insideRegion = getRegion().getBooleanSetting("general.teleportToSignIntoRegion");
|
||||
} else {
|
||||
insideRegion = getRegion().getBooleanSetting("general.teleportIntoRegion");
|
||||
}
|
||||
|
||||
// Check locations starting from startLocation and then a cube that increases
|
||||
// radius around that (until no block in the region is found at all cube sides)
|
||||
Location safeLocation = startLocation;
|
||||
ProtectedRegion worldguardRegion = getRegion().getRegion();
|
||||
boolean blocksInRegion = worldguardRegion.contains(startLocation.getBlockX(), startLocation.getBlockY(), startLocation.getBlockZ());
|
||||
if(!blocksInRegion && insideRegion) {
|
||||
getRegion().message(player, "teleport-blocked");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Tries limit tracking
|
||||
int radius = 1;
|
||||
int checked = 1;
|
||||
int maxTries = plugin.getConfig().getInt("maximumTries");
|
||||
|
||||
// Tracking of which sides to continue the search
|
||||
boolean done = isSafe(safeLocation) && (blocksInRegion || !insideRegion);
|
||||
boolean northDone = false, eastDone = false, southDone = false, westDone = false, topDone = false, bottomDone = false;
|
||||
boolean continueThisDirection;
|
||||
|
||||
while((blocksInRegion || !insideRegion) && !done) {
|
||||
blocksInRegion = false;
|
||||
|
||||
// North side
|
||||
continueThisDirection = false;
|
||||
for(int x = -radius + 1; x <= radius && !done && !northDone; x++) {
|
||||
for(int y = -radius + 1; y < radius && !done; y++) {
|
||||
safeLocation = startLocation.clone().add(x, y, -radius);
|
||||
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
|
||||
continue;
|
||||
}
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
northDone = northDone || !continueThisDirection;
|
||||
|
||||
// East side
|
||||
continueThisDirection = false;
|
||||
for(int z = -radius + 1; z <= radius && !done && !eastDone; z++) {
|
||||
for(int y = -radius + 1; y < radius && !done; y++) {
|
||||
safeLocation = startLocation.clone().add(radius, y, z);
|
||||
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
|
||||
continue;
|
||||
}
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
eastDone = eastDone || !continueThisDirection;
|
||||
|
||||
// South side
|
||||
continueThisDirection = false;
|
||||
for(int x = radius - 1; x >= -radius && !done && !southDone; x--) {
|
||||
for(int y = -radius + 1; y < radius && !done; y++) {
|
||||
safeLocation = startLocation.clone().add(x, y, radius);
|
||||
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
|
||||
continue;
|
||||
}
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
southDone = southDone || !continueThisDirection;
|
||||
|
||||
// West side
|
||||
continueThisDirection = false;
|
||||
for(int z = radius - 1; z >= -radius && !done && !westDone; z--) {
|
||||
for(int y = -radius + 1; y < radius && !done; y++) {
|
||||
safeLocation = startLocation.clone().add(-radius, y, z);
|
||||
if(safeLocation.getBlockY() > 256 || safeLocation.getBlockY() < 0) {
|
||||
continue;
|
||||
}
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
westDone = westDone || !continueThisDirection;
|
||||
|
||||
// Top side
|
||||
continueThisDirection = false;
|
||||
// Middle block of the top
|
||||
if((startLocation.getBlockY() + radius) > 256) {
|
||||
topDone = true;
|
||||
}
|
||||
if(!done && !topDone) {
|
||||
safeLocation = startLocation.clone().add(0, radius, 0);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
for(int r = 1; r <= radius && !done && !topDone; r++) {
|
||||
// North
|
||||
for(int x = -r + 1; x <= r && !done; x++) {
|
||||
safeLocation = startLocation.clone().add(x, radius, -r);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// East
|
||||
for(int z = -r + 1; z <= r && !done; z++) {
|
||||
safeLocation = startLocation.clone().add(r, radius, z);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// South side
|
||||
for(int x = r - 1; x >= -r && !done; x--) {
|
||||
safeLocation = startLocation.clone().add(x, radius, r);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// West side
|
||||
for(int z = r - 1; z >= -r && !done; z--) {
|
||||
safeLocation = startLocation.clone().add(-r, radius, z);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
topDone = topDone || !continueThisDirection;
|
||||
|
||||
// Bottom side
|
||||
continueThisDirection = false;
|
||||
// Middle block of the bottom
|
||||
if(startLocation.getBlockY() - radius < 0) {
|
||||
bottomDone = true;
|
||||
}
|
||||
if(!done && !bottomDone) {
|
||||
safeLocation = startLocation.clone().add(0, -radius, 0);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
for(int r = 1; r <= radius && !done && !bottomDone; r++) {
|
||||
// North
|
||||
for(int x = -r + 1; x <= r && !done; x++) {
|
||||
safeLocation = startLocation.clone().add(x, -radius, -r);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// East
|
||||
for(int z = -r + 1; z <= r && !done; z++) {
|
||||
safeLocation = startLocation.clone().add(r, -radius, z);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// South side
|
||||
for(int x = r - 1; x >= -r && !done; x--) {
|
||||
safeLocation = startLocation.clone().add(x, -radius, r);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
// West side
|
||||
for(int z = r - 1; z >= -r && !done; z--) {
|
||||
safeLocation = startLocation.clone().add(-r, -radius, z);
|
||||
if(worldguardRegion.contains(safeLocation.getBlockX(), safeLocation.getBlockY(), safeLocation.getBlockZ()) || !insideRegion) {
|
||||
checked++;
|
||||
done = isSafe(safeLocation) || checked > maxTries;
|
||||
blocksInRegion = true;
|
||||
continueThisDirection = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
bottomDone = bottomDone || !continueThisDirection;
|
||||
|
||||
// Increase cube radius
|
||||
radius++;
|
||||
}
|
||||
if(done && isSafe(safeLocation)) {
|
||||
if(toSign) {
|
||||
getRegion().message(player, "teleport-successSign");
|
||||
|
||||
// Let the player look at the sign
|
||||
Vector playerVector = safeLocation.toVector();
|
||||
playerVector.setY(playerVector.getY() + player.getEyeHeight(true));
|
||||
Vector signVector = getRegion().getSignsFeature().getSigns().get(0).getLocation().toVector().add(new Vector(0.5, 0.5, 0.5));
|
||||
Vector direction = playerVector.clone().subtract(signVector).normalize();
|
||||
safeLocation.setYaw(180 - (float)Math.toDegrees(Math.atan2(direction.getX(), direction.getZ())));
|
||||
safeLocation.setPitch(90 - (float)Math.toDegrees(Math.acos(direction.getY())));
|
||||
} else {
|
||||
getRegion().message(player, "teleport-success");
|
||||
}
|
||||
|
||||
player.teleport(safeLocation);
|
||||
AreaShop.debug("Found location: " + safeLocation.toString() + " Tries: " + (checked - 1));
|
||||
return true;
|
||||
} else {
|
||||
getRegion().message(player, "teleport-noSafe", checked - 1, maxTries);
|
||||
AreaShop.debug("No location found, checked " + (checked - 1) + " spots of max " + maxTries);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Teleport a player to the region or sign when he has permissions for it.
|
||||
* @param player Player that should be teleported
|
||||
* @param toSign true to teleport to the first sign of the region, false for teleporting to the region itself
|
||||
* @return true if the teleport succeeded, otherwise false
|
||||
*/
|
||||
public boolean teleportPlayer(Player player, boolean toSign) {
|
||||
return teleportPlayer(player, toSign, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Teleport a player to the region when he has permissions for it.
|
||||
* @param player Player that should be teleported
|
||||
* @return true if the teleport succeeded, otherwise false
|
||||
*/
|
||||
public boolean teleportPlayer(Player player) {
|
||||
return teleportPlayer(player, false, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a certain location is safe to teleport to.
|
||||
* @param location The location to check
|
||||
* @return true if it is safe, otherwise false
|
||||
*/
|
||||
private boolean isSafe(Location location) {
|
||||
Block feet = location.getBlock();
|
||||
Block head = feet.getRelative(BlockFace.UP);
|
||||
Block below = feet.getRelative(BlockFace.DOWN);
|
||||
Block above = head.getRelative(BlockFace.UP);
|
||||
|
||||
// Check the block at the feet and head of the player
|
||||
if((feet.getType().isSolid() && !canSpawnIn.contains(feet.getType())) || feet.isLiquid()) {
|
||||
return false;
|
||||
} else if((head.getType().isSolid() && !canSpawnIn.contains(head.getType())) || head.isLiquid()) {
|
||||
return false;
|
||||
} else if(!below.getType().isSolid() || cannotSpawnOn.contains(below.getType()) || below.isLiquid()) {
|
||||
return false;
|
||||
} else if(above.isLiquid() || cannotSpawnBeside.contains(above.getType())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get all blocks around the player (below foot level, foot level, head level and above head level)
|
||||
Set<Material> around = new HashSet<>();
|
||||
for(int y = 0; y <= 3; y++) {
|
||||
for(int x = -1; x <= 1; x++) {
|
||||
for(int z = -1; z <= 1; z++) {
|
||||
// Skip blocks in the column of the player
|
||||
if(x == 0 && z == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
around.add(below.getRelative(x, y, z).getType());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check the blocks around the player
|
||||
for(Material material : around) {
|
||||
if(cannotSpawnBeside.contains(material)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the start location of a safe teleport search.
|
||||
* @param player The player to get it for
|
||||
* @param toSign true to try teleporting to the first sign, false for teleporting to the region
|
||||
* @return The start location
|
||||
*/
|
||||
private Location getStartLocation(Player player, Value<Boolean> toSign) {
|
||||
Location startLocation = null;
|
||||
ProtectedRegion worldguardRegion = getRegion().getRegion();
|
||||
|
||||
// Try to get sign location
|
||||
List<RegionSign> signs = getRegion().getSignsFeature().getSigns();
|
||||
boolean signAvailable = !signs.isEmpty();
|
||||
if(toSign.get()) {
|
||||
if(signAvailable) {
|
||||
// Use the location 1 below the sign to prevent weird spawing above the sign
|
||||
startLocation = signs.get(0).getLocation(); //.subtract(0.0, 1.0, 0.0);
|
||||
startLocation.setPitch(player.getLocation().getPitch());
|
||||
startLocation.setYaw(player.getLocation().getYaw());
|
||||
|
||||
// Move player x blocks away from the sign
|
||||
double distance = getRegion().getDoubleSetting("general.teleportSignDistance");
|
||||
if(distance > 0) {
|
||||
BlockFace facing = getRegion().getSignsFeature().getSigns().get(0).getFacing();
|
||||
Vector facingVector = new Vector(facing.getModX(), facing.getModY(), facing.getModZ())
|
||||
.normalize()
|
||||
.multiply(distance);
|
||||
startLocation.setX(startLocation.getBlockX() + 0.5);
|
||||
startLocation.setZ(startLocation.getBlockZ() + 0.5);
|
||||
startLocation.add(facingVector);
|
||||
}
|
||||
} else {
|
||||
// No sign available
|
||||
getRegion().message(player, "teleport-changedToNoSign");
|
||||
toSign.set(false);
|
||||
}
|
||||
}
|
||||
|
||||
// Use teleportation location that is set for the region
|
||||
if(startLocation == null && hasTeleportLocation()) {
|
||||
startLocation = getTeleportLocation();
|
||||
}
|
||||
|
||||
// Calculate a default location
|
||||
if(startLocation == null) {
|
||||
// Set to block in the middle, y configured in the config
|
||||
com.sk89q.worldedit.Vector middle = com.sk89q.worldedit.Vector.getMidpoint(worldguardRegion.getMaximumPoint(), worldguardRegion.getMinimumPoint());
|
||||
String configSetting = getRegion().getStringSetting("general.teleportLocationY");
|
||||
if("bottom".equalsIgnoreCase(configSetting)) {
|
||||
middle = middle.setY(worldguardRegion.getMinimumPoint().getBlockY());
|
||||
} else if("top".equalsIgnoreCase(configSetting)) {
|
||||
middle = middle.setY(worldguardRegion.getMaximumPoint().getBlockY());
|
||||
} else if("middle".equalsIgnoreCase(configSetting)) {
|
||||
middle = middle.setY(middle.getBlockY());
|
||||
} else {
|
||||
try {
|
||||
int vertical = Integer.parseInt(configSetting);
|
||||
middle = middle.setY(vertical);
|
||||
} catch(NumberFormatException e) {
|
||||
AreaShop.warn("Could not parse general.teleportLocationY: '" + configSetting + "'");
|
||||
}
|
||||
}
|
||||
startLocation = new Location(getRegion().getWorld(), middle.getX(), middle.getY(), middle.getZ(), player.getLocation().getYaw(), player.getLocation().getPitch());
|
||||
}
|
||||
|
||||
// Set location in the center of the block
|
||||
startLocation.setX(startLocation.getBlockX() + 0.5);
|
||||
startLocation.setZ(startLocation.getBlockZ() + 0.5);
|
||||
|
||||
return startLocation;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
+266
@@ -0,0 +1,266 @@
|
||||
package me.wiefferink.areashop.features;
|
||||
|
||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||
import com.sk89q.worldguard.protection.flags.Flag;
|
||||
import com.sk89q.worldguard.protection.flags.InvalidFlagFormat;
|
||||
import com.sk89q.worldguard.protection.flags.RegionGroupFlag;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
|
||||
import me.wiefferink.areashop.interfaces.RegionAccessSet;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.event.EventHandler;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class WorldGuardRegionFlagsFeature extends RegionFeature {
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void regionUpdate(UpdateRegionEvent event) {
|
||||
updateRegionFlags(event.getRegion());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the region flags/options to the values of a ConfigurationSection.
|
||||
* @param region The region to update the flags for
|
||||
* @return true if the flags have been set correctly, otherwise false
|
||||
*/
|
||||
private boolean updateRegionFlags(GeneralRegion region) {
|
||||
boolean result = true;
|
||||
|
||||
// Get section defining the region flag profile
|
||||
ConfigurationSection flagProfileSection = region.getConfigurationSectionSetting("general.flagProfile", "flagProfiles");
|
||||
if(flagProfileSection == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Region flags for all states
|
||||
ConfigurationSection allFlags = flagProfileSection.getConfigurationSection("ALL");
|
||||
if(allFlags != null) {
|
||||
result = result && updateRegionFlags(region, allFlags);
|
||||
}
|
||||
|
||||
// Region flags for the current state
|
||||
ConfigurationSection stateFlags = flagProfileSection.getConfigurationSection(region.getState().getValue());
|
||||
|
||||
// If in reselling mode, fallback to 'resale' section if 'resell' is not found (legacy configuration problem: https://github.com/NLthijs48/AreaShop/issues/303)
|
||||
if(stateFlags == null && region.getState() == GeneralRegion.RegionState.RESELL) {
|
||||
stateFlags = flagProfileSection.getConfigurationSection("resale");
|
||||
}
|
||||
|
||||
if(stateFlags != null) {
|
||||
result = result && updateRegionFlags(region, stateFlags);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the region flags/options to the values of a ConfigurationSection.
|
||||
* @param region The region to update the flags for
|
||||
* @param flags The flags to apply
|
||||
* @return true if the flags have been set correctly, otherwise false
|
||||
*/
|
||||
private boolean updateRegionFlags(GeneralRegion region, ConfigurationSection flags) {
|
||||
boolean result = true;
|
||||
|
||||
Set<String> flagNames = flags.getKeys(false);
|
||||
WorldGuardPlugin worldGuard = plugin.getWorldGuard();
|
||||
|
||||
// Get the region
|
||||
ProtectedRegion worldguardRegion = region.getRegion();
|
||||
if(worldguardRegion == null) {
|
||||
AreaShop.debug("Region '" + region.getName() + "' does not exist, setting flags failed");
|
||||
return false;
|
||||
}
|
||||
// Loop through all flags that are set in the config
|
||||
for(String flagName : flagNames) {
|
||||
String value = Message.fromString(flags.getString(flagName)).replacements(region).getPlain();
|
||||
// In the config normal Bukkit color codes are used, those only need to be translated on 5.X WorldGuard versions
|
||||
if(plugin.getWorldGuard().getDescription().getVersion().startsWith("5.")) {
|
||||
value = translateBukkitToWorldGuardColors(value);
|
||||
}
|
||||
if(flagName.equalsIgnoreCase("members")) {
|
||||
plugin.getWorldGuardHandler().setMembers(worldguardRegion, parseAccessSet(value));
|
||||
//AreaShop.debug(" Flag " + flagName + " set: " + members.toUserFriendlyString());
|
||||
} else if(flagName.equalsIgnoreCase("owners")) {
|
||||
plugin.getWorldGuardHandler().setOwners(worldguardRegion, parseAccessSet(value));
|
||||
//AreaShop.debug(" Flag " + flagName + " set: " + owners.toUserFriendlyString());
|
||||
} else if(flagName.equalsIgnoreCase("priority")) {
|
||||
try {
|
||||
int priority = Integer.parseInt(value);
|
||||
if(worldguardRegion.getPriority() != priority) {
|
||||
worldguardRegion.setPriority(priority);
|
||||
}
|
||||
//AreaShop.debug(" Flag " + flagName + " set: " + value);
|
||||
} catch(NumberFormatException e) {
|
||||
AreaShop.warn("The value of flag " + flagName + " is not a number");
|
||||
result = false;
|
||||
}
|
||||
} else if(flagName.equalsIgnoreCase("parent")) {
|
||||
if(region.getWorld() == null || plugin.getRegionManager(region.getWorld()) == null) {
|
||||
continue;
|
||||
}
|
||||
ProtectedRegion parentRegion = plugin.getRegionManager(region.getWorld()).getRegion(value);
|
||||
if(parentRegion != null) {
|
||||
if(!parentRegion.equals(worldguardRegion.getParent())) {
|
||||
try {
|
||||
worldguardRegion.setParent(parentRegion);
|
||||
//AreaShop.debug(" Flag " + flagName + " set: " + value);
|
||||
} catch(ProtectedRegion.CircularInheritanceException e) {
|
||||
AreaShop.warn("The parent set in the config is not correct (circular inheritance)");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
AreaShop.warn("The parent set in the config is not correct (region does not exist)");
|
||||
}
|
||||
} else {
|
||||
// Parse all other normal flags (groups are also handled)
|
||||
String flagSetting = null;
|
||||
com.sk89q.worldguard.protection.flags.RegionGroup groupValue = null;
|
||||
|
||||
Flag<?> foundFlag = plugin.getWorldGuardHandler().fuzzyMatchFlag(flagName);
|
||||
if(foundFlag == null) {
|
||||
AreaShop.warn("Found wrong flag in flagProfiles section: " + flagName + ", check if that is the correct WorldGuard flag");
|
||||
continue;
|
||||
}
|
||||
RegionGroupFlag groupFlag = foundFlag.getRegionGroupFlag();
|
||||
if(value == null || value.isEmpty()) {
|
||||
if(worldguardRegion.getFlag(foundFlag) != null) {
|
||||
worldguardRegion.setFlag(foundFlag, null);
|
||||
}
|
||||
if(groupFlag != null && worldguardRegion.getFlag(groupFlag) != null) {
|
||||
worldguardRegion.setFlag(groupFlag, null);
|
||||
}
|
||||
//AreaShop.debug(" Flag " + flagName + " reset (+ possible group of flag)");
|
||||
} else {
|
||||
if(groupFlag == null) {
|
||||
flagSetting = value;
|
||||
} else {
|
||||
for(String part : value.split(" ")) {
|
||||
if(part.startsWith("g:")) {
|
||||
if(part.length() > 2) {
|
||||
try {
|
||||
groupValue = plugin.getWorldGuardHandler().parseFlagGroupInput(groupFlag, part.substring(2));
|
||||
} catch(InvalidFlagFormat e) {
|
||||
AreaShop.warn("Found wrong group value for flag " + flagName);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(flagSetting == null) {
|
||||
flagSetting = part;
|
||||
} else {
|
||||
flagSetting += " " + part;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(flagSetting != null) {
|
||||
try {
|
||||
setFlag(worldguardRegion, foundFlag, flagSetting);
|
||||
//AreaShop.debug(" Flag " + flagName + " set: " + flagSetting);
|
||||
} catch(InvalidFlagFormat e) {
|
||||
AreaShop.warn("Found wrong value for flag " + flagName);
|
||||
}
|
||||
}
|
||||
if(groupValue != null) {
|
||||
if(groupValue == groupFlag.getDefault()) {
|
||||
worldguardRegion.setFlag(groupFlag, null);
|
||||
//AreaShop.debug(" Group of flag " + flagName + " set to default: " + groupValue);
|
||||
} else {
|
||||
worldguardRegion.setFlag(groupFlag, groupValue);
|
||||
//AreaShop.debug(" Group of flag " + flagName + " set: " + groupValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// Indicate that the regions needs to be saved
|
||||
if(worldGuard.getDescription().getVersion().startsWith("5.")) {
|
||||
plugin.getFileManager().saveIsRequiredForRegionWorld(region.getWorldName());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an RegionAccessSet from an input that specifies player names, player uuids and groups.
|
||||
* @param input Input string defining the access set
|
||||
* @return RegionAccessSet containing the entities parsed from the input
|
||||
*/
|
||||
public RegionAccessSet parseAccessSet(String input) {
|
||||
RegionAccessSet result = new RegionAccessSet();
|
||||
|
||||
String[] inputParts = input.split(", ");
|
||||
for(String access : inputParts) {
|
||||
if(access != null && !access.isEmpty()) {
|
||||
// Check for groups
|
||||
if(access.startsWith("g:")) {
|
||||
if(access.length() > 2) {
|
||||
result.getGroupNames().add(access.substring(2));
|
||||
}
|
||||
} else if(access.startsWith("n:")) {
|
||||
if(access.length() > 2) {
|
||||
result.getPlayerNames().add(access.substring(2));
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
result.getPlayerUniqueIds().add(UUID.fromString(access));
|
||||
} catch(IllegalArgumentException e) {
|
||||
AreaShop.warn("Tried using '" + access + "' as uuid for a region member/owner, is your flagProfiles section correct?");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a WorldGuard region flag.
|
||||
* @param region The WorldGuard region to set
|
||||
* @param flag The flag to set
|
||||
* @param value The value to set the flag to
|
||||
* @param <V> They type of flag to set
|
||||
* @throws InvalidFlagFormat When the value of the flag is wrong
|
||||
*/
|
||||
private <V> void setFlag(ProtectedRegion region, Flag<V> flag, String value) throws InvalidFlagFormat {
|
||||
V current = region.getFlag(flag);
|
||||
V next = plugin.getWorldGuardHandler().parseFlagInput(flag, value);
|
||||
|
||||
if(!Objects.equals(current, next)) {
|
||||
region.setFlag(flag, next);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate the color codes you put in greeting/farewell messages to the weird color codes of WorldGuard.
|
||||
* @param message The message where the color codes should be translated (this message has bukkit color codes)
|
||||
* @return The string with the WorldGuard color codes
|
||||
*/
|
||||
private String translateBukkitToWorldGuardColors(String message) {
|
||||
String result = message;
|
||||
result = result.replace("&c", "&r");
|
||||
result = result.replace("&4", "&R");
|
||||
result = result.replace("&e", "&y");
|
||||
result = result.replace("&6", "&Y");
|
||||
result = result.replace("&a", "&g");
|
||||
result = result.replace("&2", "&G");
|
||||
result = result.replace("&b", "&c");
|
||||
result = result.replace("&3", "&C");
|
||||
result = result.replace("&9", "&b");
|
||||
result = result.replace("&1", "&B");
|
||||
result = result.replace("&d", "&p");
|
||||
result = result.replace("&5", "&P");
|
||||
result = result.replace("&0", "&0");
|
||||
result = result.replace("&8", "&1");
|
||||
result = result.replace("&7", "&2");
|
||||
result = result.replace("&f", "&w");
|
||||
result = result.replace("&r", "&x");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,252 @@
|
||||
package me.wiefferink.areashop.features.signs;
|
||||
|
||||
import com.google.common.base.Objects;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Sign that is connected to a region to display information and interact with the region.
|
||||
*/
|
||||
public class RegionSign {
|
||||
|
||||
private final SignsFeature signsFeature;
|
||||
private final String key;
|
||||
|
||||
public RegionSign(SignsFeature signsFeature, String key) {
|
||||
this.signsFeature = signsFeature;
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the location of this sign.
|
||||
* @return The location of this sign
|
||||
*/
|
||||
public Location getLocation() {
|
||||
return Utils.configToLocation(getRegion().getConfig().getConfigurationSection("general.signs." + key + ".location"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Location string to be used as key in maps.
|
||||
* @return Location string
|
||||
*/
|
||||
public String getStringLocation() {
|
||||
return SignsFeature.locationToString(getLocation());
|
||||
}
|
||||
|
||||
/**
|
||||
* Chunk string to be used as key in maps.
|
||||
* @return Chunk string
|
||||
*/
|
||||
public String getStringChunk() {
|
||||
return SignsFeature.chunkToString(getLocation());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the region this sign is linked to.
|
||||
* @return The region this sign is linked to
|
||||
*/
|
||||
public GeneralRegion getRegion() {
|
||||
return signsFeature.getRegion();
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove this sign from the region.
|
||||
*/
|
||||
public void remove() {
|
||||
getLocation().getBlock().setType(Material.AIR);
|
||||
signsFeature.getSignsRef().remove(getStringLocation());
|
||||
SignsFeature.getAllSigns().remove(getStringLocation());
|
||||
SignsFeature.getSignsByChunk().get(getStringChunk()).remove(this);
|
||||
getRegion().setSetting("general.signs." + key, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the ConfigurationSection defining the sign layout.
|
||||
* @return The sign layout config
|
||||
*/
|
||||
public ConfigurationSection getProfile() {
|
||||
return getRegion().getConfigurationSectionSetting("general.signProfile", "signProfiles", getRegion().getConfig().get("general.signs." + key + ".profile"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the facing of the sign.
|
||||
* @return BlockFace the sign faces, or null if unknown
|
||||
*/
|
||||
public BlockFace getFacing() {
|
||||
try {
|
||||
return BlockFace.valueOf(getRegion().getConfig().getString("general.signs." + key + ".facing"));
|
||||
} catch(NullPointerException | IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the material of the sign
|
||||
* @return Material of the sign, normally {@link Material#WALL_SIGN} or {@link Material#SIGN_POST}, but could be something else or null.
|
||||
*/
|
||||
public Material getMaterial() {
|
||||
try {
|
||||
return Material.valueOf(getRegion().getConfig().getString("general.signs." + key + ".signType"));
|
||||
} catch(NullPointerException | IllegalArgumentException e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update this sign.
|
||||
* @return true if the update was successful, otherwise false
|
||||
*/
|
||||
public boolean update() {
|
||||
// Ignore updates of signs in chunks that are not loaded
|
||||
Location signLocation = getLocation();
|
||||
if(signLocation == null
|
||||
|| signLocation.getWorld() == null
|
||||
|| !signLocation.getWorld().isChunkLoaded(signLocation.getBlockX() >> 4, signLocation.getBlockZ() >> 4)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if(getRegion().isDeleted()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
YamlConfiguration regionConfig = getRegion().getConfig();
|
||||
ConfigurationSection signConfig = getProfile();
|
||||
Block block = signLocation.getBlock();
|
||||
if(signConfig == null || !signConfig.isSet(getRegion().getState().getValue())) {
|
||||
block.setType(Material.AIR);
|
||||
return true;
|
||||
}
|
||||
|
||||
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue());
|
||||
|
||||
// Get the lines
|
||||
String[] signLines = new String[4];
|
||||
boolean signEmpty = true;
|
||||
for(int i = 0; i < 4; i++) {
|
||||
signLines[i] = stateConfig.getString("line" + (i + 1));
|
||||
signEmpty &= (signLines[i] == null || signLines[i].isEmpty());
|
||||
}
|
||||
if(signEmpty) {
|
||||
block.setType(Material.AIR);
|
||||
return true;
|
||||
}
|
||||
|
||||
Sign signState = null;
|
||||
// Place the sign back (with proper rotation and type) after it has been hidden or (indirectly) destroyed
|
||||
if(block.getType() != Material.WALL_SIGN && block.getType() != Material.SIGN_POST) {
|
||||
Material signType = getMaterial();
|
||||
if(signType != Material.WALL_SIGN && signType != Material.SIGN_POST) {
|
||||
AreaShop.debug("Setting sign", key, "of region", getRegion().getName(), "failed, could not set sign block back");
|
||||
return false;
|
||||
}
|
||||
block.setType(signType);
|
||||
signState = (Sign)block.getState();
|
||||
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
|
||||
BlockFace signFace = getFacing();
|
||||
if(signFace != null) {
|
||||
signData.setFacingDirection(signFace);
|
||||
signState.setData(signData);
|
||||
}
|
||||
}
|
||||
if(signState == null) {
|
||||
signState = (Sign)block.getState();
|
||||
}
|
||||
|
||||
// Save current rotation and type
|
||||
org.bukkit.material.Sign signData = (org.bukkit.material.Sign)signState.getData();
|
||||
if(!regionConfig.isString("general.signs." + key + ".signType")) {
|
||||
getRegion().setSetting("general.signs." + key + ".signType", signState.getType().toString());
|
||||
}
|
||||
if(!regionConfig.isString("general.signs." + key + ".facing")) {
|
||||
getRegion().setSetting("general.signs." + key + ".facing", signData.getFacing().toString());
|
||||
}
|
||||
|
||||
// Apply replacements and color and then set it on the sign
|
||||
for(int i = 0; i < signLines.length; i++) {
|
||||
if(signLines[i] == null) {
|
||||
signState.setLine(i, "");
|
||||
continue;
|
||||
}
|
||||
signLines[i] = Message.fromString(signLines[i]).replacements(getRegion()).getSingle();
|
||||
signLines[i] = Utils.applyColors(signLines[i]);
|
||||
signState.setLine(i, signLines[i]);
|
||||
}
|
||||
signState.update();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the sign needs to update periodically.
|
||||
* @return true if it needs periodic updates, otherwise false
|
||||
*/
|
||||
public boolean needsPeriodicUpdate() {
|
||||
ConfigurationSection signConfig = getProfile();
|
||||
if(signConfig == null || !signConfig.isSet(getRegion().getState().getValue().toLowerCase())) {
|
||||
return false;
|
||||
}
|
||||
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue().toLowerCase());
|
||||
// Check the lines for the timeleft tag
|
||||
for(int i = 1; i <= 4; i++) {
|
||||
String line = stateConfig.getString("line" + i);
|
||||
if(line != null && !line.isEmpty() && line.contains(Message.VARIABLE_START + AreaShop.tagTimeLeft + Message.VARIABLE_END)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run commands when a player clicks a sign.
|
||||
* @param clicker The player that clicked the sign
|
||||
* @param clickType The type of clicking
|
||||
* @return true if the commands ran successfully, false if any of them failed
|
||||
*/
|
||||
public boolean runSignCommands(Player clicker, GeneralRegion.ClickType clickType) {
|
||||
ConfigurationSection signConfig = getProfile();
|
||||
if(signConfig == null) {
|
||||
return false;
|
||||
}
|
||||
ConfigurationSection stateConfig = signConfig.getConfigurationSection(getRegion().getState().getValue().toLowerCase());
|
||||
|
||||
// Run player commands if specified
|
||||
List<String> playerCommands = new ArrayList<>();
|
||||
for(String command : stateConfig.getStringList(clickType.getValue() + "Player")) {
|
||||
// TODO move variable checking code to InteractiveMessenger?
|
||||
playerCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
|
||||
}
|
||||
getRegion().runCommands(clicker, playerCommands);
|
||||
|
||||
// Run console commands if specified
|
||||
List<String> consoleCommands = new ArrayList<>();
|
||||
for(String command : stateConfig.getStringList(clickType.getValue() + "Console")) {
|
||||
consoleCommands.add(command.replace(Message.VARIABLE_START + AreaShop.tagClicker + Message.VARIABLE_END, clicker.getName()));
|
||||
}
|
||||
getRegion().runCommands(Bukkit.getConsoleSender(), consoleCommands);
|
||||
|
||||
return !playerCommands.isEmpty() || !consoleCommands.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object object) {
|
||||
return object instanceof RegionSign && ((RegionSign)object).getRegion().equals(this.getRegion()) && ((RegionSign)object).key.equals(this.key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hashCode(key, getRegion().getName());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,600 @@
|
||||
package me.wiefferink.areashop.features.signs;
|
||||
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.events.notify.UpdateRegionEvent;
|
||||
import me.wiefferink.areashop.features.RegionFeature;
|
||||
import me.wiefferink.areashop.managers.FileManager;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.bukkitdo.Do;
|
||||
import org.bukkit.Chunk;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.block.SignChangeEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.world.ChunkLoadEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class SignsFeature extends RegionFeature {
|
||||
|
||||
private static final Map<String, RegionSign> allSigns = Collections.synchronizedMap(new HashMap<>());
|
||||
private static final Map<String, List<RegionSign>> signsByChunk = Collections.synchronizedMap(new HashMap<>());
|
||||
|
||||
private Map<String, RegionSign> signs;
|
||||
|
||||
public SignsFeature() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param region The region to bind to
|
||||
*/
|
||||
public SignsFeature(GeneralRegion region) {
|
||||
setRegion(region);
|
||||
signs = new HashMap<>();
|
||||
// Setup current signs
|
||||
ConfigurationSection signSection = region.getConfig().getConfigurationSection("general.signs");
|
||||
if(signSection != null) {
|
||||
for(String signKey : signSection.getKeys(false)) {
|
||||
RegionSign sign = new RegionSign(this, signKey);
|
||||
Location location = sign.getLocation();
|
||||
if(location == null) {
|
||||
AreaShop.warn("Sign with key " + signKey + " of region " + region.getName() + " does not have a proper location");
|
||||
continue;
|
||||
}
|
||||
signs.put(sign.getStringLocation(), sign);
|
||||
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
|
||||
.add(sign);
|
||||
}
|
||||
allSigns.putAll(signs);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
// Deregister signs from the registry
|
||||
if(signs != null) {
|
||||
for(Map.Entry<String, RegionSign> entry : signs.entrySet()) {
|
||||
allSigns.remove(entry.getKey());
|
||||
signsByChunk.get(entry.getValue().getStringChunk()).remove(entry.getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onSignBreak(BlockBreakEvent event) {
|
||||
if(event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
Block block = event.getBlock();
|
||||
// Check if it is a sign
|
||||
if(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST) {
|
||||
// Check if the rent sign is really the same as a saved rent
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
|
||||
if(regionSign == null) {
|
||||
return;
|
||||
}
|
||||
// Remove the sign of the rental region if the player has permission
|
||||
if(event.getPlayer().hasPermission("areashop.delsign")) {
|
||||
regionSign.remove();
|
||||
plugin.message(event.getPlayer(), "delsign-success", regionSign.getRegion());
|
||||
} else { // Cancel the breaking of the sign
|
||||
event.setCancelled(true);
|
||||
plugin.message(event.getPlayer(), "delsign-noPermission", regionSign.getRegion());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onIndirectSignBreak(BlockPhysicsEvent event) {
|
||||
if(event.getBlock().getType() == Material.SIGN_POST || event.getBlock().getType() == Material.WALL_SIGN) {
|
||||
// Check if the rent sign is really the same as a saved rent
|
||||
if(SignsFeature.getSignByLocation(event.getBlock().getLocation()) != null) {
|
||||
// Cancel the sign breaking, will create a floating sign but at least it is not disconnected/gone
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onSignClick(PlayerInteractEvent event) {
|
||||
if(event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
Block block = event.getClickedBlock();
|
||||
// Check for clicking a sign and rightclicking
|
||||
if((event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.LEFT_CLICK_BLOCK)
|
||||
&& (block.getType() == Material.SIGN_POST || block.getType() == Material.WALL_SIGN)) {
|
||||
// Check if the rent sign is really the same as a saved rent
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
|
||||
if(regionSign == null) {
|
||||
return;
|
||||
}
|
||||
Player player = event.getPlayer();
|
||||
if(plugin.getSignlinkerManager().isInSignLinkMode(player)) {
|
||||
return;
|
||||
}
|
||||
// Get the clicktype
|
||||
GeneralRegion.ClickType clickType = null;
|
||||
if(player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||
clickType = GeneralRegion.ClickType.SHIFTLEFTCLICK;
|
||||
} else if(!player.isSneaking() && event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||
clickType = GeneralRegion.ClickType.LEFTCLICK;
|
||||
} else if(player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
clickType = GeneralRegion.ClickType.SHIFTRIGHTCLICK;
|
||||
} else if(!player.isSneaking() && event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
clickType = GeneralRegion.ClickType.RIGHTCLICK;
|
||||
}
|
||||
// Run the commands
|
||||
boolean ran = regionSign.runSignCommands(player, clickType);
|
||||
// Only cancel event if at least one command has been executed
|
||||
event.setCancelled(ran);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onSignChange(SignChangeEvent event) {
|
||||
if(event.isCancelled()) {
|
||||
return;
|
||||
}
|
||||
Player player = event.getPlayer();
|
||||
if(!plugin.isReady()) {
|
||||
plugin.message(player, "general-notReady");
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if the sign is meant for this plugin
|
||||
if(event.getLine(0).contains(plugin.getConfig().getString("signTags.rent"))) {
|
||||
if(!player.hasPermission("areashop.createrent") && !player.hasPermission("areashop.createrent.member") && !player.hasPermission("areashop.createrent.owner")) {
|
||||
plugin.message(player, "setup-noPermissionRent");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the other lines
|
||||
String secondLine = event.getLine(1);
|
||||
String thirdLine = event.getLine(2);
|
||||
String fourthLine = event.getLine(3);
|
||||
|
||||
// Get the regionManager for accessing regions
|
||||
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
|
||||
|
||||
// If the secondLine does not contain a name try to find the region by location
|
||||
if(secondLine == null || secondLine.length() == 0) {
|
||||
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
|
||||
if(regions != null) {
|
||||
boolean first = true;
|
||||
ProtectedRegion candidate = null;
|
||||
for(ProtectedRegion pr : regions) {
|
||||
if(first) {
|
||||
candidate = pr;
|
||||
first = false;
|
||||
} else {
|
||||
if(pr.getPriority() > candidate.getPriority()) {
|
||||
candidate = pr;
|
||||
} else if(pr.getPriority() < candidate.getPriority()) {
|
||||
// Already got the correct one
|
||||
} else if(pr.getParent() != null && pr.getParent().equals(candidate)) {
|
||||
candidate = pr;
|
||||
} else if(candidate.getParent() != null && candidate.getParent().equals(pr)) {
|
||||
// Already got the correct one
|
||||
} else {
|
||||
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(candidate != null) {
|
||||
secondLine = candidate.getId();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean priceSet = fourthLine != null && fourthLine.length() != 0;
|
||||
boolean durationSet = thirdLine != null && thirdLine.length() != 0;
|
||||
// check if all the lines are correct
|
||||
if(secondLine == null || secondLine.length() == 0) {
|
||||
plugin.message(player, "setup-noRegion");
|
||||
return;
|
||||
}
|
||||
ProtectedRegion region = regionManager.getRegion(secondLine);
|
||||
if(region == null) {
|
||||
plugin.message(player, "cmd-noRegion", secondLine);
|
||||
return;
|
||||
}
|
||||
|
||||
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, regionManager.getRegion(secondLine), event.getPlayer().getWorld(), GeneralRegion.RegionType.RENT);
|
||||
if(addResult == FileManager.AddResult.BLACKLISTED) {
|
||||
plugin.message(player, "setup-blacklisted", secondLine);
|
||||
} else if(addResult == FileManager.AddResult.ALREADYADDED) {
|
||||
plugin.message(player, "setup-alreadyRentSign");
|
||||
} else if(addResult == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
|
||||
plugin.message(player, "setup-alreadyOtherWorld");
|
||||
} else if(addResult == FileManager.AddResult.NOPERMISSION) {
|
||||
plugin.message(player, "setup-noPermission", secondLine);
|
||||
} else if(thirdLine != null && thirdLine.length() != 0 && !Utils.checkTimeFormat(thirdLine)) {
|
||||
plugin.message(player, "setup-wrongDuration");
|
||||
} else {
|
||||
double price = 0.0;
|
||||
if(priceSet) {
|
||||
// Check the fourth line
|
||||
try {
|
||||
price = Double.parseDouble(fourthLine);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(player, "setup-wrongPrice");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Add rent to the FileManager
|
||||
final RentRegion rent = new RentRegion(secondLine, event.getPlayer().getWorld());
|
||||
boolean isMember = plugin.getWorldGuardHandler().containsMember(rent.getRegion(), player.getUniqueId());
|
||||
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(rent.getRegion(), player.getUniqueId());
|
||||
boolean landlord = (!player.hasPermission("areashop.createrent")
|
||||
&& ((player.hasPermission("areashop.createrent.owner") && isOwner)
|
||||
|| (player.hasPermission("areashop.createrent.member") && isMember)));
|
||||
|
||||
if(landlord) {
|
||||
rent.setLandlord(player.getUniqueId(), player.getName());
|
||||
}
|
||||
if(priceSet) {
|
||||
rent.setPrice(price);
|
||||
}
|
||||
if(durationSet) {
|
||||
rent.setDuration(thirdLine);
|
||||
}
|
||||
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
|
||||
rent.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
|
||||
|
||||
// Run commands
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
|
||||
plugin.getFileManager().addRent(rent);
|
||||
rent.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
plugin.message(player, "setup-rentSuccess", rent);
|
||||
// Update the region after the event has written its lines
|
||||
Do.sync(rent::update);
|
||||
// Run commands
|
||||
rent.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
}
|
||||
} else if(event.getLine(0).contains(plugin.getConfig().getString("signTags.buy"))) {
|
||||
// Check for permission
|
||||
if(!player.hasPermission("areashop.createbuy") && !player.hasPermission("areashop.createbuy.member") && !player.hasPermission("areashop.createbuy.owner")) {
|
||||
plugin.message(player, "setup-noPermissionBuy");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the other lines
|
||||
String secondLine = event.getLine(1);
|
||||
String thirdLine = event.getLine(2);
|
||||
|
||||
// Get the regionManager for accessing regions
|
||||
RegionManager regionManager = plugin.getRegionManager(event.getPlayer().getWorld());
|
||||
|
||||
// If the secondLine does not contain a name try to find the region by location
|
||||
if(secondLine == null || secondLine.length() == 0) {
|
||||
Set<ProtectedRegion> regions = plugin.getWorldGuardHandler().getApplicableRegionsSet(event.getBlock().getLocation());
|
||||
if(regions != null) {
|
||||
boolean first = true;
|
||||
ProtectedRegion candidate = null;
|
||||
for(ProtectedRegion pr : regions) {
|
||||
if(first) {
|
||||
candidate = pr;
|
||||
first = false;
|
||||
} else {
|
||||
if(pr.getPriority() > candidate.getPriority()) {
|
||||
candidate = pr;
|
||||
} else if(pr.getPriority() < candidate.getPriority()) {
|
||||
// Already got the correct one
|
||||
} else if(pr.getParent() != null && pr.getParent().equals(candidate)) {
|
||||
candidate = pr;
|
||||
} else if(candidate.getParent() != null && candidate.getParent().equals(pr)) {
|
||||
// Already got the correct one
|
||||
} else {
|
||||
plugin.message(player, "setup-couldNotDetect", candidate.getId(), pr.getId());
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(candidate != null) {
|
||||
secondLine = candidate.getId();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
boolean priceSet = thirdLine != null && thirdLine.length() != 0;
|
||||
// Check if all the lines are correct
|
||||
if(secondLine == null || secondLine.length() == 0) {
|
||||
plugin.message(player, "setup-noRegion");
|
||||
return;
|
||||
}
|
||||
ProtectedRegion region = regionManager.getRegion(secondLine);
|
||||
if(region == null) {
|
||||
plugin.message(player, "cmd-noRegion", secondLine);
|
||||
return;
|
||||
}
|
||||
FileManager.AddResult addResult = plugin.getFileManager().checkRegionAdd(player, region, event.getPlayer().getWorld(), GeneralRegion.RegionType.BUY);
|
||||
if(addResult == FileManager.AddResult.BLACKLISTED) {
|
||||
plugin.message(player, "setup-blacklisted", secondLine);
|
||||
} else if(addResult == FileManager.AddResult.ALREADYADDED) {
|
||||
plugin.message(player, "setup-alreadyRentSign");
|
||||
} else if(addResult == FileManager.AddResult.ALREADYADDEDOTHERWORLD) {
|
||||
plugin.message(player, "setup-alreadyOtherWorld");
|
||||
} else if(addResult == FileManager.AddResult.NOPERMISSION) {
|
||||
plugin.message(player, "setup-noPermission", secondLine);
|
||||
} else {
|
||||
double price = 0.0;
|
||||
if(priceSet) {
|
||||
// Check the fourth line
|
||||
try {
|
||||
price = Double.parseDouble(thirdLine);
|
||||
} catch(NumberFormatException e) {
|
||||
plugin.message(player, "setup-wrongPrice");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Add buy to the FileManager
|
||||
final BuyRegion buy = new BuyRegion(secondLine, event.getPlayer().getWorld());
|
||||
boolean isMember = plugin.getWorldGuardHandler().containsMember(buy.getRegion(), player.getUniqueId());
|
||||
boolean isOwner = plugin.getWorldGuardHandler().containsOwner(buy.getRegion(), player.getUniqueId());
|
||||
boolean landlord = (!player.hasPermission("areashop.createbuy")
|
||||
&& ((player.hasPermission("areashop.createbuy.owner") && isOwner)
|
||||
|| (player.hasPermission("areashop.createbuy.member") && isMember)));
|
||||
|
||||
if(landlord) {
|
||||
buy.setLandlord(player.getUniqueId(), player.getName());
|
||||
}
|
||||
if(priceSet) {
|
||||
buy.setPrice(price);
|
||||
}
|
||||
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
|
||||
buy.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, true);
|
||||
|
||||
plugin.getFileManager().addBuy(buy);
|
||||
buy.handleSchematicEvent(GeneralRegion.RegionEvent.CREATED);
|
||||
plugin.message(player, "setup-buySuccess", buy);
|
||||
// Update the region after the event has written its lines
|
||||
Do.sync(buy::update);
|
||||
|
||||
// Run commands
|
||||
buy.runEventCommands(GeneralRegion.RegionEvent.CREATED, false);
|
||||
}
|
||||
} else if(event.getLine(0).contains(plugin.getConfig().getString("signTags.add"))) {
|
||||
// Check for permission
|
||||
if(!player.hasPermission("areashop.addsign")) {
|
||||
plugin.message(player, "addsign-noPermission");
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the other lines
|
||||
String secondLine = event.getLine(1);
|
||||
String thirdLine = event.getLine(2);
|
||||
|
||||
GeneralRegion region;
|
||||
if(secondLine != null && secondLine.length() != 0) {
|
||||
// Get region by secondLine of the sign
|
||||
region = plugin.getFileManager().getRegion(secondLine);
|
||||
if(region == null) {
|
||||
plugin.message(player, "addSign-notRegistered", secondLine);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
// Get region by sign position
|
||||
List<GeneralRegion> regions = Utils.getImportantRegions(event.getBlock().getLocation());
|
||||
if(regions.isEmpty()) {
|
||||
plugin.message(player, "addsign-noRegions");
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
plugin.message(player, "addsign-couldNotDetectSign", regions.get(0).getName(), regions.get(1).getName());
|
||||
return;
|
||||
}
|
||||
region = regions.get(0);
|
||||
}
|
||||
org.bukkit.material.Sign sign = (org.bukkit.material.Sign)event.getBlock().getState().getData();
|
||||
if(thirdLine == null || thirdLine.length() == 0) {
|
||||
region.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), null);
|
||||
plugin.message(player, "addsign-success", region);
|
||||
} else {
|
||||
region.getSignsFeature().addSign(event.getBlock().getLocation(), event.getBlock().getType(), sign.getFacing(), thirdLine);
|
||||
plugin.message(player, "addsign-successProfile", thirdLine, region);
|
||||
}
|
||||
|
||||
// Update the region later because this event will do it first
|
||||
Do.sync(region::update);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a location to a string to use as map key.
|
||||
* @param location The location to get the key for
|
||||
* @return A string to use in a map for a location
|
||||
*/
|
||||
public static String locationToString(Location location) {
|
||||
return location.getWorld().getName() + ";" + location.getBlockX() + ";" + location.getBlockY() + ";" + location.getBlockZ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a chunk to a string to use as map key.
|
||||
* @param location The location to get the key for
|
||||
* @return A string to use in a map for a chunk
|
||||
*/
|
||||
public static String chunkToString(Location location) {
|
||||
return location.getWorld().getName() + ";" + (location.getBlockX() >> 4) + ";" + (location.getBlockZ() >> 4);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a chunk to a string to use as map key.
|
||||
* Use a Location argument to prevent chunk loading!
|
||||
* @param chunk The location to get the key for
|
||||
* @return A string to use in a map for a chunk
|
||||
*/
|
||||
public static String chunkToString(Chunk chunk) {
|
||||
return chunk.getWorld().getName() + ";" + chunk.getX() + ";" + chunk.getZ();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a sign by a location.
|
||||
* @param location The location to get the sign for
|
||||
* @return The RegionSign that is at the location, or null if none
|
||||
*/
|
||||
public static RegionSign getSignByLocation(Location location) {
|
||||
return allSigns.get(locationToString(location));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the map with all signs.
|
||||
* @return Map with all signs: locationString -> RegionSign
|
||||
*/
|
||||
public static Map<String, RegionSign> getAllSigns() {
|
||||
return allSigns;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the map with signs by chunk.
|
||||
* @return Map with signs by chunk: chunkString -> List<RegionSign>
|
||||
*/
|
||||
public static Map<String, List<RegionSign>> getSignsByChunk() {
|
||||
return signsByChunk;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void regionUpdate(UpdateRegionEvent event) {
|
||||
event.getRegion().getSignsFeature().update();
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onChunkLoad(ChunkLoadEvent event) {
|
||||
List<RegionSign> chunkSigns = signsByChunk.get(chunkToString(event.getChunk()));
|
||||
if(chunkSigns == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Do.forAll(chunkSigns, RegionSign::update);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update all signs connected to this region.
|
||||
* @return true if all signs are updated correctly, false if one or more updates failed
|
||||
*/
|
||||
public boolean update() {
|
||||
boolean result = true;
|
||||
for(RegionSign sign : signs.values()) {
|
||||
result = result & sign.update();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if any of the signs need periodic updating.
|
||||
* @return true if one or more of the signs need periodic updating, otherwise false
|
||||
*/
|
||||
public boolean needsPeriodicUpdate() {
|
||||
boolean result = false;
|
||||
for(RegionSign sign : signs.values()) {
|
||||
result = result | sign.needsPeriodicUpdate();
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the signs of this region.
|
||||
* @return List of signs
|
||||
*/
|
||||
public List<RegionSign> getSigns() {
|
||||
return Collections.unmodifiableList(new ArrayList<>(signs.values()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the signs of this region.
|
||||
* @return Map with signs: locationString -> RegionSign
|
||||
*/
|
||||
Map<String, RegionSign> getSignsRef() {
|
||||
return signs;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list with all sign locations.
|
||||
* @return A List with all sign locations
|
||||
*/
|
||||
public List<Location> getSignLocations() {
|
||||
List<Location> result = new ArrayList<>();
|
||||
for(RegionSign sign : signs.values()) {
|
||||
result.add(sign.getLocation());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a sign to this region.
|
||||
* @param location The location of the sign
|
||||
* @param signType The type of the sign (WALL_SIGN or SIGN_POST)
|
||||
* @param facing The orientation of the sign
|
||||
* @param profile The profile to use with this sign (null for default)
|
||||
*/
|
||||
public void addSign(Location location, Material signType, BlockFace facing, String profile) {
|
||||
int i = 0;
|
||||
while(getRegion().getConfig().isSet("general.signs." + i)) {
|
||||
i++;
|
||||
}
|
||||
String signPath = "general.signs." + i + ".";
|
||||
getRegion().setSetting(signPath + "location", Utils.locationToConfig(location));
|
||||
getRegion().setSetting(signPath + "facing", facing != null ? facing.name() : null);
|
||||
getRegion().setSetting(signPath + "signType", signType != null ? signType.name() : null);
|
||||
if(profile != null && profile.length() != 0) {
|
||||
getRegion().setSetting(signPath + "profile", profile);
|
||||
}
|
||||
// Add to the map
|
||||
RegionSign sign = new RegionSign(this, i + "");
|
||||
signs.put(sign.getStringLocation(), sign);
|
||||
allSigns.put(sign.getStringLocation(), sign);
|
||||
signsByChunk.computeIfAbsent(sign.getStringChunk(), key -> new ArrayList<>())
|
||||
.add(sign);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if there is a sign from this region at the specified location.
|
||||
* @param location Location to check
|
||||
* @return true if this region has a sign at the location, otherwise false
|
||||
*/
|
||||
public boolean isSignOfRegion(Location location) {
|
||||
Set<String> signs;
|
||||
if(getRegion().getConfig().getConfigurationSection("general.signs") == null) {
|
||||
return false;
|
||||
}
|
||||
signs = getRegion().getConfig().getConfigurationSection("general.signs").getKeys(false);
|
||||
for(String sign : signs) {
|
||||
Location signLocation = Utils.configToLocation(getRegion().getConfig().getConfigurationSection("general.signs." + sign + ".location"));
|
||||
if(signLocation != null
|
||||
&& signLocation.getWorld().equals(location.getWorld())
|
||||
&& signLocation.getBlockX() == location.getBlockX()
|
||||
&& signLocation.getBlockY() == location.getBlockY()
|
||||
&& signLocation.getBlockZ() == location.getBlockZ()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,769 @@
|
||||
/*
|
||||
* Copyright 2011-2013 Tyler Blair. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification, are
|
||||
* permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
||||
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
|
||||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* The views and conclusions contained in the software and documentation are those of the
|
||||
* authors and contributors and should not be interpreted as representing official policies,
|
||||
* either expressed or implied, of anybody else.
|
||||
*/
|
||||
|
||||
package me.wiefferink.areashop.lib;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.configuration.InvalidConfigurationException;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.net.Proxy;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.net.URLEncoder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
import java.util.zip.GZIPOutputStream;
|
||||
|
||||
public class Metrics {
|
||||
|
||||
/**
|
||||
* The current revision number.
|
||||
*/
|
||||
private static final int REVISION = 7;
|
||||
|
||||
/**
|
||||
* The base url of the metrics domain.
|
||||
*/
|
||||
private static final String BASE_URL = "http://report.mcstats.org";
|
||||
|
||||
/**
|
||||
* The url used to report a server's status.
|
||||
*/
|
||||
private static final String REPORT_URL = "/plugin/%s";
|
||||
|
||||
/**
|
||||
* Interval of time to ping (in minutes).
|
||||
*/
|
||||
private static final int PING_INTERVAL = 15;
|
||||
|
||||
/**
|
||||
* The plugin this metrics submits for.
|
||||
*/
|
||||
private final Plugin plugin;
|
||||
|
||||
/**
|
||||
* All of the custom graphs to submit to metrics.
|
||||
*/
|
||||
private final Set<Graph> graphs = Collections.synchronizedSet(new HashSet<Graph>());
|
||||
|
||||
/**
|
||||
* The plugin configuration file.
|
||||
*/
|
||||
private final YamlConfiguration configuration;
|
||||
|
||||
/**
|
||||
* The plugin configuration file.
|
||||
*/
|
||||
private final File configurationFile;
|
||||
|
||||
/**
|
||||
* Unique server id.
|
||||
*/
|
||||
private final String guid;
|
||||
|
||||
/**
|
||||
* Debug mode.
|
||||
*/
|
||||
private final boolean debug;
|
||||
|
||||
/**
|
||||
* Lock for synchronization.
|
||||
*/
|
||||
private final Object optOutLock = new Object();
|
||||
|
||||
/**
|
||||
* The scheduled task.
|
||||
*/
|
||||
private volatile BukkitTask task = null;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param plugin The plugin to report stats for
|
||||
* @throws IOException When the plugin or configuration is wrong
|
||||
*/
|
||||
public Metrics(final Plugin plugin) throws IOException {
|
||||
if(plugin == null) {
|
||||
throw new IllegalArgumentException("Plugin cannot be null");
|
||||
}
|
||||
|
||||
this.plugin = plugin;
|
||||
|
||||
// load the config
|
||||
configurationFile = getConfigFile();
|
||||
configuration = YamlConfiguration.loadConfiguration(configurationFile);
|
||||
|
||||
// add some defaults
|
||||
configuration.addDefault("opt-out", false);
|
||||
configuration.addDefault("guid", UUID.randomUUID().toString());
|
||||
configuration.addDefault("debug", false);
|
||||
|
||||
// Do we need to create the file?
|
||||
if(configuration.get("guid", null) == null) {
|
||||
configuration.options().header("http://mcstats.org").copyDefaults(true);
|
||||
configuration.save(configurationFile);
|
||||
}
|
||||
|
||||
// Load the guid then
|
||||
guid = configuration.getString("guid");
|
||||
debug = configuration.getBoolean("debug", false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct and create a Graph that can be used to separate specific plotters to their own graphs on the metrics
|
||||
* website. Plotters can be added to the graph object returned.
|
||||
* @param name The name of the graph
|
||||
* @return Graph object created. Will never return NULL under normal circumstances unless bad parameters are given
|
||||
*/
|
||||
public Graph createGraph(final String name) {
|
||||
if(name == null) {
|
||||
throw new IllegalArgumentException("Graph name cannot be null");
|
||||
}
|
||||
|
||||
// Construct the graph object
|
||||
final Graph graph = new Graph(name);
|
||||
|
||||
// Now we can add our graph
|
||||
graphs.add(graph);
|
||||
|
||||
// and return back
|
||||
return graph;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a Graph object to BukkitMetrics that represents data for the plugin that should be sent to the backend.
|
||||
* @param graph The name of the graph
|
||||
*/
|
||||
public void addGraph(final Graph graph) {
|
||||
if(graph == null) {
|
||||
throw new IllegalArgumentException("Graph cannot be null");
|
||||
}
|
||||
|
||||
graphs.add(graph);
|
||||
}
|
||||
|
||||
/**
|
||||
* Start measuring statistics. This will immediately create an async repeating task as the plugin and send the
|
||||
* initial data to the metrics backend, and then after that it will post in increments of PING_INTERVAL * 1200
|
||||
* ticks.
|
||||
* @return True if statistics measuring is running, otherwise false.
|
||||
*/
|
||||
public boolean start() {
|
||||
synchronized(optOutLock) {
|
||||
// Did we opt out?
|
||||
if(isOptOut()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Is metrics already running?
|
||||
if(task != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Begin hitting the server with glorious data
|
||||
task = plugin.getServer().getScheduler().runTaskTimerAsynchronously(plugin, new Runnable() {
|
||||
|
||||
private boolean firstPost = true;
|
||||
|
||||
public void run() {
|
||||
try {
|
||||
// This has to be synchronized or it can collide with the disable method.
|
||||
synchronized(optOutLock) {
|
||||
// Disable Task, if it is running and the server owner decided to opt-out
|
||||
if(isOptOut() && task != null) {
|
||||
task.cancel();
|
||||
task = null;
|
||||
// Tell all plotters to stop gathering information.
|
||||
for(Graph graph : graphs) {
|
||||
graph.onOptOut();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// We use the inverse of firstPost because if it is the first time we are posting,
|
||||
// it is not a interval ping, so it evaluates to FALSE
|
||||
// Each time thereafter it will evaluate to TRUE, i.e PING!
|
||||
postPlugin(!firstPost);
|
||||
|
||||
// After the first post we set firstPost to false
|
||||
// Each post thereafter will be a ping
|
||||
firstPost = false;
|
||||
} catch(IOException e) {
|
||||
if(debug) {
|
||||
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 0, PING_INTERVAL * 1200);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* If the server owner denied plugin metrics.
|
||||
* @return true if metrics should be opted out of it
|
||||
*/
|
||||
public boolean isOptOut() {
|
||||
synchronized(optOutLock) {
|
||||
try {
|
||||
// Reload the metrics file
|
||||
configuration.load(getConfigFile());
|
||||
} catch(IOException ex) {
|
||||
if(debug) {
|
||||
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
|
||||
}
|
||||
return true;
|
||||
} catch(InvalidConfigurationException ex) {
|
||||
if(debug) {
|
||||
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return configuration.getBoolean("opt-out", false);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Enables metrics for the server by setting "opt-out" to false in the config file and starting the metrics task.
|
||||
* @throws IOException when saving the config file fails
|
||||
*/
|
||||
public void enable() throws IOException {
|
||||
// This has to be synchronized or it can collide with the check in the task.
|
||||
synchronized(optOutLock) {
|
||||
// Check if the server owner has already set opt-out, if not, set it.
|
||||
if(isOptOut()) {
|
||||
configuration.set("opt-out", false);
|
||||
configuration.save(configurationFile);
|
||||
}
|
||||
|
||||
// Enable Task, if it is not running
|
||||
if(task == null) {
|
||||
start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disables metrics for the server by setting "opt-out" to true in the config file and canceling the metrics task.
|
||||
* @throws IOException when saving the config file fails
|
||||
*/
|
||||
public void disable() throws IOException {
|
||||
// This has to be synchronized or it can collide with the check in the task.
|
||||
synchronized(optOutLock) {
|
||||
// Check if the server owner has already set opt-out, if not, set it.
|
||||
if(!isOptOut()) {
|
||||
configuration.set("opt-out", true);
|
||||
configuration.save(configurationFile);
|
||||
}
|
||||
|
||||
// Disable Task, if it is running
|
||||
if(task != null) {
|
||||
task.cancel();
|
||||
task = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the File object of the config file that should be used to store data such as the GUID and opt-out status.
|
||||
* @return the File object for the config file
|
||||
*/
|
||||
public File getConfigFile() {
|
||||
// I believe the easiest way to get the base folder (e.g craftbukkit set via -P) for plugins to use
|
||||
// is to abuse the plugin object we already have
|
||||
// plugin.getDataFolder() => base/plugins/PluginA/
|
||||
// pluginsFolder => base/plugins/
|
||||
// The base is not necessarily relative to the startup directory.
|
||||
File pluginsFolder = plugin.getDataFolder().getParentFile();
|
||||
|
||||
// return => base/plugins/PluginMetrics/config.yml
|
||||
return new File(new File(pluginsFolder, "PluginMetrics"), "config.yml");
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the online player (backwards compatibility).
|
||||
* @return online player amount
|
||||
*/
|
||||
private int getOnlinePlayers() {
|
||||
try {
|
||||
Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers");
|
||||
if(onlinePlayerMethod.getReturnType().equals(Collection.class)) {
|
||||
return ((Collection<?>)onlinePlayerMethod.invoke(Bukkit.getServer())).size();
|
||||
} else {
|
||||
return ((Player[])onlinePlayerMethod.invoke(Bukkit.getServer())).length;
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
if(debug) {
|
||||
Bukkit.getLogger().log(Level.INFO, "[Metrics] " + ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generic method that posts a plugin to the metrics website.
|
||||
*/
|
||||
private void postPlugin(final boolean isPing) throws IOException {
|
||||
// Server software specific section
|
||||
PluginDescriptionFile description = plugin.getDescription();
|
||||
String pluginName = description.getName();
|
||||
boolean onlineMode = Bukkit.getServer().getOnlineMode(); // TRUE if online mode is enabled
|
||||
String pluginVersion = description.getVersion();
|
||||
String serverVersion = Bukkit.getVersion();
|
||||
int playersOnline = this.getOnlinePlayers();
|
||||
|
||||
// END server software specific section -- all code below does not use any code outside of this class / Java
|
||||
|
||||
// Construct the post data
|
||||
StringBuilder json = new StringBuilder(1024);
|
||||
json.append('{');
|
||||
|
||||
// The plugin's description file containg all of the plugin data such as name, version, author, etc
|
||||
appendJsonPair(json, "guid", guid);
|
||||
appendJsonPair(json, "plugin_version", pluginVersion);
|
||||
appendJsonPair(json, "server_version", serverVersion);
|
||||
appendJsonPair(json, "players_online", Integer.toString(playersOnline));
|
||||
|
||||
// New data as of R6
|
||||
String osname = System.getProperty("os.name");
|
||||
String osarch = System.getProperty("os.arch");
|
||||
String osversion = System.getProperty("os.version");
|
||||
String javaVersion = System.getProperty("java.version");
|
||||
int coreCount = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
// normalize os arch .. amd64 -> x86_64
|
||||
if(osarch.equals("amd64")) {
|
||||
osarch = "x86_64";
|
||||
}
|
||||
|
||||
appendJsonPair(json, "osname", osname);
|
||||
appendJsonPair(json, "osarch", osarch);
|
||||
appendJsonPair(json, "osversion", osversion);
|
||||
appendJsonPair(json, "cores", Integer.toString(coreCount));
|
||||
appendJsonPair(json, "auth_mode", onlineMode ? "1" : "0");
|
||||
appendJsonPair(json, "java_version", javaVersion);
|
||||
|
||||
// If we're pinging, append it
|
||||
if(isPing) {
|
||||
appendJsonPair(json, "ping", "1");
|
||||
}
|
||||
|
||||
if(graphs.size() > 0) {
|
||||
synchronized(graphs) {
|
||||
json.append(',');
|
||||
json.append('"');
|
||||
json.append("graphs");
|
||||
json.append('"');
|
||||
json.append(':');
|
||||
json.append('{');
|
||||
|
||||
boolean firstGraph = true;
|
||||
|
||||
final Iterator<Graph> iter = graphs.iterator();
|
||||
|
||||
while(iter.hasNext()) {
|
||||
Graph graph = iter.next();
|
||||
|
||||
StringBuilder graphJson = new StringBuilder();
|
||||
graphJson.append('{');
|
||||
|
||||
for(Plotter plotter : graph.getPlotters()) {
|
||||
appendJsonPair(graphJson, plotter.getColumnName(), Integer.toString(plotter.getValue()));
|
||||
}
|
||||
|
||||
graphJson.append('}');
|
||||
|
||||
if(!firstGraph) {
|
||||
json.append(',');
|
||||
}
|
||||
|
||||
json.append(escapeJson(graph.getName()));
|
||||
json.append(':');
|
||||
json.append(graphJson);
|
||||
|
||||
firstGraph = false;
|
||||
}
|
||||
|
||||
json.append('}');
|
||||
}
|
||||
}
|
||||
|
||||
// close json
|
||||
json.append('}');
|
||||
|
||||
// Create the url
|
||||
URL url = new URL(BASE_URL + String.format(REPORT_URL, urlEncode(pluginName)));
|
||||
|
||||
// Connect to the website
|
||||
URLConnection connection;
|
||||
|
||||
// Mineshafter creates a socks proxy, so we can safely bypass it
|
||||
// It does not reroute POST requests so we need to go around it
|
||||
if(isMineshafterPresent()) {
|
||||
connection = url.openConnection(Proxy.NO_PROXY);
|
||||
} else {
|
||||
connection = url.openConnection();
|
||||
}
|
||||
|
||||
|
||||
byte[] uncompressed = json.toString().getBytes();
|
||||
byte[] compressed = gzip(json.toString());
|
||||
|
||||
// Headers
|
||||
connection.addRequestProperty("User-Agent", "MCStats/" + REVISION);
|
||||
connection.addRequestProperty("Content-Type", "application/json");
|
||||
connection.addRequestProperty("Content-Encoding", "gzip");
|
||||
connection.addRequestProperty("Content-Length", Integer.toString(compressed.length));
|
||||
connection.addRequestProperty("Accept", "application/json");
|
||||
connection.addRequestProperty("Connection", "close");
|
||||
|
||||
connection.setDoOutput(true);
|
||||
|
||||
if(debug) {
|
||||
System.out.println("[Metrics] Prepared request for " + pluginName + " uncompressed=" + uncompressed.length + " compressed=" + compressed.length);
|
||||
}
|
||||
|
||||
// Write the data
|
||||
OutputStream os = connection.getOutputStream();
|
||||
os.write(compressed);
|
||||
os.flush();
|
||||
|
||||
// Now read the response
|
||||
final BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
|
||||
String response = reader.readLine();
|
||||
|
||||
// close resources
|
||||
os.close();
|
||||
reader.close();
|
||||
|
||||
if(response == null || response.startsWith("ERR") || response.startsWith("7")) {
|
||||
if(response == null) {
|
||||
response = "null";
|
||||
} else if(response.startsWith("7")) {
|
||||
response = response.substring(response.startsWith("7,") ? 2 : 1);
|
||||
}
|
||||
|
||||
throw new IOException(response);
|
||||
} else {
|
||||
// Is this the first update this hour?
|
||||
if(response.equals("1") || response.contains("This is your first update this hour")) {
|
||||
synchronized(graphs) {
|
||||
final Iterator<Graph> iter = graphs.iterator();
|
||||
|
||||
while(iter.hasNext()) {
|
||||
final Graph graph = iter.next();
|
||||
|
||||
for(Plotter plotter : graph.getPlotters()) {
|
||||
plotter.reset();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GZip compress a string of bytes.
|
||||
* @param input Content to gzip
|
||||
* @return byte[] of the gzipped input
|
||||
*/
|
||||
public static byte[] gzip(String input) {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
GZIPOutputStream gzos = null;
|
||||
|
||||
try {
|
||||
gzos = new GZIPOutputStream(baos);
|
||||
gzos.write(input.getBytes(StandardCharsets.UTF_8));
|
||||
} catch(IOException e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
if(gzos != null) {
|
||||
try {
|
||||
gzos.close();
|
||||
} catch(IOException ignore) {
|
||||
// ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return baos.toByteArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if mineshafter is present. If it is, we need to bypass it to send POST requests
|
||||
* @return true if mineshafter is installed on the server
|
||||
*/
|
||||
private boolean isMineshafterPresent() {
|
||||
try {
|
||||
Class.forName("mineshafter.MineServer");
|
||||
return true;
|
||||
} catch(Exception e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Appends a json encoded key/value pair to the given string builder.
|
||||
*/
|
||||
private static void appendJsonPair(StringBuilder json, String key, String value) throws UnsupportedEncodingException {
|
||||
boolean isValueNumeric = false;
|
||||
|
||||
try {
|
||||
if(value.equals("0") || !value.endsWith("0")) {
|
||||
Double.parseDouble(value);
|
||||
isValueNumeric = true;
|
||||
}
|
||||
} catch(NumberFormatException e) {
|
||||
isValueNumeric = false;
|
||||
}
|
||||
|
||||
if(json.charAt(json.length() - 1) != '{') {
|
||||
json.append(',');
|
||||
}
|
||||
|
||||
json.append(escapeJson(key));
|
||||
json.append(':');
|
||||
|
||||
if(isValueNumeric) {
|
||||
json.append(value);
|
||||
} else {
|
||||
json.append(escapeJson(value));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape a string to create a valid JSON string.
|
||||
*/
|
||||
private static String escapeJson(String text) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
builder.append('"');
|
||||
for(int index = 0; index < text.length(); index++) {
|
||||
char chr = text.charAt(index);
|
||||
|
||||
switch(chr) {
|
||||
case '"':
|
||||
case '\\':
|
||||
builder.append('\\');
|
||||
builder.append(chr);
|
||||
break;
|
||||
case '\b':
|
||||
builder.append("\\b");
|
||||
break;
|
||||
case '\t':
|
||||
builder.append("\\t");
|
||||
break;
|
||||
case '\n':
|
||||
builder.append("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
builder.append("\\r");
|
||||
break;
|
||||
default:
|
||||
if(chr < ' ') {
|
||||
String t = "000" + Integer.toHexString(chr);
|
||||
builder.append("\\u" + t.substring(t.length() - 4));
|
||||
} else {
|
||||
builder.append(chr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
builder.append('"');
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode text as UTF-8.
|
||||
* @param text the text to encode
|
||||
* @return the encoded text, as UTF-8
|
||||
*/
|
||||
private static String urlEncode(final String text) throws UnsupportedEncodingException {
|
||||
return URLEncoder.encode(text, "UTF-8");
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents a custom graph on the website.
|
||||
*/
|
||||
public static class Graph {
|
||||
|
||||
/**
|
||||
* The graph's name, alphanumeric and spaces only :) If it does not comply to the above when submitted, it is
|
||||
* rejected.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* The set of plotters that are contained within this graph.
|
||||
*/
|
||||
private final Set<Plotter> plotters = new LinkedHashSet<Plotter>();
|
||||
|
||||
private Graph(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the graph's name.
|
||||
* @return the Graph's name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a plotter to the graph, which will be used to plot entries.
|
||||
* @param plotter the plotter to add to the graph
|
||||
*/
|
||||
public void addPlotter(final Plotter plotter) {
|
||||
plotters.add(plotter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a plotter from the graph.
|
||||
* @param plotter the plotter to remove from the graph
|
||||
*/
|
||||
public void removePlotter(final Plotter plotter) {
|
||||
plotters.remove(plotter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an <b>unmodifiable</b> set of the plotter objects in the graph.
|
||||
* @return an unmodifiable {@link java.util.Set} of the plotter objects
|
||||
*/
|
||||
public Set<Plotter> getPlotters() {
|
||||
return Collections.unmodifiableSet(plotters);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return name.hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object object) {
|
||||
if(!(object instanceof Graph)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Graph graph = (Graph)object;
|
||||
return graph.name.equals(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the server owner decides to opt-out of BukkitMetrics while the server is running.
|
||||
*/
|
||||
protected void onOptOut() {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Interface used to collect custom data for a plugin.
|
||||
*/
|
||||
public abstract static class Plotter {
|
||||
|
||||
/**
|
||||
* The plot's name.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Construct a plotter with the default plot name.
|
||||
*/
|
||||
public Plotter() {
|
||||
this("Default");
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a plotter with a specific plot name.
|
||||
* @param name the name of the plotter to use, which will show up on the website
|
||||
*/
|
||||
public Plotter(final String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current value for the plotted point. Since this function defers to an external function it may or may
|
||||
* not return immediately thus cannot be guaranteed to be thread friendly or safe. This function can be called
|
||||
* from any thread so care should be taken when accessing resources that need to be synchronized.
|
||||
* @return the current value for the point to be plotted.
|
||||
*/
|
||||
public abstract int getValue();
|
||||
|
||||
/**
|
||||
* Get the column name for the plotted point.
|
||||
* @return the plotted point's column name
|
||||
*/
|
||||
public String getColumnName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after the website graphs have been updated.
|
||||
*/
|
||||
public void reset() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return getColumnName().hashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(final Object object) {
|
||||
if(!(object instanceof Plotter)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final Plotter plotter = (Plotter)object;
|
||||
return plotter.name.equals(name) && plotter.getValue() == getValue();
|
||||
}
|
||||
}
|
||||
}
|
||||
+163
@@ -0,0 +1,163 @@
|
||||
package me.wiefferink.areashop.listeners;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import me.wiefferink.bukkitdo.Do;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerKickEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent;
|
||||
import org.bukkit.event.player.PlayerLoginEvent.Result;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Notify region expiry and track activity time.
|
||||
*/
|
||||
public final class PlayerLoginLogoutListener implements Listener {
|
||||
private final AreaShop plugin;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param plugin The AreaShop plugin
|
||||
*/
|
||||
public PlayerLoginLogoutListener(AreaShop plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a sign is changed.
|
||||
* @param event The event
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerLogin(PlayerLoginEvent event) {
|
||||
if(event.getResult() != Result.ALLOWED) {
|
||||
return;
|
||||
}
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
// Schedule task to check for notifications, prevents a lag spike at login
|
||||
Do.syncTimerLater(25, 25, () -> {
|
||||
// Delay until all regions are loaded
|
||||
if(!plugin.isReady()) {
|
||||
return true;
|
||||
}
|
||||
if(!player.isOnline()) {
|
||||
return false;
|
||||
}
|
||||
// Notify for rents that almost run out
|
||||
for(RentRegion region : plugin.getFileManager().getRents()) {
|
||||
if(region.isRenter(player)) {
|
||||
String warningSetting = region.getStringSetting("rent.warningOnLoginTime");
|
||||
if(warningSetting == null || warningSetting.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
long warningTime = Utils.durationStringToLong(warningSetting);
|
||||
if(region.getTimeLeft() < warningTime) {
|
||||
// Send the warning message later to let it appear after general MOTD messages
|
||||
AreaShop.getInstance().message(player, "rent-expireWarning", region);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Notify admins for plugin updates
|
||||
AreaShop.getInstance().notifyUpdate(player);
|
||||
return false;
|
||||
});
|
||||
|
||||
// Check if the player has regions that use an old name of him and update them
|
||||
Do.syncTimerLater(22, 10, () -> {
|
||||
if(!plugin.isReady()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
List<GeneralRegion> regions = new ArrayList<>();
|
||||
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
|
||||
if(region.isOwner(player)) {
|
||||
regions.add(region);
|
||||
}
|
||||
}
|
||||
|
||||
Do.forAll(
|
||||
plugin.getConfig().getInt("nameupdate.regionsPerTick"),
|
||||
regions,
|
||||
region -> {
|
||||
if(region instanceof BuyRegion) {
|
||||
if(!player.getName().equals(region.getStringSetting("buy.buyerName"))) {
|
||||
region.setSetting("buy.buyerName", player.getName());
|
||||
region.update();
|
||||
}
|
||||
} else if(region instanceof RentRegion) {
|
||||
if(!player.getName().equals(region.getStringSetting("rent.renterName"))) {
|
||||
region.setSetting("rent.renterName", player.getName());
|
||||
region.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
// Active time updates
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerLogout(PlayerQuitEvent event) {
|
||||
updateLastActive(event.getPlayer());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerKick(PlayerKickEvent event) {
|
||||
updateLastActive(event.getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the last active time for all regions the player is owner off.
|
||||
* @param player The player to update the active times for
|
||||
*/
|
||||
private void updateLastActive(Player player) {
|
||||
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
|
||||
if(region.isOwner(player)) {
|
||||
region.updateLastActiveTime();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,214 @@
|
||||
package me.wiefferink.areashop.managers;
|
||||
|
||||
import me.wiefferink.areashop.commands.AddCommand;
|
||||
import me.wiefferink.areashop.commands.AddfriendCommand;
|
||||
import me.wiefferink.areashop.commands.AddsignCommand;
|
||||
import me.wiefferink.areashop.commands.BuyCommand;
|
||||
import me.wiefferink.areashop.commands.CommandAreaShop;
|
||||
import me.wiefferink.areashop.commands.DelCommand;
|
||||
import me.wiefferink.areashop.commands.DelfriendCommand;
|
||||
import me.wiefferink.areashop.commands.DelsignCommand;
|
||||
import me.wiefferink.areashop.commands.FindCommand;
|
||||
import me.wiefferink.areashop.commands.GroupaddCommand;
|
||||
import me.wiefferink.areashop.commands.GroupdelCommand;
|
||||
import me.wiefferink.areashop.commands.GroupinfoCommand;
|
||||
import me.wiefferink.areashop.commands.GrouplistCommand;
|
||||
import me.wiefferink.areashop.commands.HelpCommand;
|
||||
import me.wiefferink.areashop.commands.ImportCommand;
|
||||
import me.wiefferink.areashop.commands.InfoCommand;
|
||||
import me.wiefferink.areashop.commands.LinksignsCommand;
|
||||
import me.wiefferink.areashop.commands.MeCommand;
|
||||
import me.wiefferink.areashop.commands.MessageCommand;
|
||||
import me.wiefferink.areashop.commands.ReloadCommand;
|
||||
import me.wiefferink.areashop.commands.RentCommand;
|
||||
import me.wiefferink.areashop.commands.ResellCommand;
|
||||
import me.wiefferink.areashop.commands.SchematiceventCommand;
|
||||
import me.wiefferink.areashop.commands.SellCommand;
|
||||
import me.wiefferink.areashop.commands.SetdurationCommand;
|
||||
import me.wiefferink.areashop.commands.SetlandlordCommand;
|
||||
import me.wiefferink.areashop.commands.SetownerCommand;
|
||||
import me.wiefferink.areashop.commands.SetpriceCommand;
|
||||
import me.wiefferink.areashop.commands.SetrestoreCommand;
|
||||
import me.wiefferink.areashop.commands.SetteleportCommand;
|
||||
import me.wiefferink.areashop.commands.StackCommand;
|
||||
import me.wiefferink.areashop.commands.StopresellCommand;
|
||||
import me.wiefferink.areashop.commands.TeleportCommand;
|
||||
import me.wiefferink.areashop.commands.UnrentCommand;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabCompleter;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.SortedSet;
|
||||
import java.util.TreeSet;
|
||||
|
||||
public class CommandManager extends Manager implements CommandExecutor, TabCompleter {
|
||||
private final ArrayList<CommandAreaShop> commands;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public CommandManager() {
|
||||
commands = new ArrayList<>();
|
||||
commands.add(new HelpCommand());
|
||||
commands.add(new RentCommand());
|
||||
commands.add(new UnrentCommand());
|
||||
commands.add(new BuyCommand());
|
||||
commands.add(new SellCommand());
|
||||
commands.add(new MeCommand());
|
||||
commands.add(new InfoCommand());
|
||||
commands.add(new TeleportCommand());
|
||||
commands.add(new SetteleportCommand());
|
||||
commands.add(new AddfriendCommand());
|
||||
commands.add(new DelfriendCommand());
|
||||
commands.add(new FindCommand());
|
||||
commands.add(new ResellCommand());
|
||||
commands.add(new StopresellCommand());
|
||||
commands.add(new SetrestoreCommand());
|
||||
commands.add(new SetpriceCommand());
|
||||
commands.add(new SetownerCommand());
|
||||
commands.add(new SetdurationCommand());
|
||||
commands.add(new ReloadCommand());
|
||||
commands.add(new GroupaddCommand());
|
||||
commands.add(new GroupdelCommand());
|
||||
commands.add(new GrouplistCommand());
|
||||
commands.add(new GroupinfoCommand());
|
||||
commands.add(new SchematiceventCommand());
|
||||
commands.add(new AddCommand());
|
||||
commands.add(new DelCommand());
|
||||
commands.add(new AddsignCommand());
|
||||
commands.add(new DelsignCommand());
|
||||
commands.add(new LinksignsCommand());
|
||||
commands.add(new StackCommand());
|
||||
commands.add(new SetlandlordCommand());
|
||||
commands.add(new MessageCommand());
|
||||
commands.add(new ImportCommand());
|
||||
|
||||
// Register commands in bukkit
|
||||
plugin.getCommand("AreaShop").setExecutor(this);
|
||||
plugin.getCommand("AreaShop").setTabCompleter(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list with AreaShop commands.
|
||||
* @return The list with AreaShop commands
|
||||
*/
|
||||
public ArrayList<CommandAreaShop> getCommands() {
|
||||
return commands;
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the help page for the CommandSender.
|
||||
* @param target The CommandSender to show the help to
|
||||
*/
|
||||
public void showHelp(CommandSender target) {
|
||||
if(!target.hasPermission("areashop.help")) {
|
||||
plugin.message(target, "help-noPermission");
|
||||
return;
|
||||
}
|
||||
// Add all messages to a list
|
||||
ArrayList<String> messages = new ArrayList<>();
|
||||
plugin.message(target, "help-header");
|
||||
plugin.message(target, "help-alias");
|
||||
for(CommandAreaShop command : commands) {
|
||||
String help = command.getHelp(target);
|
||||
if(help != null && help.length() != 0) {
|
||||
messages.add(help);
|
||||
}
|
||||
}
|
||||
// Send the messages to the target
|
||||
for(String message : messages) {
|
||||
plugin.messageNoPrefix(target, message);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String alias, String[] args) {
|
||||
if(!plugin.isReady()) {
|
||||
plugin.message(sender, "general-notReady");
|
||||
return true;
|
||||
}
|
||||
// Redirect `/as info player <player>` to `/as me <player>`
|
||||
if(args.length == 3 && "info".equals(args[0]) && "player".equals(args[1])) {
|
||||
args[0] = "me";
|
||||
args[1] = args[2];
|
||||
}
|
||||
// Execute command
|
||||
boolean executed = false;
|
||||
for(int i = 0; i < commands.size() && !executed; i++) {
|
||||
if(commands.get(i).canExecute(command, args)) {
|
||||
commands.get(i).execute(sender, args);
|
||||
executed = true;
|
||||
}
|
||||
}
|
||||
if(!executed && args.length == 0) {
|
||||
this.showHelp(sender);
|
||||
} else if(!executed && args.length > 0) {
|
||||
// Indicate that the '/as updaterents' and '/as updatebuys' commands are removed
|
||||
if("updaterents".equalsIgnoreCase(args[0]) || "updatebuys".equalsIgnoreCase(args[0])) {
|
||||
plugin.message(sender, "reload-updateCommandChanged");
|
||||
} else {
|
||||
plugin.message(sender, "cmd-notValid");
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
List<String> result = new ArrayList<>();
|
||||
if(!sender.hasPermission("areashop.tabcomplete")) {
|
||||
return result;
|
||||
}
|
||||
int toCompleteNumber = args.length;
|
||||
String toCompletePrefix = args[args.length - 1].toLowerCase();
|
||||
//AreaShop.debug("toCompleteNumber=" + toCompleteNumber + ", toCompletePrefix=" + toCompletePrefix + ", length=" + toCompletePrefix.length());
|
||||
if(toCompleteNumber == 1) {
|
||||
for(CommandAreaShop c : commands) {
|
||||
String begin = c.getCommandStart();
|
||||
result.add(begin.substring(begin.indexOf(' ') + 1));
|
||||
}
|
||||
} else {
|
||||
String[] start = new String[args.length];
|
||||
start[0] = command.getName();
|
||||
System.arraycopy(args, 0, start, 1, args.length - 1);
|
||||
for(CommandAreaShop c : commands) {
|
||||
if(c.canExecute(command, args)) {
|
||||
result = c.getTabCompleteList(toCompleteNumber, start, sender);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Filter and sort the results
|
||||
if(result.size() > 0) {
|
||||
SortedSet<String> set = new TreeSet<>();
|
||||
for(String suggestion : result) {
|
||||
if(suggestion.toLowerCase().startsWith(toCompletePrefix)) {
|
||||
set.add(suggestion);
|
||||
}
|
||||
}
|
||||
result.clear();
|
||||
result.addAll(set);
|
||||
}
|
||||
//AreaShop.debug("Tabcomplete #" + toCompleteNumber + ", prefix="+ toCompletePrefix + ", result=" + result.toString());
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,88 @@
|
||||
package me.wiefferink.areashop.managers;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.features.DebugFeature;
|
||||
import me.wiefferink.areashop.features.FriendsFeature;
|
||||
import me.wiefferink.areashop.features.RegionFeature;
|
||||
import me.wiefferink.areashop.features.TeleportFeature;
|
||||
import me.wiefferink.areashop.features.WorldGuardRegionFlagsFeature;
|
||||
import me.wiefferink.areashop.features.signs.SignsFeature;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
public class FeatureManager extends Manager {
|
||||
|
||||
// List of defined features
|
||||
private static final Set<Class<? extends RegionFeature>> featureClasses = new HashSet<>(Arrays.asList(
|
||||
DebugFeature.class,
|
||||
SignsFeature.class,
|
||||
FriendsFeature.class,
|
||||
WorldGuardRegionFlagsFeature.class,
|
||||
TeleportFeature.class
|
||||
));
|
||||
// One instance of each feature, registered for event handling
|
||||
private final Set<RegionFeature> globalFeatures;
|
||||
private final Map<Class<? extends RegionFeature>, Constructor<? extends RegionFeature>> regionFeatureConstructors;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public FeatureManager() {
|
||||
// Instantiate and register global features (one per type, for event handling)
|
||||
globalFeatures = new HashSet<>();
|
||||
for(Class<? extends RegionFeature> clazz : featureClasses) {
|
||||
try {
|
||||
Constructor<? extends RegionFeature> constructor = clazz.getConstructor();
|
||||
try {
|
||||
RegionFeature feature = constructor.newInstance();
|
||||
feature.listen();
|
||||
globalFeatures.add(feature);
|
||||
} catch(InstantiationException | IllegalAccessException | InvocationTargetException | IllegalArgumentException e) {
|
||||
AreaShop.error("Failed to instantiate global feature:", clazz, e);
|
||||
}
|
||||
} catch(NoSuchMethodException e) {
|
||||
// Feature does not have a global part
|
||||
}
|
||||
}
|
||||
|
||||
// Setup constructors for region specific features
|
||||
regionFeatureConstructors = new HashMap<>();
|
||||
for(Class<? extends RegionFeature> clazz : featureClasses) {
|
||||
try {
|
||||
regionFeatureConstructors.put(clazz, clazz.getConstructor(GeneralRegion.class));
|
||||
} catch(NoSuchMethodException | IllegalArgumentException e) {
|
||||
// The feature does not have a region specific part
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
for(RegionFeature feature : globalFeatures) {
|
||||
feature.shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Instanciate a feature for a certain region.
|
||||
* @param region The region to create a feature for
|
||||
* @param featureClazz The class of the feature to create
|
||||
* @return The feature class
|
||||
*/
|
||||
public RegionFeature getRegionFeature(GeneralRegion region, Class<? extends RegionFeature> featureClazz) {
|
||||
try {
|
||||
return regionFeatureConstructors.get(featureClazz).newInstance(region);
|
||||
} catch(InstantiationException | InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
|
||||
AreaShop.error("Failed to instanciate feature", featureClazz, "for region", region, e, e.getCause());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,16 @@
|
||||
package me.wiefferink.areashop.managers;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
|
||||
public abstract class Manager {
|
||||
|
||||
final AreaShop plugin = AreaShop.getInstance();
|
||||
|
||||
/**
|
||||
* Called at shutdown of the plugin.
|
||||
*/
|
||||
public void shutdown() {
|
||||
// To override by extending classes
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
package me.wiefferink.areashop.managers;
|
||||
|
||||
import me.wiefferink.areashop.features.signs.RegionSign;
|
||||
import me.wiefferink.areashop.features.signs.SignsFeature;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.Action;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.material.Sign;
|
||||
import org.bukkit.util.BlockIterator;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class SignLinkerManager extends Manager implements Listener {
|
||||
private final Map<UUID, SignLinker> signLinkers;
|
||||
private boolean eventsRegistered;
|
||||
|
||||
public SignLinkerManager() {
|
||||
signLinkers = new HashMap<>();
|
||||
eventsRegistered = false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void shutdown() {
|
||||
for(UUID uuid : signLinkers.keySet()) {
|
||||
exitSignLinkMode(Bukkit.getPlayer(uuid));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Let a player enter sign linking mode.
|
||||
* @param player The player that has to enter sign linking mode
|
||||
* @param profile The profile to use for the signs (null for default)
|
||||
*/
|
||||
public void enterSignLinkMode(Player player, String profile) {
|
||||
signLinkers.put(player.getUniqueId(), new SignLinker(player, profile));
|
||||
plugin.message(player, "linksigns-first");
|
||||
plugin.message(player, "linksigns-next");
|
||||
if(!eventsRegistered) {
|
||||
eventsRegistered = true;
|
||||
plugin.getServer().getPluginManager().registerEvents(this, plugin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Let a player exit sign linking mode.
|
||||
* @param player The player that has to exit sign linking mode
|
||||
*/
|
||||
public void exitSignLinkMode(Player player) {
|
||||
signLinkers.remove(player.getUniqueId());
|
||||
if(eventsRegistered && signLinkers.isEmpty()) {
|
||||
eventsRegistered = false;
|
||||
HandlerList.unregisterAll(this);
|
||||
}
|
||||
plugin.message(player, "linksigns-stopped");
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the player is in sign linking mode.
|
||||
* @param player The player to check
|
||||
* @return true if the player is in sign linking mode, otherwise false
|
||||
*/
|
||||
public boolean isInSignLinkMode(Player player) {
|
||||
return signLinkers.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
/**
|
||||
* On player interactions.
|
||||
* @param event The PlayerInteractEvent
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if(isInSignLinkMode(event.getPlayer())) {
|
||||
event.setCancelled(true);
|
||||
Player player = event.getPlayer();
|
||||
SignLinker linker = signLinkers.get(event.getPlayer().getUniqueId());
|
||||
if(event.getAction() == Action.RIGHT_CLICK_AIR || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
// Get the region
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext()) {
|
||||
Block next = blockIterator.next();
|
||||
List<GeneralRegion> regions = Utils.getRegions(next.getLocation());
|
||||
if(regions.size() == 1) {
|
||||
linker.setRegion(regions.get(0));
|
||||
return;
|
||||
} else if(regions.size() > 1) {
|
||||
Set<String> names = new HashSet<>();
|
||||
for(GeneralRegion region : regions) {
|
||||
names.add(region.getName());
|
||||
}
|
||||
plugin.message(player, "linksigns-multipleRegions", Utils.createCommaSeparatedList(names));
|
||||
plugin.message(player, "linksigns-multipleRegionsAdvice");
|
||||
return;
|
||||
}
|
||||
}
|
||||
// No regions found within the maximum range
|
||||
plugin.message(player, "linksigns-noRegions");
|
||||
} else if(event.getAction() == Action.LEFT_CLICK_AIR || event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||
Block block = null;
|
||||
BlockIterator blockIterator = new BlockIterator(player, 100);
|
||||
while(blockIterator.hasNext() && block == null) {
|
||||
Block next = blockIterator.next();
|
||||
if(next.getType() != Material.AIR) {
|
||||
block = next;
|
||||
}
|
||||
}
|
||||
if(block == null || !(block.getType() == Material.WALL_SIGN || block.getType() == Material.SIGN_POST)) {
|
||||
plugin.message(player, "linksigns-noSign");
|
||||
return;
|
||||
}
|
||||
|
||||
RegionSign regionSign = SignsFeature.getSignByLocation(block.getLocation());
|
||||
if(regionSign != null) {
|
||||
plugin.message(player, "linksigns-alreadyRegistered", regionSign.getRegion());
|
||||
return;
|
||||
}
|
||||
Sign sign = (Sign)block.getState().getData();
|
||||
linker.setSign(block.getLocation(), block.getType(), sign.getFacing());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle disconnection players.
|
||||
* @param event The PlayerQuitEvent
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerLeave(PlayerQuitEvent event) {
|
||||
exitSignLinkMode(event.getPlayer());
|
||||
}
|
||||
|
||||
/**
|
||||
* Class to keep track of the signlinking data.
|
||||
*/
|
||||
private class SignLinker {
|
||||
private boolean hasSign = false;
|
||||
private boolean hasRegion = false;
|
||||
|
||||
public final Player linker;
|
||||
public final String profile;
|
||||
|
||||
public GeneralRegion region = null;
|
||||
|
||||
public Location location = null;
|
||||
public Material type = null;
|
||||
public BlockFace facing = null;
|
||||
|
||||
public SignLinker(Player linker, String profile) {
|
||||
this.linker = linker;
|
||||
this.profile = profile;
|
||||
}
|
||||
|
||||
public void setRegion(GeneralRegion region) {
|
||||
this.region = region;
|
||||
hasRegion = true;
|
||||
if(!isComplete()) {
|
||||
plugin.message(linker, "linksigns-regionFound", region);
|
||||
}
|
||||
finish();
|
||||
}
|
||||
|
||||
public void setSign(Location location, Material type, BlockFace facing) {
|
||||
this.location = location;
|
||||
this.type = type;
|
||||
this.facing = facing;
|
||||
hasSign = true;
|
||||
if(!isComplete()) {
|
||||
plugin.message(linker, "linksigns-signFound", location.getBlockX(), location.getBlockY(), location.getBlockZ());
|
||||
}
|
||||
finish();
|
||||
}
|
||||
|
||||
public void finish() {
|
||||
if(isComplete()) {
|
||||
region.getSignsFeature().addSign(location, type, facing, profile);
|
||||
if(profile == null) {
|
||||
plugin.message(linker, "addsign-success", region);
|
||||
} else {
|
||||
plugin.message(linker, "addsign-successProfile", region, profile);
|
||||
}
|
||||
region.update();
|
||||
reset();
|
||||
|
||||
plugin.message(linker, "linksigns-next");
|
||||
}
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
hasSign = false;
|
||||
hasRegion = false;
|
||||
}
|
||||
|
||||
public boolean isComplete() {
|
||||
return hasSign && hasRegion;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,595 @@
|
||||
package me.wiefferink.areashop.regions;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.events.ask.BuyingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.ResellingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.SellingRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.BoughtRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.ResoldRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.SoldRegionEvent;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.Calendar;
|
||||
import java.util.UUID;
|
||||
|
||||
public class BuyRegion extends GeneralRegion {
|
||||
|
||||
public BuyRegion(YamlConfiguration config) {
|
||||
super(config);
|
||||
}
|
||||
|
||||
public BuyRegion(String name, World world) {
|
||||
super(name, world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionType getType() {
|
||||
return RegionType.BUY;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionState getState() {
|
||||
if(isSold() && isInResellingMode()) {
|
||||
return RegionState.RESELL;
|
||||
} else if(isSold() && !isInResellingMode()) {
|
||||
return RegionState.SOLD;
|
||||
} else {
|
||||
return RegionState.FORSALE;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return !isSold();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the UUID of the owner of this region.
|
||||
* @return The UUID of the owner of this region
|
||||
*/
|
||||
public UUID getBuyer() {
|
||||
String buyer = config.getString("buy.buyer");
|
||||
if(buyer != null) {
|
||||
try {
|
||||
return UUID.fromString(buyer);
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Incorrect UUID
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a player is the buyer of this region.
|
||||
* @param player Player to check
|
||||
* @return true if this player owns this region, otherwise false
|
||||
*/
|
||||
public boolean isBuyer(OfflinePlayer player) {
|
||||
return player != null && isBuyer(player.getUniqueId());
|
||||
}
|
||||
|
||||
public boolean isBuyer(UUID player) {
|
||||
UUID buyer = getBuyer();
|
||||
return !(buyer == null || player == null) && buyer.equals(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the buyer of this region.
|
||||
* @param buyer The UUID of the player that should be set as buyer
|
||||
*/
|
||||
public void setBuyer(UUID buyer) {
|
||||
if(buyer == null) {
|
||||
setSetting("buy.buyer", null);
|
||||
setSetting("buy.buyerName", null);
|
||||
} else {
|
||||
setSetting("buy.buyer", buyer.toString());
|
||||
setSetting("buy.buyerName", Utils.toName(buyer));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the player that owns this region.
|
||||
* @return The name of the player that owns this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return <UNKNOWN>
|
||||
*/
|
||||
public String getPlayerName() {
|
||||
String result = Utils.toName(getBuyer());
|
||||
if(result == null || result.isEmpty()) {
|
||||
result = getStringSetting("buy.buyerName");
|
||||
if(result == null || result.isEmpty()) {
|
||||
result = "<UNKNOWN>";
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the region is sold.
|
||||
* @return true if the region is sold, otherwise false
|
||||
*/
|
||||
public boolean isSold() {
|
||||
return getBuyer() != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the region is being resold.
|
||||
* @return true if the region is available for reselling, otherwise false
|
||||
*/
|
||||
public boolean isInResellingMode() {
|
||||
return config.getBoolean("buy.resellMode");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of the region.
|
||||
* @return The price of the region
|
||||
*/
|
||||
public double getPrice() {
|
||||
return Math.max(0, Utils.evaluateToDouble(getStringSetting("buy.price"), this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the resell price of this region.
|
||||
* @return The resell price if isInResellingMode(), otherwise 0.0
|
||||
*/
|
||||
public double getResellPrice() {
|
||||
return Math.max(0, config.getDouble("buy.resellPrice"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted string of the price (includes prefix and suffix).
|
||||
* @return The formatted string of the price
|
||||
*/
|
||||
public String getFormattedPrice() {
|
||||
return Utils.formatCurrency(getPrice());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted string of the resellprice (includes prefix and suffix).
|
||||
* @return The formatted string of the resellprice
|
||||
*/
|
||||
public String getFormattedResellPrice() {
|
||||
return Utils.formatCurrency(getResellPrice());
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the price of the region.
|
||||
* @param price The price to set this region to
|
||||
*/
|
||||
public void setPrice(Double price) {
|
||||
setSetting("buy.price", price);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the region into resell mode with the given price.
|
||||
* @param price The price this region should be put up for sale
|
||||
*/
|
||||
public void enableReselling(double price) {
|
||||
setSetting("buy.resellMode", true);
|
||||
setSetting("buy.resellPrice", price);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop this region from being in resell mode.
|
||||
*/
|
||||
public void disableReselling() {
|
||||
setSetting("buy.resellMode", null);
|
||||
setSetting("buy.resellPrice", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the moneyBack percentage.
|
||||
* @return The % of money the player will get back when selling
|
||||
*/
|
||||
public double getMoneyBackPercentage() {
|
||||
return Utils.evaluateToDouble(getStringSetting("buy.moneyBack"), this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of money that should be paid to the player when selling the region.
|
||||
* @return The amount of money the player should get back
|
||||
*/
|
||||
public double getMoneyBackAmount() {
|
||||
return getPrice() * (getMoneyBackPercentage() / 100.0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted string of the amount of the moneyBack amount.
|
||||
* @return String with currency symbols and proper fractional part
|
||||
*/
|
||||
public String getFormattedMoneyBackAmount() {
|
||||
return Utils.formatCurrency(getMoneyBackAmount());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object provideReplacement(String variable) {
|
||||
switch(variable) {
|
||||
case AreaShop.tagPrice:
|
||||
return getFormattedPrice();
|
||||
case AreaShop.tagRawPrice:
|
||||
return getPrice();
|
||||
case AreaShop.tagPlayerName:
|
||||
return getPlayerName();
|
||||
case AreaShop.tagPlayerUUID:
|
||||
return getBuyer();
|
||||
case AreaShop.tagResellPrice:
|
||||
return getFormattedResellPrice();
|
||||
case AreaShop.tagRawResellPrice:
|
||||
return getResellPrice();
|
||||
case AreaShop.tagMoneyBackAmount:
|
||||
return getFormattedMoneyBackAmount();
|
||||
case AreaShop.tagRawMoneyBackAmount:
|
||||
return getMoneyBackAmount();
|
||||
case AreaShop.tagMoneyBackPercentage:
|
||||
return getMoneyBackPercentage() % 1.0 == 0.0 ? (int)getMoneyBackPercentage() : getMoneyBackPercentage();
|
||||
case AreaShop.tagMaxInactiveTime:
|
||||
return this.getFormattedInactiveTimeUntilSell();
|
||||
|
||||
default:
|
||||
return super.provideReplacement(variable);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Minutes until automatic unrent when player is offline.
|
||||
* @return The number of milliseconds until the region is unrented while player is offline
|
||||
*/
|
||||
public long getInactiveTimeUntilSell() {
|
||||
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("buy.inactiveTimeUntilSell"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a human readable string indicating how long the player can be offline until automatic unrent.
|
||||
* @return String indicating the inactive time until unrent
|
||||
*/
|
||||
public String getFormattedInactiveTimeUntilSell() {
|
||||
return Utils.millisToHumanFormat(getInactiveTimeUntilSell());
|
||||
}
|
||||
|
||||
/**
|
||||
* Buy a region.
|
||||
* @param offlinePlayer The player that wants to buy the region
|
||||
* @return true if it succeeded and false if not
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean buy(OfflinePlayer offlinePlayer) {
|
||||
// Check if the player has permission
|
||||
if(plugin.hasPermission(offlinePlayer, "areashop.buy")) {
|
||||
if(plugin.getEconomy() == null) {
|
||||
message(offlinePlayer, "general-noEconomy");
|
||||
return false;
|
||||
}
|
||||
if(isInResellingMode()) {
|
||||
if(!plugin.hasPermission(offlinePlayer, "areashop.buyresell")) {
|
||||
message(offlinePlayer, "buy-noPermissionResell");
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if(!plugin.hasPermission(offlinePlayer, "areashop.buynormal")) {
|
||||
message(offlinePlayer, "buy-noPermissionNoResell");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(getWorld() == null) {
|
||||
message(offlinePlayer, "general-noWorld");
|
||||
return false;
|
||||
}
|
||||
if(getRegion() == null) {
|
||||
message(offlinePlayer, "general-noRegion");
|
||||
return false;
|
||||
}
|
||||
if(!isSold() || (isInResellingMode() && !isBuyer(offlinePlayer))) {
|
||||
boolean isResell = isInResellingMode();
|
||||
|
||||
// Only relevant if the player is online
|
||||
Player player = offlinePlayer.getPlayer();
|
||||
if(player != null) {
|
||||
// Check if the players needs to be in the region for buying
|
||||
if(restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|
||||
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
|
||||
message(offlinePlayer, "buy-restrictedToRegion");
|
||||
return false;
|
||||
}
|
||||
// Check if the players needs to be in the world for buying
|
||||
if(restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
|
||||
message(offlinePlayer, "buy-restrictedToWorld", player.getWorld().getName());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check region limits
|
||||
LimitResult limitResult = this.limitsAllow(RegionType.BUY, offlinePlayer);
|
||||
AreaShop.debug("LimitResult: " + limitResult.toString());
|
||||
if(!limitResult.actionAllowed()) {
|
||||
if(limitResult.getLimitingFactor() == LimitType.TOTAL) {
|
||||
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
|
||||
return false;
|
||||
}
|
||||
if(limitResult.getLimitingFactor() == LimitType.BUYS) {
|
||||
message(offlinePlayer, "buy-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
|
||||
return false;
|
||||
}
|
||||
// Should not be reached, but is safe like this
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the player has enough money
|
||||
if((!isResell && plugin.getEconomy().has(offlinePlayer, getWorldName(), getPrice())) || (isResell && plugin.getEconomy().has(offlinePlayer, getWorldName(), getResellPrice()))) {
|
||||
UUID oldOwner = getBuyer();
|
||||
if(isResell && oldOwner != null) {
|
||||
// Broadcast and check event
|
||||
ResellingRegionEvent event = new ResellingRegionEvent(this, offlinePlayer);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
message(offlinePlayer, "general-cancelled", event.getReason());
|
||||
return false;
|
||||
}
|
||||
|
||||
getFriendsFeature().clearFriends();
|
||||
double resellPrice = getResellPrice();
|
||||
// Transfer the money to the previous owner
|
||||
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getResellPrice());
|
||||
if(!r.transactionSuccess()) {
|
||||
message(offlinePlayer, "buy-payError");
|
||||
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while buying " + getName() + ": " + r.errorMessage);
|
||||
return false;
|
||||
}
|
||||
r = null;
|
||||
OfflinePlayer oldOwnerPlayer = Bukkit.getOfflinePlayer(oldOwner);
|
||||
String oldOwnerName = getPlayerName();
|
||||
if(oldOwnerPlayer != null && oldOwnerPlayer.getName() != null) {
|
||||
r = plugin.getEconomy().depositPlayer(oldOwnerPlayer, getWorldName(), getResellPrice());
|
||||
oldOwnerName = oldOwnerPlayer.getName();
|
||||
} else if(oldOwnerName != null) {
|
||||
r = plugin.getEconomy().depositPlayer(oldOwnerName, getWorldName(), getResellPrice());
|
||||
}
|
||||
if(r == null || !r.transactionSuccess()) {
|
||||
AreaShop.warn("Something went wrong with paying '" + oldOwnerName + "' " + getFormattedPrice() + " for his resell of region " + getName() + " to " + offlinePlayer.getName());
|
||||
}
|
||||
// Resell is done, disable that now
|
||||
disableReselling();
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.RESELL, true);
|
||||
// Set the owner
|
||||
setBuyer(offlinePlayer.getUniqueId());
|
||||
updateLastActiveTime();
|
||||
|
||||
// Update everything
|
||||
handleSchematicEvent(RegionEvent.RESELL);
|
||||
|
||||
// Notify about updates
|
||||
this.notifyAndUpdate(new ResoldRegionEvent(this, oldOwner));
|
||||
|
||||
// Send message to the player
|
||||
message(offlinePlayer, "buy-successResale", oldOwnerName);
|
||||
Player seller = Bukkit.getPlayer(oldOwner);
|
||||
if(seller != null) {
|
||||
message(seller, "buy-successSeller", resellPrice);
|
||||
}
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.RESELL, false);
|
||||
} else {
|
||||
// Broadcast and check event
|
||||
BuyingRegionEvent event = new BuyingRegionEvent(this, offlinePlayer);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
message(offlinePlayer, "general-cancelled", event.getReason());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Substract the money from the players balance
|
||||
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), getPrice());
|
||||
if(!r.transactionSuccess()) {
|
||||
message(offlinePlayer, "buy-payError");
|
||||
return false;
|
||||
}
|
||||
// Optionally give money to the landlord
|
||||
OfflinePlayer landlordPlayer = null;
|
||||
if(getLandlord() != null) {
|
||||
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
|
||||
}
|
||||
String landlordName = getLandlordName();
|
||||
if(landlordName != null) {
|
||||
if(landlordPlayer != null && landlordPlayer.getName() != null) {
|
||||
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), getPrice());
|
||||
} else {
|
||||
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), getPrice());
|
||||
}
|
||||
if(r != null && !r.transactionSuccess()) {
|
||||
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + getFormattedPrice() + " for his sell of region " + getName() + " to " + offlinePlayer.getName());
|
||||
}
|
||||
}
|
||||
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.BOUGHT, true);
|
||||
// Set the owner
|
||||
setBuyer(offlinePlayer.getUniqueId());
|
||||
updateLastActiveTime();
|
||||
|
||||
// Notify about updates
|
||||
this.notifyAndUpdate(new BoughtRegionEvent(this));
|
||||
|
||||
// Update everything
|
||||
handleSchematicEvent(RegionEvent.BOUGHT);
|
||||
|
||||
// Send message to the player
|
||||
message(offlinePlayer, "buy-succes");
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.BOUGHT, false);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
// Player has not enough money
|
||||
if(isResell) {
|
||||
message(offlinePlayer, "buy-lowMoneyResell", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
|
||||
} else {
|
||||
message(offlinePlayer, "buy-lowMoney", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if(isBuyer(offlinePlayer)) {
|
||||
message(offlinePlayer, "buy-yours");
|
||||
} else {
|
||||
message(offlinePlayer, "buy-someoneElse");
|
||||
}
|
||||
}
|
||||
} else {
|
||||
message(offlinePlayer, "buy-noPermission");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sell a buyed region, get part of the money back.
|
||||
* @param giveMoneyBack true if the player should be given money back, otherwise false
|
||||
* @param executor CommandSender to receive a message when the sell fails, or null
|
||||
* @return true if the region has been sold, otherwise false
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean sell(boolean giveMoneyBack, CommandSender executor) {
|
||||
boolean own = executor instanceof Player && this.isBuyer((Player)executor);
|
||||
if(executor != null) {
|
||||
if(!executor.hasPermission("areashop.sell") && !own) {
|
||||
message(executor, "sell-noPermissionOther");
|
||||
return false;
|
||||
}
|
||||
if(!executor.hasPermission("areashop.sell") && !executor.hasPermission("areashop.sellown") && own) {
|
||||
message(executor, "sell-noPermission");
|
||||
return false;
|
||||
}
|
||||
if(!executor.hasPermission("areashop.sell")
|
||||
&& executor.hasPermission("areashop.sellown")
|
||||
&& own
|
||||
&& getBooleanSetting("buy.sellDisabled")) {
|
||||
message(executor, "sell-disabled");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(plugin.getEconomy() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Broadcast and check event
|
||||
SellingRegionEvent event = new SellingRegionEvent(this);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
message(executor, "general-cancelled", event.getReason());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.SOLD, true);
|
||||
|
||||
disableReselling();
|
||||
// Give part of the buying price back
|
||||
double moneyBack = getMoneyBackAmount();
|
||||
if(moneyBack > 0 && giveMoneyBack) {
|
||||
boolean noPayBack = false;
|
||||
OfflinePlayer landlordPlayer = null;
|
||||
if(getLandlord() != null) {
|
||||
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
|
||||
}
|
||||
String landlordName = getLandlordName();
|
||||
EconomyResponse r;
|
||||
if(landlordName != null) {
|
||||
if(landlordPlayer != null && landlordPlayer.getName() != null) {
|
||||
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
|
||||
} else {
|
||||
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
|
||||
}
|
||||
if(r == null || !r.transactionSuccess()) {
|
||||
noPayBack = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Give back the money
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(getBuyer());
|
||||
if(player != null && !noPayBack) {
|
||||
EconomyResponse response = null;
|
||||
boolean error = false;
|
||||
try {
|
||||
if(player.getName() != null) {
|
||||
response = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
|
||||
} else if(getPlayerName() != null) {
|
||||
response = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
error = true;
|
||||
}
|
||||
if(error || response == null || !response.transactionSuccess()) {
|
||||
AreaShop.warn("Something went wrong with paying back money to " + getPlayerName() + " while selling region " + getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
message(executor, "sell-sold");
|
||||
|
||||
// Handle schematic save/restore (while %uuid% is still available)
|
||||
handleSchematicEvent(RegionEvent.SOLD);
|
||||
|
||||
// Remove friends and the owner
|
||||
getFriendsFeature().clearFriends();
|
||||
UUID oldBuyer = getBuyer();
|
||||
setBuyer(null);
|
||||
removeLastActiveTime();
|
||||
|
||||
// Notify about updates
|
||||
this.notifyAndUpdate(new SoldRegionEvent(this, oldBuyer, Math.max(moneyBack, 0)));
|
||||
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.SOLD, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkInactive() {
|
||||
if(isDeleted() || !isSold()) {
|
||||
return false;
|
||||
}
|
||||
long inactiveSetting = getInactiveTimeUntilSell();
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(getBuyer());
|
||||
if(inactiveSetting <= 0 || player.isOp()) {
|
||||
return false;
|
||||
}
|
||||
long lastPlayed = getLastActiveTime();
|
||||
//AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis()-player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
|
||||
if(Calendar.getInstance().getTimeInMillis() > (lastPlayed + inactiveSetting)) {
|
||||
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
|
||||
AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
|
||||
return this.sell(true, null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,7 @@
|
||||
# Regions
|
||||
|
||||
This package contains the `GeneralRegion` class which represents a region in AreaShop. Such a region is linked to a WorldGuard region and has its own configuration file at `/plugins/AreaShop/regions/<name>.yml`.
|
||||
|
||||
The `BuyRegion` and `RentRegion` classes represent buy and rental regions (mutually exclusive) and inherit from `GeneralRegion`.
|
||||
|
||||
To group regions there is `RegionGroup`, which allows configuring settings for a lot of regions at once.
|
||||
@@ -0,0 +1,225 @@
|
||||
package me.wiefferink.areashop.regions;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
// TODO consider switching to saving lowercase regions
|
||||
public class RegionGroup {
|
||||
|
||||
private final AreaShop plugin;
|
||||
private final String name;
|
||||
private final Set<String> regions;
|
||||
private Set<String> autoRegions;
|
||||
private boolean autoDirty;
|
||||
private final Set<String> worlds;
|
||||
|
||||
/**
|
||||
* Constructor, used when creating new groups or restoring them from groups.yml at server boot.
|
||||
* @param plugin The AreaShop plugin
|
||||
* @param name Name of the group, has to be unique
|
||||
*/
|
||||
public RegionGroup(AreaShop plugin, String name) {
|
||||
this.plugin = plugin;
|
||||
this.name = name;
|
||||
this.autoDirty = true;
|
||||
setSetting("name", name);
|
||||
|
||||
// Load regions and worlds
|
||||
regions = new HashSet<>(getSettings().getStringList("regions"));
|
||||
worlds = new HashSet<>(getSettings().getStringList("worlds"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get automatically added regions.
|
||||
* @return Set of regions automatically added by the configuration
|
||||
*/
|
||||
public Set<String> getAutoRegions() {
|
||||
if(autoDirty) {
|
||||
autoRegions = new HashSet<>();
|
||||
for(GeneralRegion region : plugin.getFileManager().getRegions()) {
|
||||
if(worlds.contains(region.getWorldName())) {
|
||||
autoRegions.add(region.getName());
|
||||
}
|
||||
}
|
||||
autoDirty = false;
|
||||
}
|
||||
return autoRegions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark that automatically added regions should be regenerated.
|
||||
*/
|
||||
public void autoDirty() {
|
||||
autoDirty = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a world from which all regions should be added to the group.
|
||||
* @param world World from which all regions should be added
|
||||
* @return true if the region was not already added, otherwise false
|
||||
*/
|
||||
public boolean addWorld(String world) {
|
||||
if(worlds.add(world)) {
|
||||
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
|
||||
saveRequired();
|
||||
autoDirty();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a member from the group.
|
||||
* @param world World to remove
|
||||
* @return true if the region was in the group before, otherwise false
|
||||
*/
|
||||
public boolean removeWorld(String world) {
|
||||
if(worlds.remove(world)) {
|
||||
setSetting("regionsFromWorlds", new ArrayList<>(worlds));
|
||||
saveRequired();
|
||||
autoDirty();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all worlds from which regions are added automatically.
|
||||
* @return A list with the names of all worlds (immutable)
|
||||
*/
|
||||
public Set<String> getWorlds() {
|
||||
return new HashSet<>(worlds);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a member to a group.
|
||||
* @param region The region to add to the group (GeneralRegion or a subclass of it)
|
||||
* @return true if the region was not already added, otherwise false
|
||||
*/
|
||||
public boolean addMember(GeneralRegion region) {
|
||||
if(regions.add(region.getName())) {
|
||||
setSetting("regions", new ArrayList<>(regions));
|
||||
saveRequired();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a member from the group.
|
||||
* @param region The region to remove
|
||||
* @return true if the region was in the group before, otherwise false
|
||||
*/
|
||||
public boolean removeMember(GeneralRegion region) {
|
||||
if(regions.remove(region.getName())) {
|
||||
setSetting("regions", new ArrayList<>(regions));
|
||||
saveRequired();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all members of the group.
|
||||
* @return A list with the names of all members of the group (immutable)
|
||||
*/
|
||||
public Set<String> getMembers() {
|
||||
HashSet<String> result = new HashSet<>(regions);
|
||||
result.addAll(getAutoRegions());
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all manually added members of the group.
|
||||
* @return A list with the names of all members of the group (immutable)
|
||||
*/
|
||||
public Set<String> getManualMembers() {
|
||||
return new HashSet<>(regions);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all members of the group as GeneralRegions.
|
||||
* @return A Set with all group members
|
||||
*/
|
||||
public Set<GeneralRegion> getMemberRegions() {
|
||||
Set<GeneralRegion> result = new HashSet<>();
|
||||
for(String name : getMembers()) {
|
||||
result.add(plugin.getFileManager().getRegion(name));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the group.
|
||||
* @return The name of the group
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the lowercase name of the group (used for getting the config etc).
|
||||
* @return The name of the group in lowercase
|
||||
*/
|
||||
public String getLowerCaseName() {
|
||||
return getName().toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a region is member of the group.
|
||||
* @param region Region to check
|
||||
* @return true if the region is in the group, otherwise false
|
||||
*/
|
||||
public boolean isMember(GeneralRegion region) {
|
||||
return getMembers().contains(region.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the priority of the group (higher overwrites).
|
||||
* @return The priority of the group
|
||||
*/
|
||||
public int getPriority() {
|
||||
return getSettings().getInt("priority");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configurationsection with the settings of this group.
|
||||
* @return The ConfigurationSection with the settings of the group
|
||||
*/
|
||||
public ConfigurationSection getSettings() {
|
||||
ConfigurationSection result = plugin.getFileManager().getGroupSettings(name);
|
||||
if(result != null) {
|
||||
return result;
|
||||
} else {
|
||||
return new YamlConfiguration();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a setting of this group.
|
||||
* @param path The path to set
|
||||
* @param setting The value to set
|
||||
*/
|
||||
public void setSetting(String path, Object setting) {
|
||||
plugin.getFileManager().setGroupSetting(this, path, setting);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicates this file needs to be saved, will actually get saved later by a task.
|
||||
*/
|
||||
public void saveRequired() {
|
||||
plugin.getFileManager().saveGroupsIsRequired();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the groups to disk now, normally saveRequired() is preferred because of performance.
|
||||
*/
|
||||
public void saveNow() {
|
||||
plugin.getFileManager().saveGroupsNow();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,762 @@
|
||||
package me.wiefferink.areashop.regions;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.events.ask.RentingRegionEvent;
|
||||
import me.wiefferink.areashop.events.ask.UnrentingRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.RentedRegionEvent;
|
||||
import me.wiefferink.areashop.events.notify.UnrentedRegionEvent;
|
||||
import me.wiefferink.areashop.tools.Utils;
|
||||
import net.milkbowl.vault.economy.EconomyResponse;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Calendar;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import static me.wiefferink.areashop.tools.Utils.millisToHumanFormat;
|
||||
|
||||
public class RentRegion extends GeneralRegion {
|
||||
private long warningsDoneUntil = Calendar.getInstance().getTimeInMillis();
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param config All settings of this region
|
||||
*/
|
||||
public RentRegion(YamlConfiguration config) {
|
||||
super(config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new RentRegion.
|
||||
* @param name The name of the region (correct casing)
|
||||
* @param world The world of the WorldGuard region
|
||||
*/
|
||||
public RentRegion(String name, World world) {
|
||||
super(name, world);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionType getType() {
|
||||
return RegionType.RENT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RegionState getState() {
|
||||
if(isRented()) {
|
||||
return RegionState.RENTED;
|
||||
} else {
|
||||
return RegionState.FORRENT;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAvailable() {
|
||||
return !isRented();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the UUID of the player renting the region.
|
||||
* @return The UUID of the renter
|
||||
*/
|
||||
public UUID getRenter() {
|
||||
String renter = config.getString("rent.renter");
|
||||
if(renter != null) {
|
||||
try {
|
||||
return UUID.fromString(renter);
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Incorrect UUID
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a player is the renter of this region.
|
||||
* @param player Player to check
|
||||
* @return true if this player rents this region, otherwise false
|
||||
*/
|
||||
public boolean isRenter(Player player) {
|
||||
return player != null && isRenter(player.getUniqueId());
|
||||
}
|
||||
|
||||
public boolean isRenter(UUID player) {
|
||||
UUID renter = getRenter();
|
||||
return !(player == null || renter == null) && renter.equals(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the renter of this region.
|
||||
* @param renter The UUID of the player that should be set as the renter
|
||||
*/
|
||||
public void setRenter(UUID renter) {
|
||||
if(renter == null) {
|
||||
setSetting("rent.renter", null);
|
||||
setSetting("rent.renterName", null);
|
||||
} else {
|
||||
setSetting("rent.renter", renter.toString());
|
||||
setSetting("rent.renterName", Utils.toName(renter));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the max number of extends of this region.
|
||||
* @return -1 if infinite otherwise the maximum number
|
||||
*/
|
||||
public int getMaxExtends() {
|
||||
return getIntegerSetting("rent.maxExtends");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get how many times the rent has already been extended.
|
||||
* @return The number of times extended
|
||||
*/
|
||||
public int getTimesExtended() {
|
||||
return config.getInt("rent.timesExtended");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the number of times the region has been extended.
|
||||
* @param times The number of times the region has been extended
|
||||
*/
|
||||
public void setTimesExtended(int times) {
|
||||
if(times < 0) {
|
||||
setSetting("rent.timesExtended", null);
|
||||
} else {
|
||||
setSetting("rent.timesExtended", times);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object provideReplacement(String variable) {
|
||||
switch(variable) {
|
||||
case AreaShop.tagPrice:
|
||||
return getFormattedPrice();
|
||||
case AreaShop.tagRawPrice:
|
||||
return getPrice();
|
||||
case AreaShop.tagDuration:
|
||||
return getDurationString();
|
||||
case AreaShop.tagPlayerName:
|
||||
return getPlayerName();
|
||||
case AreaShop.tagPlayerUUID:
|
||||
return getRenter();
|
||||
case AreaShop.tagRentedUntil:
|
||||
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatChat")).format(new Date(getRentedUntil()));
|
||||
case AreaShop.tagRentedUntilShort:
|
||||
return new SimpleDateFormat(plugin.getConfig().getString("timeFormatSign")).format(new Date(getRentedUntil()));
|
||||
case AreaShop.tagTimeLeft:
|
||||
return getTimeLeftString();
|
||||
case AreaShop.tagMoneyBackAmount:
|
||||
return getFormattedMoneyBackAmount();
|
||||
case AreaShop.tagRawMoneyBackAmount:
|
||||
return getMoneyBackAmount();
|
||||
case AreaShop.tagMoneyBackPercentage:
|
||||
return (getMoneyBackPercentage() % 1.0) == 0.0 ? (int)getMoneyBackPercentage() : getMoneyBackPercentage();
|
||||
case AreaShop.tagTimesExtended:
|
||||
return this.getTimesExtended();
|
||||
case AreaShop.tagMaxExtends:
|
||||
return this.getMaxExtends();
|
||||
case AreaShop.tagExtendsLeft:
|
||||
return getMaxExtends() - getTimesExtended();
|
||||
case AreaShop.tagMaxRentTime:
|
||||
return millisToHumanFormat(getMaxRentTime());
|
||||
case AreaShop.tagMaxInactiveTime:
|
||||
return this.getFormattedInactiveTimeUntilUnrent();
|
||||
|
||||
default:
|
||||
return super.provideReplacement(variable);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the region is rented.
|
||||
* @return true if the region is rented, otherwise false
|
||||
*/
|
||||
public boolean isRented() {
|
||||
return getRenter() != null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the player renting this region.
|
||||
* @return Name of the player renting this region, if unavailable by UUID it will return the old cached name, if that is unavailable it will return <UNKNOWN>
|
||||
*/
|
||||
public String getPlayerName() {
|
||||
String result = Utils.toName(getRenter());
|
||||
if(result == null || result.isEmpty()) {
|
||||
result = config.getString("rent.renterName");
|
||||
if(result == null || result.isEmpty()) {
|
||||
result = "<UNKNOWN>";
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the time until this region is rented (time from 1970 epoch).
|
||||
* @return The epoch time until which this region is rented
|
||||
*/
|
||||
public long getRentedUntil() {
|
||||
return getLongSetting("rent.rentedUntil");
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the time until the region is rented (milliseconds from 1970, system time).
|
||||
* @param rentedUntil The time until the region is rented
|
||||
*/
|
||||
public void setRentedUntil(Long rentedUntil) {
|
||||
if(rentedUntil == null) {
|
||||
setSetting("rent.rentedUntil", null);
|
||||
} else {
|
||||
setSetting("rent.rentedUntil", rentedUntil);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the price of the region.
|
||||
* @return The price of the region
|
||||
*/
|
||||
public double getPrice() {
|
||||
return Math.max(0, Utils.evaluateToDouble(getStringSetting("rent.price"), this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted string of the price (includes prefix and suffix).
|
||||
* @return The formatted string of the price
|
||||
*/
|
||||
public String getFormattedPrice() {
|
||||
return Utils.formatCurrency(getPrice());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the duration of 1 rent period.
|
||||
* @return The duration in milliseconds of 1 rent period
|
||||
*/
|
||||
public long getDuration() {
|
||||
return Utils.durationStringToLong(getDurationString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the duration string, includes 'number indentifier'.
|
||||
* @return The duration string
|
||||
*/
|
||||
public String getDurationString() {
|
||||
return getStringSetting("rent.duration");
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the time that is left on the region.
|
||||
* @return The time left on the region
|
||||
*/
|
||||
public long getTimeLeft() {
|
||||
if(isRented()) {
|
||||
return this.getRentedUntil() - Calendar.getInstance().getTimeInMillis();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a formatted string indicating the rent time that is left.
|
||||
* @return Time left on the rent, for example '29 days', '3 months', '1 second'
|
||||
*/
|
||||
public String getTimeLeftString() {
|
||||
return Utils.millisToHumanFormat(getTimeLeft());
|
||||
}
|
||||
|
||||
/**
|
||||
* Minutes until automatic unrent when player is offline.
|
||||
* @return The number of milliseconds until the region is unrented while player is offline
|
||||
*/
|
||||
public long getInactiveTimeUntilUnrent() {
|
||||
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.inactiveTimeUntilUnrent"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a human readable string indicating how long the player can be offline until automatic unrent.
|
||||
* @return String indicating the inactive time until unrent
|
||||
*/
|
||||
public String getFormattedInactiveTimeUntilUnrent() {
|
||||
return Utils.millisToHumanFormat(getInactiveTimeUntilUnrent());
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the price of the region.
|
||||
* @param price The price of the region
|
||||
*/
|
||||
public void setPrice(Double price) {
|
||||
setSetting("rent.price", price);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the duration of the rent.
|
||||
* @param duration The duration of the rent (as specified on the documentation pages)
|
||||
*/
|
||||
public void setDuration(String duration) {
|
||||
setSetting("rent.duration", duration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the moneyBack percentage.
|
||||
* @return The % of money the player will get back when unrenting
|
||||
*/
|
||||
public double getMoneyBackPercentage() {
|
||||
return Utils.evaluateToDouble(getStringSetting("rent.moneyBack"), this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of money that should be paid to the player when unrenting the region.
|
||||
* @return The amount of money the player should get back
|
||||
*/
|
||||
public double getMoneyBackAmount() {
|
||||
Long currentTime = Calendar.getInstance().getTimeInMillis();
|
||||
Double timeLeft = (double)((getRentedUntil() - currentTime));
|
||||
double percentage = (getMoneyBackPercentage()) / 100.0;
|
||||
Double timePeriod = (double)(getDuration());
|
||||
double periods = timeLeft / timePeriod;
|
||||
return Math.max(0, periods * getPrice() * percentage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted string of the amount of the moneyBack amount.
|
||||
* @return String with currency symbols and proper fractional part
|
||||
*/
|
||||
public String getFormattedMoneyBackAmount() {
|
||||
return Utils.formatCurrency(getMoneyBackAmount());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the maximum time the player can rent the region in advance (milliseconds).
|
||||
* @return The maximum rent time in milliseconds
|
||||
*/
|
||||
public long getMaxRentTime() {
|
||||
return Utils.getDurationFromMinutesOrStringInput(getStringSetting("rent.maxRentTime"));
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the rent should expire.
|
||||
* @return true if the rent has expired and has been unrented, false otherwise
|
||||
*/
|
||||
public boolean checkExpiration() {
|
||||
long now = Calendar.getInstance().getTimeInMillis();
|
||||
if(!isDeleted() && isRented() && now > getRentedUntil()) {
|
||||
// Extend rent if configured for that
|
||||
if(getBooleanSetting("rent.autoExtend")) {
|
||||
if(extend()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Send message to the player if online
|
||||
Player player = Bukkit.getPlayer(getRenter());
|
||||
if(unRent(false, null)) {
|
||||
if(player != null) {
|
||||
message(player, "unrent-expired");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the expiration warnings from the selected profile which is specified in the config.
|
||||
* Sends all warnings since previous call until (now + normal delay), delay can be found in the config as well.
|
||||
*/
|
||||
public void sendExpirationWarnings() {
|
||||
// Send from warningsDoneUntil to current+delay
|
||||
if(isDeleted() || !isRented()) {
|
||||
return;
|
||||
}
|
||||
ConfigurationSection profileSection = getConfigurationSectionSetting("rent.expirationWarningProfile", "expirationWarningProfiles");
|
||||
if(profileSection == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if a warning needs to be send for each defined point in time
|
||||
Player player = Bukkit.getPlayer(getRenter());
|
||||
long sendUntil = Calendar.getInstance().getTimeInMillis() + (plugin.getConfig().getInt("expireWarning.delay") * 60 * 1000);
|
||||
for(String timeBefore : profileSection.getKeys(false)) {
|
||||
long timeBeforeParsed = Utils.durationStringToLong(timeBefore);
|
||||
if(timeBeforeParsed <= 0) {
|
||||
return;
|
||||
}
|
||||
long checkTime = getRentedUntil() - timeBeforeParsed;
|
||||
|
||||
if(checkTime > warningsDoneUntil && checkTime <= sendUntil) {
|
||||
List<String> commands;
|
||||
if(profileSection.isConfigurationSection(timeBefore)) {
|
||||
/* Legacy config layout:
|
||||
* "1 minute":
|
||||
* warnPlayer: true
|
||||
* commands: ["say hi"]
|
||||
*/
|
||||
commands = profileSection.getStringList(timeBefore + ".commands");
|
||||
// Warn player
|
||||
if(profileSection.getBoolean(timeBefore + ".warnPlayer") && player != null) {
|
||||
message(player, "rent-expireWarning");
|
||||
}
|
||||
} else {
|
||||
commands = profileSection.getStringList(timeBefore);
|
||||
}
|
||||
this.runCommands(Bukkit.getConsoleSender(), commands);
|
||||
}
|
||||
}
|
||||
warningsDoneUntil = sendUntil;
|
||||
}
|
||||
|
||||
/**
|
||||
* Try to extend the rent for the current owner, respecting all restrictions.
|
||||
* @return true if successful, otherwise false
|
||||
*/
|
||||
public boolean extend() {
|
||||
if(!isRented()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(getRenter());
|
||||
return offlinePlayer != null && rent(offlinePlayer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rent a region.
|
||||
* @param offlinePlayer The player that wants to rent the region
|
||||
* @return true if it succeeded and false if not
|
||||
*/
|
||||
public boolean rent(OfflinePlayer offlinePlayer) {
|
||||
if(plugin.getEconomy() == null) {
|
||||
message(offlinePlayer, "general-noEconomy");
|
||||
return false;
|
||||
}
|
||||
//Check if the player has permission
|
||||
if(plugin.hasPermission(offlinePlayer, "areashop.rent")) {
|
||||
if(getWorld() == null) {
|
||||
message(offlinePlayer, "general-noWorld");
|
||||
return false;
|
||||
}
|
||||
if(getRegion() == null) {
|
||||
message(offlinePlayer, "general-noRegion");
|
||||
return false;
|
||||
}
|
||||
boolean extend = false;
|
||||
if(getRenter() != null && offlinePlayer.getUniqueId().equals(getRenter())) {
|
||||
extend = true;
|
||||
}
|
||||
// Check if the region is available for renting or if the player wants to extend the rent
|
||||
if(!isRented() || extend) {
|
||||
// These checks are only relevant for online players doing the renting/buying themselves
|
||||
Player player = offlinePlayer.getPlayer();
|
||||
if(player != null) {
|
||||
// Check if the players needs to be in the region for renting
|
||||
if(restrictedToRegion() && (!player.getWorld().getName().equals(getWorldName())
|
||||
|| !getRegion().contains(player.getLocation().getBlockX(), player.getLocation().getBlockY(), player.getLocation().getBlockZ()))) {
|
||||
message(offlinePlayer, "rent-restrictedToRegion");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the players needs to be in the world for renting
|
||||
if(restrictedToWorld() && !player.getWorld().getName().equals(getWorldName())) {
|
||||
message(offlinePlayer, "rent-restrictedToWorld", player.getWorld().getName());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check region limits if this is not extending
|
||||
if(!(extend && config.getBoolean("allowRegionExtendsWhenAboveLimits"))) {
|
||||
|
||||
LimitResult limitResult;
|
||||
if(extend) {
|
||||
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer, true);
|
||||
} else {
|
||||
limitResult = this.limitsAllow(RegionType.RENT, offlinePlayer);
|
||||
}
|
||||
AreaShop.debug("LimitResult: " + limitResult.toString());
|
||||
if(!limitResult.actionAllowed()) {
|
||||
if(limitResult.getLimitingFactor() == LimitType.TOTAL) {
|
||||
message(offlinePlayer, "total-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
|
||||
return false;
|
||||
}
|
||||
if(limitResult.getLimitingFactor() == LimitType.RENTS) {
|
||||
message(offlinePlayer, "rent-maximum", limitResult.getMaximum(), limitResult.getCurrent(), limitResult.getLimitingGroup());
|
||||
return false;
|
||||
}
|
||||
if(limitResult.getLimitingFactor() == LimitType.EXTEND) {
|
||||
message(offlinePlayer, "rent-maximumExtend", limitResult.getMaximum(), limitResult.getCurrent() + 1, limitResult.getLimitingGroup());
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if the player can still extend this rent
|
||||
if(extend && !plugin.hasPermission(offlinePlayer, "areashop.rentextendbypass")) {
|
||||
if(getMaxExtends() >= 0 && getTimesExtended() >= getMaxExtends()) {
|
||||
message(offlinePlayer, "rent-maxExtends");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if there is enough time left before hitting maxRentTime
|
||||
boolean extendToMax = false;
|
||||
double price = getPrice();
|
||||
long timeNow = Calendar.getInstance().getTimeInMillis();
|
||||
long timeRented = 0;
|
||||
long maxRentTime = getMaxRentTime();
|
||||
if(isRented()) {
|
||||
timeRented = getRentedUntil() - timeNow;
|
||||
}
|
||||
if((timeRented + getDuration()) > (maxRentTime)
|
||||
&& !plugin.hasPermission(offlinePlayer, "areashop.renttimebypass")
|
||||
&& maxRentTime != -1) {
|
||||
// Extend to the maximum instead of adding a full period
|
||||
if(getBooleanSetting("rent.extendToFullWhenAboveMaxRentTime")) {
|
||||
if(timeRented >= maxRentTime) {
|
||||
message(offlinePlayer, "rent-alreadyAtFull");
|
||||
return false;
|
||||
} else {
|
||||
long toRentPart = maxRentTime - timeRented;
|
||||
extendToMax = true;
|
||||
price = ((double)toRentPart) / getDuration() * price;
|
||||
}
|
||||
} else {
|
||||
message(offlinePlayer, "rent-maxRentTime");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(plugin.getEconomy().has(offlinePlayer, getWorldName(), price)) {
|
||||
// Broadcast and check event
|
||||
RentingRegionEvent event = new RentingRegionEvent(this, offlinePlayer, extend);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
message(offlinePlayer, "general-cancelled", event.getReason());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Substract the money from the players balance
|
||||
EconomyResponse r = plugin.getEconomy().withdrawPlayer(offlinePlayer, getWorldName(), price);
|
||||
if(!r.transactionSuccess()) {
|
||||
message(offlinePlayer, "rent-payError");
|
||||
AreaShop.debug("Something went wrong with getting money from " + offlinePlayer.getName() + " while renting " + getName() + ": " + r.errorMessage);
|
||||
return false;
|
||||
}
|
||||
// Optionally give money to the landlord
|
||||
OfflinePlayer landlordPlayer = null;
|
||||
if(getLandlord() != null) {
|
||||
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
|
||||
}
|
||||
String landlordName = getLandlordName();
|
||||
if(landlordName != null) {
|
||||
if(landlordPlayer != null && landlordPlayer.getName() != null) {
|
||||
r = plugin.getEconomy().depositPlayer(landlordPlayer, getWorldName(), price);
|
||||
} else {
|
||||
r = plugin.getEconomy().depositPlayer(landlordName, getWorldName(), price);
|
||||
}
|
||||
if(r == null || !r.transactionSuccess()) {
|
||||
AreaShop.warn("Something went wrong with paying '" + landlordName + "' " + Utils.formatCurrency(price) + " for his rent of region " + getName() + " to " + offlinePlayer.getName());
|
||||
}
|
||||
}
|
||||
|
||||
if(!extend) {
|
||||
// Run commands
|
||||
runEventCommands(RegionEvent.RENTED, true);
|
||||
} else {
|
||||
// Run commands
|
||||
runEventCommands(RegionEvent.EXTENDED, true);
|
||||
}
|
||||
|
||||
// Get the time until the region will be rented
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
if(extendToMax) {
|
||||
calendar.setTimeInMillis(calendar.getTimeInMillis() + getMaxRentTime());
|
||||
} else if(extend) {
|
||||
calendar.setTimeInMillis(getRentedUntil() + getDuration());
|
||||
} else {
|
||||
calendar.setTimeInMillis(calendar.getTimeInMillis() + getDuration());
|
||||
}
|
||||
|
||||
// Add values to the rent and send it to FileManager
|
||||
setRentedUntil(calendar.getTimeInMillis());
|
||||
setRenter(offlinePlayer.getUniqueId());
|
||||
updateLastActiveTime();
|
||||
|
||||
// Fire schematic event and updated times extended
|
||||
if(!extend) {
|
||||
this.handleSchematicEvent(RegionEvent.RENTED);
|
||||
setTimesExtended(0);
|
||||
} else {
|
||||
setTimesExtended(getTimesExtended() + 1);
|
||||
}
|
||||
|
||||
// Notify about updates
|
||||
this.notifyAndUpdate(new RentedRegionEvent(this, extend));
|
||||
|
||||
// Send message to the player
|
||||
if(extendToMax) {
|
||||
message(offlinePlayer, "rent-extendedToMax");
|
||||
} else if(extend) {
|
||||
message(offlinePlayer, "rent-extended");
|
||||
} else {
|
||||
message(offlinePlayer, "rent-rented");
|
||||
}
|
||||
if(!extend) {
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.RENTED, false);
|
||||
} else {
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.EXTENDED, false);
|
||||
}
|
||||
return true;
|
||||
} else {
|
||||
// Player has not enough money
|
||||
if(extend) {
|
||||
message(offlinePlayer, "rent-lowMoneyExtend", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
|
||||
} else {
|
||||
message(offlinePlayer, "rent-lowMoneyRent", Utils.formatCurrency(plugin.getEconomy().getBalance(offlinePlayer, getWorldName())));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
message(offlinePlayer, "rent-someoneElse");
|
||||
}
|
||||
} else {
|
||||
message(offlinePlayer, "rent-noPermission");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unrent a region, reset to unrented.
|
||||
* @param giveMoneyBack true if money should be given back to the player, false otherwise
|
||||
* @param executor The CommandSender that should get the cancelled message if there is any, or null
|
||||
* @return true if unrenting succeeded, othwerwise false
|
||||
*/
|
||||
@SuppressWarnings("deprecation")
|
||||
public boolean unRent(boolean giveMoneyBack, CommandSender executor) {
|
||||
boolean own = executor instanceof Player && this.isRenter((Player) executor);
|
||||
if(executor != null) {
|
||||
if(!executor.hasPermission("areashop.unrent") && !own) {
|
||||
message(executor, "unrent-noPermissionOther");
|
||||
return false;
|
||||
}
|
||||
if(!executor.hasPermission("areashop.unrent") && !executor.hasPermission("areashop.unrentown") && own) {
|
||||
message(executor, "unrent-noPermission");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if(plugin.getEconomy() == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Broadcast and check event
|
||||
UnrentingRegionEvent event = new UnrentingRegionEvent(this);
|
||||
Bukkit.getPluginManager().callEvent(event);
|
||||
if(event.isCancelled()) {
|
||||
message(executor, "general-cancelled", event.getReason());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.UNRENTED, true);
|
||||
double moneyBack = getMoneyBackAmount();
|
||||
if(moneyBack > 0 && giveMoneyBack) {
|
||||
boolean noPayBack = false;
|
||||
OfflinePlayer landlordPlayer = null;
|
||||
if(getLandlord() != null) {
|
||||
landlordPlayer = Bukkit.getOfflinePlayer(getLandlord());
|
||||
}
|
||||
String landlordName = getLandlordName();
|
||||
EconomyResponse r;
|
||||
if(landlordName != null) {
|
||||
if(landlordPlayer != null && landlordPlayer.getName() != null) {
|
||||
r = plugin.getEconomy().withdrawPlayer(landlordPlayer, getWorldName(), moneyBack);
|
||||
} else {
|
||||
r = plugin.getEconomy().withdrawPlayer(landlordName, getWorldName(), moneyBack);
|
||||
}
|
||||
if(r == null || !r.transactionSuccess()) {
|
||||
noPayBack = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Give back the money
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
|
||||
if(player != null && !noPayBack) {
|
||||
r = null;
|
||||
boolean error = false;
|
||||
try {
|
||||
if(player.getName() != null) {
|
||||
r = plugin.getEconomy().depositPlayer(player, getWorldName(), moneyBack);
|
||||
} else if(getPlayerName() != null) {
|
||||
r = plugin.getEconomy().depositPlayer(getPlayerName(), getWorldName(), moneyBack);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
error = true;
|
||||
}
|
||||
if(error || r == null || !r.transactionSuccess()) {
|
||||
AreaShop.warn("Something went wrong with paying back to " + getPlayerName() + " money while unrenting region " + getName());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Send messages
|
||||
message(executor, "unrent-unrented");
|
||||
|
||||
// Handle schematic save/restore (while %uuid% is still available)
|
||||
handleSchematicEvent(RegionEvent.UNRENTED);
|
||||
|
||||
// Remove friends, the owner and renteduntil values
|
||||
getFriendsFeature().clearFriends();
|
||||
UUID oldRenter = getRenter();
|
||||
setRenter(null);
|
||||
setRentedUntil(null);
|
||||
setTimesExtended(-1);
|
||||
removeLastActiveTime();
|
||||
|
||||
// Notify about updates
|
||||
this.notifyAndUpdate(new UnrentedRegionEvent(this, oldRenter, Math.max(0, moneyBack)));
|
||||
|
||||
// Run commands
|
||||
this.runEventCommands(RegionEvent.UNRENTED, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean checkInactive() {
|
||||
if(isDeleted() || !isRented()) {
|
||||
return false;
|
||||
}
|
||||
long inactiveSetting = getInactiveTimeUntilUnrent();
|
||||
OfflinePlayer player = Bukkit.getOfflinePlayer(getRenter());
|
||||
if(inactiveSetting <= 0 || player.isOp()) {
|
||||
return false;
|
||||
}
|
||||
long lastPlayed = getLastActiveTime();
|
||||
//AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis()-player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
|
||||
if(Calendar.getInstance().getTimeInMillis() > (lastPlayed + inactiveSetting)) {
|
||||
AreaShop.info("Region " + getName() + " unrented because of inactivity for player " + getPlayerName());
|
||||
AreaShop.debug("currentTime=" + Calendar.getInstance().getTimeInMillis() + ", getLastPlayed()=" + lastPlayed + ", timeInactive=" + (Calendar.getInstance().getTimeInMillis() - player.getLastPlayed()) + ", inactiveSetting=" + inactiveSetting);
|
||||
return this.unRent(true, null);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,147 @@
|
||||
package me.wiefferink.areashop.tools;
|
||||
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import org.bstats.Metrics;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
public class Analytics {
|
||||
|
||||
/**
|
||||
* Start analytics tracking.
|
||||
*/
|
||||
public static void start() {
|
||||
// Legacy MCstats statistics (remove at some point)
|
||||
try {
|
||||
new me.wiefferink.areashop.lib.Metrics(AreaShop.getInstance()).start();
|
||||
AreaShop.debug("Started mcstats.org statistics service");
|
||||
} catch(Exception e) {
|
||||
AreaShop.debug("Could not start mcstats.org statistics service");
|
||||
}
|
||||
|
||||
// bStats statistics
|
||||
try {
|
||||
Metrics metrics = new Metrics(AreaShop.getInstance());
|
||||
|
||||
// Number of regions
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return AreaShop.getInstance().getFileManager().getRegions().size();
|
||||
}
|
||||
});
|
||||
|
||||
// Number of rental regions
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("rental_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return AreaShop.getInstance().getFileManager().getRents().size();
|
||||
}
|
||||
});
|
||||
|
||||
// Number of buy regions
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("buy_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return AreaShop.getInstance().getFileManager().getBuys().size();
|
||||
}
|
||||
});
|
||||
|
||||
// Language
|
||||
metrics.addCustomChart(new Metrics.SimplePie("language") {
|
||||
@Override
|
||||
public String getValue() {
|
||||
return AreaShop.getInstance().getConfig().getString("language");
|
||||
}
|
||||
});
|
||||
|
||||
// Pie with region states
|
||||
metrics.addCustomChart(new Metrics.AdvancedPie("region_state") {
|
||||
@Override
|
||||
public HashMap<String, Integer> getValues(HashMap<String, Integer> result) {
|
||||
RegionStateStats stats = getStateStats();
|
||||
result.put("For Rent", stats.forrent);
|
||||
result.put("Rented", stats.rented);
|
||||
result.put("For Sale", stats.forsale);
|
||||
result.put("Sold", stats.sold);
|
||||
result.put("Reselling", stats.reselling);
|
||||
return result;
|
||||
}
|
||||
});
|
||||
|
||||
// Time series of each region state
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("forrent_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return getStateStats().forrent;
|
||||
}
|
||||
});
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("rented_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return getStateStats().rented;
|
||||
}
|
||||
});
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("forsale_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return getStateStats().forsale;
|
||||
}
|
||||
});
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("sold_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return getStateStats().sold;
|
||||
}
|
||||
});
|
||||
metrics.addCustomChart(new Metrics.SingleLineChart("reselling_region_count") {
|
||||
@Override
|
||||
public int getValue() {
|
||||
return getStateStats().reselling;
|
||||
}
|
||||
});
|
||||
|
||||
// TODO track rent/buy/unrent/sell/resell actions (so that it can be reported per collection interval)
|
||||
|
||||
AreaShop.debug("Started bstats.org statistics service");
|
||||
} catch(Exception e) {
|
||||
AreaShop.debug("Could not start bstats.org statistics service");
|
||||
}
|
||||
}
|
||||
|
||||
private static class RegionStateStats {
|
||||
int forrent = 0;
|
||||
int forsale = 0;
|
||||
int rented = 0;
|
||||
int sold = 0;
|
||||
int reselling = 0;
|
||||
}
|
||||
|
||||
private static RegionStateStats getStateStats() {
|
||||
RegionStateStats result = new RegionStateStats();
|
||||
for(GeneralRegion region : AreaShop.getInstance().getFileManager().getRegions()) {
|
||||
if(region instanceof RentRegion) {
|
||||
RentRegion rent = (RentRegion)region;
|
||||
if(rent.isAvailable()) {
|
||||
result.forrent++;
|
||||
} else {
|
||||
result.rented++;
|
||||
}
|
||||
} else if(region instanceof BuyRegion) {
|
||||
BuyRegion buy = (BuyRegion)region;
|
||||
if(buy.isAvailable()) {
|
||||
result.forsale++;
|
||||
} else if(buy.isInResellingMode()) {
|
||||
result.reselling++;
|
||||
} else {
|
||||
result.sold++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,251 @@
|
||||
package me.wiefferink.areashop.tools;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.apache.commons.lang.exception.ExceptionUtils;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
import org.json.simple.JSONObject;
|
||||
import org.json.simple.JSONValue;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
import java.net.MalformedURLException;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.Arrays;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class GithubUpdateCheck {
|
||||
|
||||
public static final String API_HOST = "https://api.github.com/repos";
|
||||
public static final String API_LATEST_RELEASE = "releases/latest";
|
||||
public static final String USER_AGENT = "GithubUpdateCheck by NLThijs48";
|
||||
public static final boolean DEBUG = false;
|
||||
|
||||
private final String author;
|
||||
private final String repository;
|
||||
private final Plugin plugin;
|
||||
private final Logger logger;
|
||||
private URL url;
|
||||
private VersionComparator versionComparator;
|
||||
|
||||
// Status
|
||||
private boolean checking;
|
||||
private boolean error;
|
||||
private boolean hasUpdate;
|
||||
private String latestVersion;
|
||||
private final String currentVersion;
|
||||
|
||||
/**
|
||||
* Create a new GithubUpdateCheck with the required information.
|
||||
* @param plugin The plugin to create it for (used for logging and checking version)
|
||||
* @param author The author of the plugin as used on Github
|
||||
* @param repository The repository name of the plugin on Github
|
||||
*/
|
||||
public GithubUpdateCheck(Plugin plugin, String author, String repository) {
|
||||
this.plugin = plugin;
|
||||
this.logger = plugin.getLogger();
|
||||
this.author = author;
|
||||
this.repository = repository;
|
||||
this.currentVersion = plugin.getDescription().getVersion();
|
||||
this.versionComparator = (latestVersion, currentVersion) ->
|
||||
!latestVersion.equalsIgnoreCase(currentVersion);
|
||||
|
||||
this.checking = false;
|
||||
this.error = false;
|
||||
this.hasUpdate = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the version comparator.
|
||||
* @param versionComparator VersionComparator to use for checking if one version is newer than the other
|
||||
* @return this
|
||||
*/
|
||||
public GithubUpdateCheck withVersionComparator(VersionComparator versionComparator) {
|
||||
this.versionComparator = versionComparator;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an update is available.
|
||||
*/
|
||||
public void checkUpdate() {
|
||||
checkUpdate(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an update is available.
|
||||
* @param callback Callback to execute when the update check is done
|
||||
* @return GithubUpdateCheck containing the status of the check
|
||||
*/
|
||||
public GithubUpdateCheck checkUpdate(UpdateCallback callback) {
|
||||
checking = true;
|
||||
final GithubUpdateCheck self = this;
|
||||
// Check for update on asyn thread
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
try {
|
||||
String rawUrl = API_HOST + "/" + author + "/" + repository + "/" + API_LATEST_RELEASE;
|
||||
url = new URL(rawUrl);
|
||||
} catch(MalformedURLException e) {
|
||||
logger.severe("Invalid url: '" + url + "', are the author '" + author + "' and repository '" + repository + "' correct?");
|
||||
error = true;
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
URLConnection conn = url.openConnection();
|
||||
// Give up after 15 seconds
|
||||
conn.setConnectTimeout(15000);
|
||||
// Identify ourselves
|
||||
conn.addRequestProperty("User-Agent", USER_AGENT);
|
||||
// Make sure we access the correct api version
|
||||
conn.addRequestProperty("Accept", "application/vnd.github.v3+json");
|
||||
// We want to read the result
|
||||
conn.setDoOutput(true);
|
||||
// Open connection
|
||||
try(BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
|
||||
String response = reader.readLine();
|
||||
debug("Response:", response);
|
||||
|
||||
JSONObject latestRelease = (JSONObject)JSONValue.parse(response);
|
||||
|
||||
if(latestRelease.isEmpty()) {
|
||||
logger.warning("Failed to get api response from " + url);
|
||||
error = true;
|
||||
return;
|
||||
}
|
||||
debug("json: " + latestRelease.toJSONString());
|
||||
|
||||
// Latest version
|
||||
latestVersion = (String)latestRelease.get("tag_name");
|
||||
debug("Tag name:", latestVersion);
|
||||
|
||||
// Current version
|
||||
debug("Plugin version:", currentVersion);
|
||||
|
||||
// Compare version
|
||||
hasUpdate = versionComparator.isNewer(latestVersion, currentVersion);
|
||||
}
|
||||
} catch(IOException e) {
|
||||
logger.severe("Failed to get latest release:" + ExceptionUtils.getStackTrace(e));
|
||||
error = true;
|
||||
} catch(ClassCastException e) {
|
||||
logger.info("Unexpected structure of the result, failed to parse it");
|
||||
error = true;
|
||||
}
|
||||
} finally {
|
||||
checking = false;
|
||||
debug("result:", self);
|
||||
if(callback != null) {
|
||||
// Switch back to main thread and call the callback
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
callback.run(self);
|
||||
}
|
||||
}.runTask(plugin);
|
||||
}
|
||||
}
|
||||
}
|
||||
}.runTaskAsynchronously(plugin);
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an update check is running.
|
||||
* @return true if an update check is running
|
||||
*/
|
||||
public boolean isChecking() {
|
||||
return checking;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the update check failed.
|
||||
* @return true if the update check failed (an error message has been logged)
|
||||
*/
|
||||
public boolean hasFailed() {
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an update has been found.
|
||||
* @return true if an update has been found
|
||||
*/
|
||||
public boolean hasUpdate() {
|
||||
return hasUpdate;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the repository that this update checker is checking.
|
||||
* @return Used repository
|
||||
*/
|
||||
public String getRepository() {
|
||||
return repository;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the author that this update checker is checking.
|
||||
* @return Used author
|
||||
*/
|
||||
public String getAuthor() {
|
||||
return author;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current version.
|
||||
* @return Current version of the plugin
|
||||
*/
|
||||
public String getCurrentVersion() {
|
||||
return currentVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest version.
|
||||
* @return Latest version of the plugin (if checking is complete)
|
||||
*/
|
||||
public String getLatestVersion() {
|
||||
return latestVersion;
|
||||
}
|
||||
|
||||
public interface VersionComparator {
|
||||
/**
|
||||
* Check if a version should be considered 'newer' than another.
|
||||
* @param latestVersion Version that is available on Github
|
||||
* @param currentVersion Version of the current plugin
|
||||
* @return true if the latestVersion is newer than the localVersion, otherwise false
|
||||
*/
|
||||
boolean isNewer(String latestVersion, String currentVersion);
|
||||
}
|
||||
|
||||
public interface UpdateCallback {
|
||||
void run(GithubUpdateCheck result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a debug message if DEBUG is enabled.
|
||||
* @param message Message to print
|
||||
*/
|
||||
private void debug(Object... message) {
|
||||
if(DEBUG) {
|
||||
logger.info("[" + this.getClass().getSimpleName() + "] [DEBUG] " + StringUtils.join(message, " "));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "GithubUpdateCheck(" + StringUtils.join(Arrays.asList(
|
||||
"author=" + author,
|
||||
"repository=" + repository,
|
||||
"plugin=" + plugin.getName(),
|
||||
"checking=" + checking,
|
||||
"hasUpdate=" + hasUpdate,
|
||||
"error=" + error,
|
||||
"currentVersion=" + currentVersion,
|
||||
"latestVersion=" + latestVersion
|
||||
), ", ") + ")";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,848 @@
|
||||
package me.wiefferink.areashop.tools;
|
||||
|
||||
import com.sk89q.worldedit.BlockVector;
|
||||
import com.sk89q.worldguard.protection.managers.RegionManager;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import me.wiefferink.areashop.AreaShop;
|
||||
import me.wiefferink.areashop.interfaces.WorldEditSelection;
|
||||
import me.wiefferink.areashop.regions.BuyRegion;
|
||||
import me.wiefferink.areashop.regions.GeneralRegion;
|
||||
import me.wiefferink.areashop.regions.RentRegion;
|
||||
import me.wiefferink.interactivemessenger.Log;
|
||||
import me.wiefferink.interactivemessenger.processing.Message;
|
||||
import org.apache.commons.lang.exception.ExceptionUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.configuration.Configuration;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
|
||||
public class Utils {
|
||||
|
||||
// Not used
|
||||
private Utils() {
|
||||
}
|
||||
|
||||
private static YamlConfiguration config;
|
||||
private static Set<String> identifiers;
|
||||
private static Set<String> seconds;
|
||||
private static Set<String> minutes;
|
||||
private static Set<String> hours;
|
||||
private static Set<String> days;
|
||||
private static Set<String> weeks;
|
||||
private static Set<String> months;
|
||||
private static Set<String> years;
|
||||
private static ScriptEngine scriptEngine;
|
||||
private static Map<Double, String> suffixes;
|
||||
|
||||
/**
|
||||
* Initialize the utilities class with constants.
|
||||
* @param pluginConfig The config of the plugin
|
||||
*/
|
||||
public static void initialize(YamlConfiguration pluginConfig) {
|
||||
config = pluginConfig;
|
||||
|
||||
// Setup individual identifiers
|
||||
seconds = getSetAndDefaults("seconds");
|
||||
minutes = getSetAndDefaults("minutes");
|
||||
hours = getSetAndDefaults("hours");
|
||||
days = getSetAndDefaults("days");
|
||||
weeks = getSetAndDefaults("weeks");
|
||||
months = getSetAndDefaults("months");
|
||||
years = getSetAndDefaults("years");
|
||||
// Setup all time identifiers
|
||||
identifiers = new HashSet<>();
|
||||
identifiers.addAll(seconds);
|
||||
identifiers.addAll(minutes);
|
||||
identifiers.addAll(hours);
|
||||
identifiers.addAll(days);
|
||||
identifiers.addAll(weeks);
|
||||
identifiers.addAll(months);
|
||||
identifiers.addAll(years);
|
||||
|
||||
suffixes = new HashMap<>();
|
||||
// This stuff should not be necessary, but it is, getConfigurationSection() does not do proper fallback to defaults!
|
||||
// TODO: Create a custom configuration that fixes this behavior
|
||||
ConfigurationSection suffixesSection = null;
|
||||
if(config.isSet("metricSymbols")) {
|
||||
suffixesSection = config.getConfigurationSection("metricSymbols");
|
||||
} else {
|
||||
Configuration defaults = config.getDefaults();
|
||||
if(defaults != null) {
|
||||
suffixesSection = defaults.getConfigurationSection("metricSymbols");
|
||||
}
|
||||
}
|
||||
if(suffixesSection != null) {
|
||||
for(String key : suffixesSection.getKeys(false)) {
|
||||
try {
|
||||
suffixes.put(Double.parseDouble(key), suffixesSection.getString(key));
|
||||
} catch(NumberFormatException e) {
|
||||
Log.warn("Key '" + key + "' in the metricSymbols section of config.yml is not a number!");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a string list from the config, combined with the entries specified in the default config.
|
||||
* @param path The path to read the lists from
|
||||
* @return List with all values defined in the config and the default config combined
|
||||
*/
|
||||
private static Set<String> getSetAndDefaults(String path) {
|
||||
Set<String> result = new HashSet<>(config.getStringList(path));
|
||||
ConfigurationSection defaults = config.getDefaults();
|
||||
if(defaults != null) {
|
||||
result.addAll(defaults.getStringList(path));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a message with a list of parts.
|
||||
* @param replacements The parts to use
|
||||
* @param messagePart The message to use for the parts
|
||||
* @return A Message object containing the parts combined into one message
|
||||
*/
|
||||
public static Message combinedMessage(Collection<?> replacements, String messagePart) {
|
||||
return combinedMessage(replacements, messagePart, ", ");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a message with a list of parts.
|
||||
* @param replacements The parts to use
|
||||
* @param messagePart The message to use for the parts
|
||||
* @param combiner The string to use as combiner
|
||||
* @return A Message object containing the parts combined into one message
|
||||
*/
|
||||
public static Message combinedMessage(Collection<?> replacements, String messagePart, String combiner) {
|
||||
Message result = Message.empty();
|
||||
boolean first = true;
|
||||
for(Object part : replacements) {
|
||||
if(first) {
|
||||
first = false;
|
||||
} else {
|
||||
result.append(combiner);
|
||||
}
|
||||
result.append(Message.fromKey(messagePart).replacements(part));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the online players.
|
||||
* Provides backwards compatibility for 1.7- where it returns an array
|
||||
* @return Online players
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static Collection<? extends Player> getOnlinePlayers() {
|
||||
try {
|
||||
Method onlinePlayerMethod = Server.class.getMethod("getOnlinePlayers");
|
||||
if(onlinePlayerMethod.getReturnType().equals(Collection.class)) {
|
||||
return ((Collection<? extends Player>)onlinePlayerMethod.invoke(Bukkit.getServer()));
|
||||
} else {
|
||||
return Arrays.asList((Player[])onlinePlayerMethod.invoke(Bukkit.getServer()));
|
||||
}
|
||||
} catch(Exception ex) {
|
||||
AreaShop.debug("getOnlinePlayers error: " + ex.getMessage());
|
||||
}
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a map from a location, to save it in the config.
|
||||
* @param location The location to transform
|
||||
* @param setPitchYaw true to save the pitch and yaw, otherwise false
|
||||
* @return The map with the location values
|
||||
*/
|
||||
public static ConfigurationSection locationToConfig(Location location, boolean setPitchYaw) {
|
||||
if(location == null) {
|
||||
return null;
|
||||
}
|
||||
ConfigurationSection result = new YamlConfiguration();
|
||||
result.set("world", location.getWorld().getName());
|
||||
result.set("x", location.getX());
|
||||
result.set("y", location.getY());
|
||||
result.set("z", location.getZ());
|
||||
if(setPitchYaw) {
|
||||
result.set("yaw", Float.toString(location.getYaw()));
|
||||
result.set("pitch", Float.toString(location.getPitch()));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a map from a location, to save it in the config (without pitch and yaw).
|
||||
* @param location The location to transform
|
||||
* @return The map with the location values
|
||||
*/
|
||||
public static ConfigurationSection locationToConfig(Location location) {
|
||||
return locationToConfig(location, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a location from a map, reconstruction from the config values.
|
||||
* @param config The config section to reconstruct from
|
||||
* @return The location
|
||||
*/
|
||||
public static Location configToLocation(ConfigurationSection config) {
|
||||
if(config == null
|
||||
|| !config.isString("world")
|
||||
|| !config.isDouble("x")
|
||||
|| !config.isDouble("y")
|
||||
|| !config.isDouble("z")
|
||||
|| Bukkit.getWorld(config.getString("world")) == null) {
|
||||
return null;
|
||||
}
|
||||
Location result = new Location(
|
||||
Bukkit.getWorld(config.getString("world")),
|
||||
config.getDouble("x"),
|
||||
config.getDouble("y"),
|
||||
config.getDouble("z"));
|
||||
if(config.isString("yaw") && config.isString("pitch")) {
|
||||
result.setPitch(Float.parseFloat(config.getString("pitch")));
|
||||
result.setYaw(Float.parseFloat(config.getString("yaw")));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a comma-separated list.
|
||||
* @param input Collection of object which should be concatenated with comma's in between (skipping null values)
|
||||
* @return Innput object concatenated with comma's in between
|
||||
*/
|
||||
public static String createCommaSeparatedList(Collection<?> input) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
boolean first = true;
|
||||
for(Object object : input) {
|
||||
if(object != null) {
|
||||
if(first) {
|
||||
first = false;
|
||||
result.append(object.toString());
|
||||
} else {
|
||||
result.append(", ").append(object.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert milliseconds to ticks.
|
||||
* @param milliseconds Milliseconds to convert
|
||||
* @return milliseconds divided by 50 (20 ticks per second)
|
||||
*/
|
||||
public static long millisToTicks(long milliseconds) {
|
||||
return milliseconds / 50;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert milliseconds to a human readable format.
|
||||
* @param milliseconds The amount of milliseconds to convert
|
||||
* @return A formatted string based on the language file
|
||||
*/
|
||||
public static String millisToHumanFormat(long milliseconds) {
|
||||
long timeLeft = milliseconds + 500;
|
||||
// To seconds
|
||||
timeLeft = timeLeft / 1000;
|
||||
if(timeLeft <= 0) {
|
||||
return Message.fromKey("timeleft-ended").getPlain();
|
||||
} else if(timeLeft == 1) {
|
||||
return Message.fromKey("timeleft-second").replacements(timeLeft).getPlain();
|
||||
} else if(timeLeft <= 120) {
|
||||
return Message.fromKey("timeleft-seconds").replacements(timeLeft).getPlain();
|
||||
}
|
||||
// To minutes
|
||||
timeLeft = timeLeft / 60;
|
||||
if(timeLeft <= 120) {
|
||||
return Message.fromKey("timeleft-minutes").replacements(timeLeft).getPlain();
|
||||
}
|
||||
// To hours
|
||||
timeLeft = timeLeft / 60;
|
||||
if(timeLeft <= 48) {
|
||||
return Message.fromKey("timeleft-hours").replacements(timeLeft).getPlain();
|
||||
}
|
||||
// To days
|
||||
timeLeft = timeLeft / 24;
|
||||
if(timeLeft <= 60) {
|
||||
return Message.fromKey("timeleft-days").replacements(timeLeft).getPlain();
|
||||
}
|
||||
// To months
|
||||
timeLeft = timeLeft / 30;
|
||||
if(timeLeft <= 24) {
|
||||
return Message.fromKey("timeleft-months").replacements(timeLeft).getPlain();
|
||||
}
|
||||
// To years
|
||||
timeLeft = timeLeft / 12;
|
||||
return Message.fromKey("timeleft-years").replacements(timeLeft).getPlain();
|
||||
}
|
||||
|
||||
private static final BlockFace[] facings = {BlockFace.NORTH, BlockFace.NORTH_EAST, BlockFace.EAST, BlockFace.SOUTH_EAST, BlockFace.SOUTH, BlockFace.SOUTH_WEST, BlockFace.WEST, BlockFace.NORTH_WEST};
|
||||
|
||||
/**
|
||||
* Get the facing direction based on the yaw.
|
||||
* @param yaw The horizontal angle that for example the player is looking
|
||||
* @return The Block Face of the angle
|
||||
*/
|
||||
public static BlockFace yawToFacing(float yaw) {
|
||||
return facings[Math.round(yaw / 45f) & 0x7];
|
||||
}
|
||||
|
||||
// ======================================================================
|
||||
// Methods to get WorldGuard or AreaShop regions by location or selection
|
||||
// ======================================================================
|
||||
|
||||
/**
|
||||
* Get all AreaShop regions intersecting with a WorldEdit selection.
|
||||
* @param selection The selection to check
|
||||
* @return A list with all the AreaShop regions intersecting with the selection
|
||||
*/
|
||||
public static List<GeneralRegion> getRegionsInSelection(WorldEditSelection selection) {
|
||||
ArrayList<GeneralRegion> result = new ArrayList<>();
|
||||
for(ProtectedRegion region : getWorldEditRegionsInSelection(selection)) {
|
||||
GeneralRegion asRegion = AreaShop.getInstance().getFileManager().getRegion(region.getId());
|
||||
if(asRegion != null) {
|
||||
result.add(asRegion);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all AreaShop regions containing a location.
|
||||
* @param location The location to check
|
||||
* @return A list with all the AreaShop regions that contain the location
|
||||
*/
|
||||
public static List<GeneralRegion> getRegions(Location location) {
|
||||
return getRegionsInSelection(new WorldEditSelection(location.getWorld(), location, location));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all WorldGuard regions intersecting with a WorldEdit selection.
|
||||
* @param selection The selection to check
|
||||
* @return A list with all the WorldGuard regions intersecting with the selection
|
||||
*/
|
||||
public static List<ProtectedRegion> getWorldEditRegionsInSelection(WorldEditSelection selection) {
|
||||
// Get all regions inside or intersecting with the WorldEdit selection of the player
|
||||
World world = selection.getWorld();
|
||||
RegionManager regionManager = AreaShop.getInstance().getRegionManager(world);
|
||||
ArrayList<ProtectedRegion> result = new ArrayList<>();
|
||||
Location selectionMin = selection.getMinimumLocation();
|
||||
Location selectionMax = selection.getMaximumLocation();
|
||||
for(ProtectedRegion region : regionManager.getRegions().values()) {
|
||||
BlockVector regionMin = region.getMinimumPoint();
|
||||
BlockVector regionMax = region.getMaximumPoint();
|
||||
if(
|
||||
( // x part, resolves to true if the selection and region overlap anywhere on the x-axis
|
||||
(regionMin.getBlockX() <= selectionMax.getBlockX() && regionMin.getBlockX() >= selectionMin.getBlockX())
|
||||
|| (regionMax.getBlockX() <= selectionMax.getBlockX() && regionMax.getBlockX() >= selectionMin.getBlockX())
|
||||
|| (selectionMin.getBlockX() >= regionMin.getBlockX() && selectionMin.getBlockX() <= regionMax.getBlockX())
|
||||
|| (selectionMax.getBlockX() >= regionMin.getBlockX() && selectionMax.getBlockX() <= regionMax.getBlockX())
|
||||
) && ( // Y part, resolves to true if the selection and region overlap anywhere on the y-axis
|
||||
(regionMin.getBlockY() <= selectionMax.getBlockY() && regionMin.getBlockY() >= selectionMin.getBlockY())
|
||||
|| (regionMax.getBlockY() <= selectionMax.getBlockY() && regionMax.getBlockY() >= selectionMin.getBlockY())
|
||||
|| (selectionMin.getBlockY() >= regionMin.getBlockY() && selectionMin.getBlockY() <= regionMax.getBlockY())
|
||||
|| (selectionMax.getBlockY() >= regionMin.getBlockY() && selectionMax.getBlockY() <= regionMax.getBlockY())
|
||||
) && ( // Z part, resolves to true if the selection and region overlap anywhere on the z-axis
|
||||
(regionMin.getBlockZ() <= selectionMax.getBlockZ() && regionMin.getBlockZ() >= selectionMin.getBlockZ())
|
||||
|| (regionMax.getBlockZ() <= selectionMax.getBlockZ() && regionMax.getBlockZ() >= selectionMin.getBlockZ())
|
||||
|| (selectionMin.getBlockZ() >= regionMin.getBlockZ() && selectionMin.getBlockZ() <= regionMax.getBlockZ())
|
||||
|| (selectionMax.getBlockZ() >= regionMin.getBlockZ() && selectionMax.getBlockZ() <= regionMax.getBlockZ())
|
||||
)
|
||||
) {
|
||||
result.add(region);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of regions around a location.
|
||||
* - Returns highest priority, child instead of parent regions
|
||||
* @param location The location to check for regions
|
||||
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
|
||||
*/
|
||||
public static List<ProtectedRegion> getImportantWorldEditRegions(Location location) {
|
||||
List<ProtectedRegion> result = new ArrayList<>();
|
||||
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
|
||||
if(regions != null) {
|
||||
boolean first = true;
|
||||
for(ProtectedRegion pr : regions) {
|
||||
if(first) {
|
||||
result.add(pr);
|
||||
first = false;
|
||||
} else {
|
||||
if(pr.getPriority() > result.get(0).getPriority()) {
|
||||
result.clear();
|
||||
result.add(pr);
|
||||
} else if(pr.getParent() != null && pr.getParent().equals(result.get(0))) {
|
||||
result.clear();
|
||||
result.add(pr);
|
||||
} else {
|
||||
result.add(pr);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most important rental AreaShop regions.
|
||||
* - Returns highest priority, child instead of parent regions.
|
||||
* @param location The location to check for regions
|
||||
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
|
||||
*/
|
||||
public static List<RentRegion> getImportantRentRegions(Location location) {
|
||||
List<RentRegion> result = new ArrayList<>();
|
||||
for(GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.RENT)) {
|
||||
result.add((RentRegion)region);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most important buy AreaShop regions.
|
||||
* - Returns highest priority, child instead of parent regions.
|
||||
* @param location The location to check for regions
|
||||
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
|
||||
*/
|
||||
public static List<BuyRegion> getImportantBuyRegions(Location location) {
|
||||
List<BuyRegion> result = new ArrayList<>();
|
||||
for(GeneralRegion region : getImportantRegions(location, GeneralRegion.RegionType.BUY)) {
|
||||
result.add((BuyRegion)region);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most important AreaShop regions.
|
||||
* - Returns highest priority, child instead of parent regions.
|
||||
* @param location The location to check for regions
|
||||
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
|
||||
*/
|
||||
public static List<GeneralRegion> getImportantRegions(Location location) {
|
||||
return getImportantRegions(location, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the most important AreaShop regions.
|
||||
* - Returns highest priority, child instead of parent regions.
|
||||
* @param location The location to check for regions
|
||||
* @param type The type of regions to look for, null for all
|
||||
* @return empty list if no regions found, 1 member if 1 region is a priority, more if regions with the same priority
|
||||
*/
|
||||
public static List<GeneralRegion> getImportantRegions(Location location, GeneralRegion.RegionType type) {
|
||||
List<GeneralRegion> result = new ArrayList<>();
|
||||
Set<ProtectedRegion> regions = AreaShop.getInstance().getWorldGuardHandler().getApplicableRegionsSet(location);
|
||||
if(regions != null) {
|
||||
List<GeneralRegion> candidates = new ArrayList<>();
|
||||
for(ProtectedRegion pr : regions) {
|
||||
GeneralRegion region = AreaShop.getInstance().getFileManager().getRegion(pr.getId());
|
||||
if(region != null && (
|
||||
(type == GeneralRegion.RegionType.RENT && region instanceof RentRegion)
|
||||
|| (type == GeneralRegion.RegionType.BUY && region instanceof BuyRegion)
|
||||
|| type == null)) {
|
||||
candidates.add(region);
|
||||
}
|
||||
}
|
||||
boolean first = true;
|
||||
for(GeneralRegion region : candidates) {
|
||||
if(region == null) {
|
||||
AreaShop.debug("skipped null region");
|
||||
continue;
|
||||
}
|
||||
if(first) {
|
||||
result.add(region);
|
||||
first = false;
|
||||
} else {
|
||||
if(region.getRegion().getPriority() > result.get(0).getRegion().getPriority()) {
|
||||
result.clear();
|
||||
result.add(region);
|
||||
} else if(region.getRegion().getParent() != null && region.getRegion().getParent().equals(result.get(0).getRegion())) {
|
||||
result.clear();
|
||||
result.add(region);
|
||||
} else {
|
||||
result.add(region);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return new ArrayList<>(result);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert color and formatting codes to bukkit values.
|
||||
* @param input Start string with color and formatting codes in it
|
||||
* @return String with the color and formatting codes in the bukkit format
|
||||
*/
|
||||
public static String applyColors(String input) {
|
||||
String result = null;
|
||||
if(input != null) {
|
||||
result = ChatColor.translateAlternateColorCodes('&', input);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Format the currency amount with the characters before and after.
|
||||
* @param amount Amount of money to format
|
||||
* @return Currency character format string
|
||||
*/
|
||||
public static String formatCurrency(double amount) {
|
||||
String before = config.getString("moneyCharacter");
|
||||
before = before.replace(AreaShop.currencyEuro, "€");
|
||||
String after = config.getString("moneyCharacterAfter");
|
||||
after = after.replace(AreaShop.currencyEuro, "€");
|
||||
String result;
|
||||
// Check for infinite and NaN
|
||||
if(Double.isInfinite(amount)) {
|
||||
result = "\u221E"; // Infinite symbol
|
||||
} else if(Double.isNaN(amount)) {
|
||||
result = "NaN";
|
||||
} else {
|
||||
BigDecimal bigDecimal = BigDecimal.valueOf(amount);
|
||||
boolean stripTrailingZeros = false;
|
||||
int fractionalNumber = config.getInt("fractionalNumbers");
|
||||
// Add metric suffix if necessary
|
||||
if(config.getDouble("metricSuffixesAbove") != -1) {
|
||||
String suffix = null;
|
||||
double divider = 1;
|
||||
for(Double number : suffixes.keySet()) {
|
||||
if(amount >= number && number > divider) {
|
||||
divider = number;
|
||||
suffix = suffixes.get(number);
|
||||
}
|
||||
}
|
||||
if(suffix != null) {
|
||||
bigDecimal = BigDecimal.valueOf(amount / divider);
|
||||
after = suffix + after;
|
||||
fractionalNumber = config.getInt("fractionalNumbersShort");
|
||||
stripTrailingZeros = true;
|
||||
}
|
||||
}
|
||||
|
||||
// Round if necessary
|
||||
if(fractionalNumber >= 0) {
|
||||
bigDecimal = bigDecimal.setScale(fractionalNumber, RoundingMode.HALF_UP);
|
||||
}
|
||||
result = bigDecimal.toString();
|
||||
if(config.getBoolean("hideEmptyFractionalPart")) {
|
||||
// Strip zero fractional: 12.00 -> 12
|
||||
if(bigDecimal.remainder(BigDecimal.ONE).compareTo(BigDecimal.ZERO) == 0 && result.contains(".")) {
|
||||
result = result.substring(0, result.indexOf('.'));
|
||||
}
|
||||
// Strip zeros from suffixed numbers: 1.20M -> 1.2M
|
||||
if(stripTrailingZeros && result.contains(".")) {
|
||||
result = result.replaceAll("0+$", "");
|
||||
}
|
||||
}
|
||||
}
|
||||
result = result.replace(".", config.getString("decimalMark"));
|
||||
Message resultMessage = Message.fromString(result);
|
||||
resultMessage.prepend(before);
|
||||
resultMessage.append(after);
|
||||
return resultMessage.getSingle();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Checks if the string is a correct time period.
|
||||
* @param time String that has to be checked
|
||||
* @return true if format is correct, false if not
|
||||
*/
|
||||
public static boolean checkTimeFormat(String time) {
|
||||
// Check if the string is not empty and check the length
|
||||
if(time == null || time.length() <= 1 || time.indexOf(' ') == -1 || time.indexOf(' ') >= (time.length() - 1)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check if the suffix is one of these values
|
||||
String suffix = time.substring(time.indexOf(' ') + 1);
|
||||
if(!identifiers.contains(suffix)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check if the part before the space is a number
|
||||
String prefix = time.substring(0, (time.indexOf(' ')));
|
||||
return prefix.matches("\\d+");
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode to tranlate a duration string to a millisecond value.
|
||||
* @param duration The duration string
|
||||
* @return The duration in milliseconds translated from the durationstring, or if it is invalid then 0
|
||||
*/
|
||||
public static long durationStringToLong(String duration) {
|
||||
if(duration == null) {
|
||||
return 0;
|
||||
} else if(duration.equalsIgnoreCase("disabled") || duration.equalsIgnoreCase("unlimited") || duration.length() == 0) {
|
||||
return -1;
|
||||
} else if(duration.indexOf(' ') == -1) {
|
||||
return 0;
|
||||
}
|
||||
Calendar calendar = Calendar.getInstance();
|
||||
calendar.setTimeInMillis(0);
|
||||
|
||||
String durationString = duration.substring(duration.indexOf(' ') + 1);
|
||||
int durationInt = 0;
|
||||
try {
|
||||
durationInt = Integer.parseInt(duration.substring(0, duration.indexOf(' ')));
|
||||
} catch(NumberFormatException exception) {
|
||||
// No Number found, add zero
|
||||
}
|
||||
|
||||
if(seconds.contains(durationString)) {
|
||||
calendar.add(Calendar.SECOND, durationInt);
|
||||
} else if(minutes.contains(durationString)) {
|
||||
calendar.add(Calendar.MINUTE, durationInt);
|
||||
} else if(hours.contains(durationString)) {
|
||||
calendar.add(Calendar.HOUR, durationInt);
|
||||
} else if(days.contains(durationString)) {
|
||||
calendar.add(Calendar.DAY_OF_MONTH, durationInt);
|
||||
} else if(weeks.contains(durationString)) {
|
||||
calendar.add(Calendar.DAY_OF_MONTH, durationInt * 7);
|
||||
} else if(months.contains(durationString)) {
|
||||
calendar.add(Calendar.MONTH, durationInt);
|
||||
} else if(years.contains(durationString)) {
|
||||
calendar.add(Calendar.YEAR, durationInt);
|
||||
} else {
|
||||
AreaShop.warn("Unknown duration indicator:", durationString, "check if config.yml has the correct time indicators");
|
||||
}
|
||||
return calendar.getTimeInMillis();
|
||||
}
|
||||
|
||||
// LEGACY TIME INPUT CONVERSION
|
||||
|
||||
/**
|
||||
* Get setting from config that could be only a number indicating seconds.
|
||||
* or a string indicating a duration string
|
||||
* @param path Path of the setting to read
|
||||
* @return milliseconds that the setting indicates
|
||||
*/
|
||||
public static long getDurationFromSecondsOrString(String path) {
|
||||
if(config.isLong(path) || config.isInt(path)) {
|
||||
long setting = config.getLong(path);
|
||||
if(setting != -1) {
|
||||
setting = setting * 1000;
|
||||
}
|
||||
return setting;
|
||||
} else {
|
||||
return durationStringToLong(config.getString(path));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get setting from config that could be only a number indicating minutes.
|
||||
* or a string indicating a duration string.
|
||||
* @param path Path of the setting to read
|
||||
* @return milliseconds that the setting indicates
|
||||
*/
|
||||
public static long getDurationFromMinutesOrString(String path) {
|
||||
if(config.isLong(path) || config.isInt(path)) {
|
||||
long setting = config.getLong(path);
|
||||
if(setting != -1) {
|
||||
setting = setting * 60 * 1000;
|
||||
}
|
||||
return setting;
|
||||
} else {
|
||||
return durationStringToLong(config.getString(path));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a time setting that could be minutes or a duration string.
|
||||
* @param input The string to parse
|
||||
* @return milliseconds that the string indicates
|
||||
*/
|
||||
public static long getDurationFromMinutesOrStringInput(String input) {
|
||||
long number;
|
||||
try {
|
||||
number = Long.parseLong(input);
|
||||
if(number != -1) {
|
||||
number = number * 60 * 1000;
|
||||
}
|
||||
return number;
|
||||
} catch(NumberFormatException e) {
|
||||
return durationStringToLong(input);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse a time setting that could be seconds or a duration string.
|
||||
* @param input The string to parse
|
||||
* @return seconds that the string indicates
|
||||
*/
|
||||
public static long getDurationFromSecondsOrStringInput(String input) {
|
||||
long number;
|
||||
try {
|
||||
number = Long.parseLong(input);
|
||||
if(number != -1) {
|
||||
number = number * 1000;
|
||||
}
|
||||
return number;
|
||||
} catch(NumberFormatException e) {
|
||||
return durationStringToLong(input);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if an input is numeric.
|
||||
* @param input The input to check
|
||||
* @return true if the input is numeric, otherwise false
|
||||
*/
|
||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||
public static boolean isNumeric(String input) {
|
||||
try {
|
||||
Integer.parseInt(input);
|
||||
return true;
|
||||
} catch(NumberFormatException ignored) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a string is a double.
|
||||
* @param input The input
|
||||
* @return true if the input is a double, otherwise false
|
||||
*/
|
||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||
public static boolean isDouble(String input) {
|
||||
try {
|
||||
Double.parseDouble(input);
|
||||
return true;
|
||||
} catch(NumberFormatException e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Evaluate string input to a number.
|
||||
* Uses JavaScript for expressions.
|
||||
* @param input The input string
|
||||
* @param region The region to apply replacements for and use for logging
|
||||
* @return double evaluated from the input or a very high default in case of a script exception
|
||||
*/
|
||||
public static double evaluateToDouble(String input, GeneralRegion region) {
|
||||
// Replace variables
|
||||
input = Message.fromString(input).replacements(region).getSingle();
|
||||
|
||||
// Check for simple number
|
||||
if(isDouble(input)) {
|
||||
return Double.parseDouble(input);
|
||||
}
|
||||
|
||||
// Lazy init scriptEngine
|
||||
if(scriptEngine == null) {
|
||||
scriptEngine = new ScriptEngineManager().getEngineByName("JavaScript");
|
||||
}
|
||||
|
||||
// Evaluate expression
|
||||
Object result;
|
||||
try {
|
||||
result = scriptEngine.eval(input);
|
||||
} catch(ScriptException e) {
|
||||
AreaShop.warn("Price of region", region.getName(), "is set with an invalid expression: '" + input + "', exception:", ExceptionUtils.getStackTrace(e));
|
||||
return 99999999999.0; // High fallback for safety
|
||||
}
|
||||
|
||||
// Handle the result
|
||||
if(Utils.isDouble(result.toString())) {
|
||||
return Double.parseDouble(result.toString());
|
||||
} else {
|
||||
AreaShop.warn("Price of region", region.getName(), "is set with the expression '" + input + "' that returns a result that is not a number:", result);
|
||||
return 99999999999.0; // High fallback for safety
|
||||
}
|
||||
}
|
||||
|
||||
// NAME <-> UUID CONVERSION
|
||||
|
||||
/**
|
||||
* Conversion to name by uuid.
|
||||
* @param uuid The uuid in string format
|
||||
* @return the name of the player
|
||||
*/
|
||||
public static String toName(String uuid) {
|
||||
String result = "";
|
||||
if(uuid != null) {
|
||||
try {
|
||||
UUID parsed = UUID.fromString(uuid);
|
||||
result = toName(parsed);
|
||||
} catch(IllegalArgumentException e) {
|
||||
// Incorrect UUID
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion to name by uuid object.
|
||||
* @param uuid The uuid in string format
|
||||
* @return the name of the player
|
||||
*/
|
||||
public static String toName(UUID uuid) {
|
||||
if(uuid == null) {
|
||||
return "";
|
||||
} else {
|
||||
String name = Bukkit.getOfflinePlayer(uuid).getName();
|
||||
if(name != null) {
|
||||
return name;
|
||||
}
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Conversion from name to uuid.
|
||||
* @param name The name of the player
|
||||
* @return The uuid of the player
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // Fake deprecation by Bukkit to inform developers, method will stay
|
||||
public static String toUniqueId(String name) {
|
||||
if(name == null) {
|
||||
return null;
|
||||
} else {
|
||||
return Bukkit.getOfflinePlayer(name).getUniqueId().toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
package me.wiefferink.areashop.tools;
|
||||
|
||||
public class Value<T> {
|
||||
|
||||
private T value;
|
||||
|
||||
/**
|
||||
* Create a container with a default value.
|
||||
* @param value The value to set
|
||||
*/
|
||||
public Value(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the stored value.
|
||||
* @return The stored value
|
||||
*/
|
||||
public T get() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value.
|
||||
* @param value The new value
|
||||
*/
|
||||
public void set(T value) {
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,181 @@
|
||||
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ config.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop. ║
|
||||
# ║ This file contains options to change the working of the plugin, the profiles defined here can be used in default.yml. ║
|
||||
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
|
||||
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ GENERAL: Options that influence the global state of the plugin │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Chat prefix used for all messages in the chat, also changes the greeting messages.
|
||||
chatPrefix:
|
||||
- '[darkgreen][AreaShop][reset]'
|
||||
- ' hover: AreaShop region management plugin'
|
||||
- ' hover: %lang:action|Click to check the available commands|%'
|
||||
- ' command: /areashop help'
|
||||
- ' '
|
||||
# The language file that should be used, check the 'lang' folder for build-in languages (use the filename without .yml here).
|
||||
# More information can be found here: https://github.com/NLthijs48/AreaShop/wiki/Language-support.
|
||||
language: EN
|
||||
# The tags that need to be written on the first line of a sign to add it to AreaShop.
|
||||
signTags:
|
||||
# Add a rental region.
|
||||
rent: '[asrent]'
|
||||
# Add a buy region.
|
||||
buy: '[asbuy]'
|
||||
# Add a sign to an existing region.
|
||||
add: '[as]'
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ECONOMY: Options to change the display of prices. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# The characters displayed before a price.
|
||||
moneyCharacter: '$'
|
||||
# The characters displayed after a price.
|
||||
moneyCharacterAfter: ''
|
||||
# The character(s) to use as decimal mark.
|
||||
decimalMark: '.'
|
||||
# How many numbers behind the dot should be shown (2 will make numbers like '8.55', '9.01', '5.20').
|
||||
fractionalNumbers: 2
|
||||
# How many numbers behind the dot should be shown when using a metric symbol suffix.
|
||||
fractionalNumbersShort: 3
|
||||
# Set this to true if you want to hide '.0' for a number like '15.0' ('4.50' will still stay '4.50').
|
||||
hideEmptyFractionalPart: true
|
||||
# Use a suffix if the price is above a certain number (use 1.00M instead of 1000000.00 etc.)
|
||||
metricSymbols:
|
||||
#1000: "k"
|
||||
1000000: "M"
|
||||
1000000000: "G"
|
||||
1000000000000: "T"
|
||||
1000000000000000: "P"
|
||||
1000000000000000000: "E"
|
||||
1000000000000000000000: "Z"
|
||||
1000000000000000000000000: "Y"
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ RENTING: Options that apply to all rent regions. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Timeformat to use on the signs, default is like '30-06 14:52', US format: 'MM-dd KK:mm a'.
|
||||
# Search for 'java SimpleDateFormat' for more options and documentation.
|
||||
timeFormatSign: 'dd-MM HH:mm'
|
||||
# Timeformat used in the chat, default is like '30 june 2014 14:52', US format: 'MMMMMMMMMMMMMMMMM dd yyyy KK:mm a'.
|
||||
# Search for 'java SimpleDateFormat' for more options and documentation.
|
||||
timeFormatChat: 'dd MMMMMMMMMMMMMMMMM yyyy HH:mm'
|
||||
# Time indicators, used for specifing time periods (for example rent duration).
|
||||
seconds: [s, sec, secs, second, seconds]
|
||||
minutes: [m, min, mins, minute, minutes]
|
||||
hours: [h, hour, hours]
|
||||
days: [d, day, days]
|
||||
weeks: [w, week, weeks]
|
||||
months: [M, month, months]
|
||||
years: [y, year, years]
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ PERMISSION GROUPS: Assigned by giving players certain permissions. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Configure the max total regions, max rent regions and max buy regions with different groups (-1 is unlimited).
|
||||
# Assign a group to players by giving them the permission 'areashop.limits.<group>'.
|
||||
# Every player already has the group 'default', OPs bypass the limits because of the 'areashop.limitbypass' permission.
|
||||
# All the groups applied to the player will be checked and only if they all allow an extra region it will be allowed.
|
||||
# More information like limits for regions of a certain group or in a certain word can be found here:
|
||||
# https://github.com/NLthijs48/AreaShop/wiki/Limitgroups-information-and-examples.
|
||||
limitGroups:
|
||||
default:
|
||||
total: 1
|
||||
rents: 1
|
||||
buys: 1
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ ADVANCED AND DEBUG: Specific options to tweak the plugin precisely and check if it functions correctly. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Blacklist of region names that cannot be added to AreaShop for renting or buying. Regular expressions can be used, search
|
||||
# for 'java regex pattern' to find documentation about how to use it.
|
||||
# Example: Blocking all regions that have a name like 'house_1', 'house_2', etc. would be done with 'house_\d+'.
|
||||
# The '\d' represents the numerical digits 0-9, the + symbol represents 1 or more times repeated.
|
||||
# This means it would also block 'house_123' and 'house_000456'. It will not block 'ahouse_1' or 'house_'.
|
||||
blacklist:
|
||||
- '__global__'
|
||||
# Minimum length of the numbers that are suffixed for region names generated by the '/as stack' command.
|
||||
# When having this at 3 it will generate names like this: 'region-001', 'region-014', 'region-4567'.
|
||||
stackRegionNumberLength: 3
|
||||
# Allow/disallow adding players that did not visit the server yet as friend of a region.
|
||||
addFriendNotExistingPlayers: false
|
||||
# Enable sending stats to http://mcstats.org/ (Metrics plugin).
|
||||
# This information will give me an indication about how much the plugin is used and encourages me to continue development.
|
||||
sendStats: true
|
||||
# If enabled it will check for updates when loading the plugin, it will never download files, it will only notify about it.
|
||||
checkForUpdates: true
|
||||
# Use colors when sending messages to console and log files.
|
||||
useColorsInConsole: false
|
||||
# Use tellraw style messages, which can be interacted with by players
|
||||
useFancyMessages: true
|
||||
# Update all region flags and signs after starting the plugin.
|
||||
# This ensures that changes to the config are directly visible after restarting the server.
|
||||
updateRegionsOnStartup: true
|
||||
# Enables / disables debug messages in the console, could be useful to figure out where errors come from.
|
||||
debug: false
|
||||
# Version of the config, do not change!
|
||||
version: ${project.version}
|
||||
# Maximum number of blocks to save to or restore from a .schemetic file.
|
||||
maximumBlocks: 1000000
|
||||
# Maximum number of locations the teleport function should check to find a safe spot.
|
||||
maximumTries: 50000
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ VARIABLES: Variables that can be used in messages and settings where a region is available. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# If a tag has no value (for example %player% when the region is not rented/bought) then the tag will not get replaced.
|
||||
# %region% The region name (with correct capitalization).
|
||||
# %player% The name of the player that rents/buys the region (with correct capitalization).
|
||||
# %uuid% The UUID of the player that rents/buys the region.
|
||||
# %friends% The names of friends added to this region separated by ', '.
|
||||
# %friendsuuid% The UUID's of friends added to this region separated by ', '.
|
||||
# %landlord% The name of the landlord.
|
||||
# %landlorduuid% The UUID of the landlord.
|
||||
# %price% The price of the region formatted with the configured characters before and after the number.
|
||||
# %rawprice% The price without formatting, like '10.0' or '7.77'.
|
||||
# %duration% The duration of a rent region, for example '1 d', '4 minutes' or '2 years'.
|
||||
# %world% The name of the world that the region is in.
|
||||
# %type% The type of the region, 'rent' or 'buy'.
|
||||
# %until% The end time of a rent formatted as configured with 'timeFormatChat'.
|
||||
# %untilshort% The end time of a rent formatted as configured with 'timeFormatSign'.
|
||||
# %width% The width of the region (number of blocks on the x-axis).
|
||||
# %depth% The depth of the region (number of blocks on the z-axis).
|
||||
# %volume% The number of blocks in a region (accounting for polygon shaped regions).
|
||||
# %height% The height of the region (number of blocks on the y-axis).
|
||||
# %timeleft% The time left on the rent (uses the unit of time that fits best, minutes used from 121 seconds till 120 minutes).
|
||||
# %clicker% The name of the player that clicked the sign (only to be used in the signProfiles section).
|
||||
# %resellprice% The price of a region when it is in resell mode.
|
||||
# %rawresellprice% The resellprice without formatting.
|
||||
# %moneyback% The amount of money the player will get back when unrenting/selling the region (formatted with currency layout).
|
||||
# %rawmoneyback% The moneyback without formatting.
|
||||
# %moneybackpercent% The percentage of the price the player will get back when unrenting the region.
|
||||
# %timesExtended% The number of times the region has been extended (zero when first rented)
|
||||
# %maxextends% The maximum number of extends a player can do on the region.
|
||||
# %extendsleft% The number of extends that are left (maxextends - timesextended).
|
||||
# %maxrenttime% The maximum time you can rent a region in advance (human readable).
|
||||
# %inactivetime% The maximum time a player may be inactive before unrent/sell (human readable).
|
||||
# %year% The current year.
|
||||
# %month% The current month in the year.
|
||||
# %day% The current day in the month.
|
||||
# %hour% The current hour in the day (0-23).
|
||||
# %minute% The current minute of the hour.
|
||||
# %second% The current second of the minute.
|
||||
# %millisecond% The current millisecond of the second.
|
||||
# %epoch% The number of milliseconds since January 1, 1970 (Unix Epoch).
|
||||
# %tpx% The exact x coordinate of the location that the teleport is set to
|
||||
# %tpy% The exact y coordinate of the location that the teleport is set to
|
||||
# %tpz% The exact z coordinate of the location that the teleport is set to
|
||||
# %tpblockx% The rounded x coordinate of the location that the teleport is set to
|
||||
# %tpblocky% The rounded y coordinate of the location that the teleport is set to
|
||||
# %tpblockz% The rounded z coordinate of the location that the teleport is set to
|
||||
# %tppitch% The exact pitch of the teleport location
|
||||
# %tppitchround% The rounded pitch of the teleport location
|
||||
# %tpyaw% The exact yaw of the teleport location
|
||||
# %tpyawround% The rounded yaw of the teleport location
|
||||
# %tpworld% The world name of the teleport location
|
||||
# %lang:<languageKey>|Optional arguments|% Insert a message from EN.yml, for example: '%lang:timeleft-ended%' or '%lang:timeleft-years|15|%'
|
||||
@@ -0,0 +1,249 @@
|
||||
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ default.yml file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop.║
|
||||
# ║ All settings below are default settings and can be overridden by group settings or individual region settings. ║
|
||||
# ║ More information and tutorials can be found on the wiki: https://github.com/NLthijs48/AreaShop/wiki ║
|
||||
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ GENERAL: Settings that apply to all regions. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
general:
|
||||
# The y location within the region to start searching for safe teleport locations (x and z are in the middle of the region).
|
||||
# Possible values: 'bottom', 'middle', 'top' or a number indicating an exact y coordinate.
|
||||
teleportLocationY: bottom
|
||||
# If true the teleportation algorithm only allows telportation to inside the region, otherwise it will expand
|
||||
# a cube from the starting point to check for safe spots (then it could end outside of the region).
|
||||
teleportIntoRegion: true
|
||||
# Same as above, but then for when you teleport to the sign of a region instead of the region itself.
|
||||
teleportToSignIntoRegion: false
|
||||
# Allow teleporting to the region from another world with `/as tp`
|
||||
teleportCrossWorld: true
|
||||
# When teleporting to a sign, the number of blocks the player should get teleported away from the sign
|
||||
teleportSignDistance: 1
|
||||
# Should '/as find' find this region while the player is in another world? (prevents cross-world teleport if turned off)
|
||||
findCrossWorld: true
|
||||
# Set where the '/as find' command should teleport the player to, set to true for the first sign of the region and set to
|
||||
# false to teleport to the location set by '/as settp' or the default location (if not set).
|
||||
findTeleportToSign: true
|
||||
# Restricts buying and renting of regions to the world of the region.
|
||||
restrictedToWorld: false
|
||||
# Restricts buying and renting of regions to the region itself (player needs to be inside the region).
|
||||
restrictedToRegion: false
|
||||
# The UUID of the landlord, this player will receive all money from rents/buys (but not reselling with '/as resell').
|
||||
landlord: ''
|
||||
# Name of the landlord, if the landlord UUID setting is not provided then the name will be used instead.
|
||||
landlordName: ''
|
||||
# Disable to prevent counting this region towards limits set by 'limitGroups' in config.yml.
|
||||
countForLimits: true
|
||||
|
||||
##### Set the layout and functions of the signs.
|
||||
# The following sections can be added for performing certain commands when the sign is clicked:
|
||||
# rightClickPlayer, rightClickConsole, shiftRightClickPlayer, shiftRightClickConsole,
|
||||
# leftClickPlayer, leftClickConsole, shiftLeftClickPlayer, shiftLeftClickConsole.
|
||||
# Sections with 'Player' at the end will be run by the player that clicks the sign and 'Console' ones from the console.
|
||||
signProfile:
|
||||
forrent:
|
||||
line1: '&2&l[For Rent]'
|
||||
line2: '%region%'
|
||||
line3: '%duration%'
|
||||
line4: '%price%'
|
||||
rightClickPlayer:
|
||||
- 'areashop rent %region%'
|
||||
rightClickConsole:
|
||||
# - 'areashop message %clicker% %lang:confirm-rent|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
|
||||
leftClickPlayer:
|
||||
- 'areashop info region %region%'
|
||||
rented:
|
||||
line1: '&4&l[Rented]'
|
||||
line2: '%region%'
|
||||
line3: '%player%'
|
||||
line4: '%untilshort%'
|
||||
rightClickPlayer:
|
||||
- 'areashop rent %region%'
|
||||
rightClickConsole:
|
||||
# - 'areashop message %clicker% %lang:confirm-extend|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
|
||||
leftClickPlayer:
|
||||
- 'areashop info region %region%'
|
||||
shiftRightClickConsole:
|
||||
- 'areashop message %clicker% %lang:confirm-unrent|%region%|%'
|
||||
forsale:
|
||||
line1: '&2&l[For Sale]'
|
||||
line2: '%region%'
|
||||
line3: '%price%'
|
||||
line4:
|
||||
rightClickPlayer:
|
||||
- 'areashop buy %region%'
|
||||
rightClickConsole:
|
||||
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
|
||||
leftClickPlayer:
|
||||
- 'areashop info region %region%'
|
||||
resell:
|
||||
line1: '&9&l[Resale]'
|
||||
line2: '%region%'
|
||||
line3: '%resellprice%'
|
||||
line4: '&8%player%'
|
||||
rightClickPlayer:
|
||||
- 'areashop buy %region%'
|
||||
rightClickConsole:
|
||||
# - 'areashop message %clicker% %lang:confirm-buy|%region%|%' # Alternative to first ask for confirmation (remove rightClickPlayer section)
|
||||
leftClickPlayer:
|
||||
- 'areashop info region %region%'
|
||||
shiftRightClickPlayer:
|
||||
- 'areashop stopresell %region%'
|
||||
sold:
|
||||
line1: '&4&l[Sold]'
|
||||
line2: '%region%'
|
||||
line3: '%player%'
|
||||
line4:
|
||||
rightClickPlayer:
|
||||
- 'areashop buy %region%'
|
||||
leftClickPlayer:
|
||||
- 'areashop info region %region%'
|
||||
shiftRightClickConsole:
|
||||
- 'areashop message %clicker% %lang:confirm-sell|%region%|%'
|
||||
|
||||
##### Set WorldGuard regions flags depending on the region state.
|
||||
# All normal region flags as present in WorldGuard can be used, in addition to 'members', 'owners', 'priority' and 'parent'.
|
||||
# The members and owners flag normally take a list of UUID's separated by a comma, adding by name is possible with 'n:<name>'.
|
||||
# You can add groups by using 'g:<groupname>', so an example woul be: '%uuid%, %friendsuuid%, g:vip, n:coolGuy'.
|
||||
# For allow/deny flags like 'entry' and 'exit' you can set the group setting by using 'g:<scope>', <scope> is one of the following:
|
||||
# members, non_members, owners, non_owners, all. Example, only members can enter the region:
|
||||
# entry: 'deny g:non_members'
|
||||
# '' will remove the flag from the region.
|
||||
flagProfile:
|
||||
ALL: # Flags that should always be applied
|
||||
priority: 10
|
||||
owners: ''
|
||||
members: ''
|
||||
interact: 'deny g:non_members' # Only allow region members/owners to use things in the region (chests, furnace, animals, etc.)
|
||||
use: 'deny g:non_members'
|
||||
build: 'deny g:non_members'
|
||||
block-break: 'deny g:non_members'
|
||||
block-place: 'deny g:non_members'
|
||||
forrent:
|
||||
greeting: '%lang:prefix%%lang:greeting-forrent%'
|
||||
rented:
|
||||
members: '%uuid%, %friendsuuid%'
|
||||
greeting: '%lang:prefix%%lang:greeting-rented%'
|
||||
forsale:
|
||||
greeting: '%lang:prefix%%lang:greeting-forsale%'
|
||||
sold:
|
||||
members: '%uuid%, %friendsuuid%'
|
||||
greeting: '%lang:prefix%%lang:greeting-bought%'
|
||||
resell:
|
||||
members: '%uuid%, %friendsuuid%'
|
||||
greeting: '%lang:prefix%%lang:greeting-resale%'
|
||||
|
||||
##### Save and restore schematics to clean up regions.
|
||||
# After 'save:' or 'restore:' you enter the name of the file to restore from/to (.schematic is added automatically).
|
||||
# Set to true to enable saving/restoring for regions as specified in the profile below, which is specified in the config.
|
||||
enableRestore: false
|
||||
schematicProfile:
|
||||
created:
|
||||
save: '%type%-%region%'
|
||||
restore: ''
|
||||
deleted:
|
||||
save: ''
|
||||
restore: '%type%-%region%'
|
||||
rented:
|
||||
save: '%type%-%region%'
|
||||
restore: ''
|
||||
unrented:
|
||||
save: ''
|
||||
restore: '%type%-%region%'
|
||||
bought:
|
||||
save: '%type%-%region%'
|
||||
restore: ''
|
||||
sold:
|
||||
save: ''
|
||||
restore: '%type%-%region%'
|
||||
resell:
|
||||
save: ''
|
||||
restore: ''
|
||||
|
||||
##### Run commands when an event happens.
|
||||
# Commands at a 'before' section will execute before the region details are changed in the AreaShop system
|
||||
# and before any other actions occurred (setting the owner, saving/loading schematics, etc.),
|
||||
# the 'after' commands will be run when all changes are done.
|
||||
# You can add a list of commands to 'before' and 'after'.
|
||||
eventCommandProfile:
|
||||
created:
|
||||
before:
|
||||
after:
|
||||
# - "say An AreaShop region has been created: %region%"
|
||||
deleted:
|
||||
before:
|
||||
after:
|
||||
rented:
|
||||
before:
|
||||
after:
|
||||
extended:
|
||||
before:
|
||||
after:
|
||||
unrented:
|
||||
before:
|
||||
after:
|
||||
bought:
|
||||
before:
|
||||
after:
|
||||
sold:
|
||||
before:
|
||||
after:
|
||||
resell:
|
||||
before:
|
||||
after:
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ RENT: Settings that apply to rent regions. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
rent:
|
||||
# The default price of a rental region (variables, mathematical expressions and JavaScript can be used).
|
||||
price: 1000
|
||||
# The default duration of a rental region, you can find all time indicators in config.yml below the RENTING header.
|
||||
duration: '1 day'
|
||||
# Automatically extend the rental when it is running out (if the player meets the criteria)
|
||||
autoExtend: false
|
||||
# The percentage of the rent price you get back if you unrent the region (only the time that is unused is given back).
|
||||
# (variables, mathematical expressions and JavaScript can be used)
|
||||
moneyBack: 100
|
||||
# Maximum number of extends a player can do (-1 for infinite, 0 for no extending), if they are at this number then
|
||||
# they are force to let their rent run out (and can rent it again at that point).
|
||||
maxExtends: -1
|
||||
# The Maximum time they can have the region rented in advance (use times like '1 day' etc, or 'unlimited' for no limit).
|
||||
# This can prevent players from renting their region for a year, and to ensure they periodically have to extend their rent.
|
||||
maxRentTime: 'unlimited'
|
||||
# Automatically unrent the region after the specified time between the last login time of the renter and the current time.
|
||||
# Use times like '1 day' etc, or 'disabled' for never.
|
||||
inactiveTimeUntilUnrent: 'disabled'
|
||||
# If a region of a player has less then this time left when he joins the server he will get a notice about his region.
|
||||
# Use '' to disable.
|
||||
warningOnLoginTime: '1 day'
|
||||
# If renting the region would go above 'maxRentTIme', then extend to the maximum instead of cancelling the rent.
|
||||
extendToFullWhenAboveMaxRentTime: true
|
||||
##### Run commands a certain time before expiration of a region.
|
||||
# Time identifiers specify how much time before the rent is over the commands should be executed.
|
||||
# These commands are executed in a 'best effort' manner, if your server is offline when it should trigger then it won't run.
|
||||
expirationWarningProfile:
|
||||
'1 day':
|
||||
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
|
||||
'1 hour':
|
||||
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
|
||||
'5 minutes':
|
||||
- "areashop message %player% %lang:prefix%%lang:rent-expiringSoon|%region%|%timeleft%|%"
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ BUY: Settings that apply to buy regions. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
buy:
|
||||
# The default price of a buy region (variables, mathematical expressions and JavaScript can be used).
|
||||
price: 1000
|
||||
# The percentage of the price you get back if you sell the region (variables, mathematical expressions and JavaScript can be used)
|
||||
moneyBack: 100
|
||||
# Automatically sell the region after the specified number of minutes between the last login time of the buyer and the current time
|
||||
# Use times like '1 day' etc, or 'disabled' for never.
|
||||
inactiveTimeUntilSell: 'disabled'
|
||||
# Selling is disabled for the region owner (players with areashop.sellown without areashop.sell)
|
||||
sellDisabled: false
|
||||
# Reselling is disabled for the region owner (players with areashop.resell without areashop.resellall)
|
||||
resellDisabled: false
|
||||
@@ -0,0 +1,58 @@
|
||||
# ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
|
||||
# ║ hiddenConfig.yml file of the AreaShop plugin created by NLThijs48. ║
|
||||
# ║ Options in this file are available in config.yml, but are not shown by default there. ║
|
||||
# ║ The options in these file are either very advanced, or not useful for the majority of users. ║
|
||||
# ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ TIMERS: Settings to define how often scheduled tasks run. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Setting the 'delay' setting to 0 or lower will prevent the taks from runnning.
|
||||
# The 'delay' settings are specified using a number followed by one of the identifiers as defined in config.yml.
|
||||
# The 'regionsPerTick' settings are to configure how fast something goes, lower value is less lag, but slower updates.
|
||||
# There are 20 ticks in 1 second, so if you set 'regionPerTick' to 5, then 5*20=100 regions per second will be updated.
|
||||
|
||||
# Timings for saving files that need saving.
|
||||
saving:
|
||||
delay: '11 minutes'
|
||||
regionsPerTick: 1
|
||||
# Timings for rent expiration checking.
|
||||
expiration:
|
||||
delay: '14 seconds'
|
||||
regionsPerTick: 5
|
||||
# Timings for expiration warning to online players.
|
||||
expireWarning:
|
||||
delay: '11 seconds'
|
||||
regionsPerTick: 5
|
||||
# Timings for updating signs and region flags ('/as reload' or after '/as groupadd' or '/as groupdel').
|
||||
update:
|
||||
regionsPerTick: 10
|
||||
# Time between checking if any regions need to be unrented because the player was not online for the specified time period.
|
||||
inactive:
|
||||
delay: '17 minutes'
|
||||
regionsPerTick: 5
|
||||
# Timings for the periodic updating of signs (for timeleft tags etc).
|
||||
signs:
|
||||
delay: '1 minute'
|
||||
regionsPerTick: 3
|
||||
# Number of regions per tick to check when a player joins to see if his name changed for regions he owned (updates the regions when changed).
|
||||
nameupdate:
|
||||
regionsPerTick: 10
|
||||
# Timings for adding regions to AreaShop ('/as stack').
|
||||
adding:
|
||||
regionsPerTick: 2
|
||||
|
||||
|
||||
# ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
|
||||
# │ OTHER: All other settings. │
|
||||
# └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
|
||||
# Allow or disallow extending a rental region when the player is above his limits enforced by the 'limitGroups' section below.
|
||||
# false will ensure a player will eventually lose his region when he has no access anymore.
|
||||
allowRegionExtendsWhenAboveLimits: false
|
||||
# Flag profiles that can be used by the 'general.flagProfile' setting in default.yml
|
||||
flagProfiles:
|
||||
# Event command profiles that can be used by the 'general.eventCommandProfile' setting in default.yml
|
||||
eventCommandProfiles:
|
||||
# Sign profiles that can be used by the 'general.signProfile' setting in default.yml
|
||||
signProfiles:
|
||||
# Schematic profiles that can be used by the 'general.schematicProfile' setting in default.yml
|
||||
schematicProfiles:
|
||||
@@ -0,0 +1,521 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ German language file, plugin version 2.5.0, 396/428 messages are translated (93%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Benutze %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Benutze %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Region %0%"
|
||||
- " hover: %lang:action|Region information|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Spieler %0%"
|
||||
- " hover: %lang:action|Regionen von %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Vermieter %landlord%"
|
||||
- " hover: %lang:action|Regionen von %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Du kannst nicht mehr als %0% Region(en) mieten/kaufen (Du hast bereits %1% in Gruppe '%2%')."
|
||||
"confirm-yes": " [gray]Klicken um %lang:command|den Command zu bestätigen|1%0%|%[gray] oder zu wiederholen."
|
||||
"general-notReady": "AreaShop ist noch nicht vollständig geladen, bitte warten."
|
||||
"general-noWorld": "Du kannst das nicht machen, die Welt von %lang:region% ist derzeit nicht verfügbar (Welt '%world%')."
|
||||
"general-noRegion": "Du kannst das nicht machen, die WorldGuard Region ist derzeit nicht verfügbar (region %lang:region%)."
|
||||
"general-noEconomy": "AreaShop kann kein (korrekt) installiertes Economy-Plugin finden, bitte informiere den Serverinhaber darüber."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Der Befehl ist ungültig, nutze '/as help' für weitere Informationen."
|
||||
"cmd-onlyByPlayer": "Dieser Befehl kann nur von einem Spieler benutzt werden."
|
||||
"cmd-weOnlyByPlayer": "Eine WorldEdit-Selektion kann nur von einem Spieler gewählt werden, gib die Region als extra Argument an."
|
||||
"cmd-noSelection": "Du hast mit WorldEdit nichts markiert."
|
||||
"cmd-noRegionsFound": "In deiner Selektion wurden keine in AreaShop registrierten Regionen gefunden."
|
||||
"cmd-noWERegionsFound": "Es wurden keine WorldEdit-Regionen gefunden, die sich mit deiner Selektion überschneiden."
|
||||
"cmd-notRegistered": "Die Region '%0%' ist in AreaShop nicht verfügbar."
|
||||
"cmd-noRegion": "'%0%' ist keine gültige WorldGuard Region."
|
||||
"cmd-noRegionsAtLocation": "Keine Regionen an deiner Position gefunden, gib die Region als Argument an."
|
||||
"cmd-moreRegionsAtLocation": "Mehr als eine Region wurde an deiner Position gefunden, gib die Region als Argument an."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Die Automatische Auswahl einer Region ist nur für Spieler möglich, gib die Region als Argument an."
|
||||
"help-header": "Hilfeseite mit Befehlen, die du ausführen kannst."
|
||||
"help-noPermission": "Du hast keine Permissions, um diese Hilfeseite anzuzeigen."
|
||||
"help-alias": "Befehlsaliase: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Zeigt diese Hilfeseite."
|
||||
"help-info": "%lang:helpCommand|/as info|% Zeigt Infos über aktuelle Regionen."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Miete eine Region oder verlängere deine derzeitige Miete."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Kaufe eine Region."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Breche eine Miete für eine Region ab."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Verkaufe eine Region."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Lade alle Dateien sowie Regionen neu."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Aktiviere das Zurücksetzen und wähle ein Profil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Ändere den Preis einer Region."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Ändere die Dauer einer gemieteten Region."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teleportiere dich zu einer kauf- oder mietbaren Region."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Setze die Teleport Position von einer Region."
|
||||
"help-find": "%lang:helpCommand|/as find|% Finde eine kauf- oder mietbare Region."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Füge eine Region zu einer Gruppe hinzu."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Lösche eine Region von einer Gruppe."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Liste alle Gruppen auf, welche derzeit Registriert sind."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Zeigt Informationen über eine Gruppe an."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Löst ein Schematic Event für eine Region aus."
|
||||
"help-add": "%lang:helpCommand|/as add|% Registriere eine Region zum mieten oder kaufen."
|
||||
"help-del": "%lang:helpCommand|/as del|% Lösche eine registrierte Region von AreaShop"
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Füge ein Schild zu einer existierenden Region hinzu."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Lösche das Schild auf das du Schaust."
|
||||
"help-me": "%lang:helpCommand|/as me|% Liste alle Regionen, welche zu besitzt auf, sowie deren Ablaufdatum."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Setze den Besitzer einer Region oder verlängere die Miete."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Setzt eine Region in den Wiederverkaufs-Modus."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Setzt eine Region zurück in den Verkauft Modus."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Fügt einen Freund zu einer Region hinzu."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Löscht einen Freund von einer Region."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Benutze Massenschild Verlinkungs Modus."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Erstelle mehrere Regionen und füge sie hinzu."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Setzt den Vermieter einer Region."
|
||||
"rent-help": "/as rent [Region], Die Region in der du stehst wird Gemietet, wenn du keine Region angegeben hast."
|
||||
"rent-noPermission": "Du bist nicht berechtigt, diese Region zu mieten."
|
||||
"rent-maximum": "Du kannst nicht mehr als %0% Region(en) mieten (Du hast bereits %1% in Gruppe '%2%')."
|
||||
"rent-maximumExtend": "Du kannst diese Miete nicht verlängern weil du mehr als %0% Region(en) hast. (Du hast bereits %1% in Gruppe '%2%')."
|
||||
"rent-payError": "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
|
||||
"rent-rented": "Du hast die Region %lang:region% bis zum %until% gemietet. Du kannst deine Miete verlängern, in dem du erneut auf das Schild klickst, oder /as rent eingibst."
|
||||
"rent-extended": "Du hast Deine Miete von %lang:region% bis zum %until% verlängert."
|
||||
"rent-extendedToMax": "Du hast Deine Miete von %lang:region% bis zum %until% verlängert. (Das ist die maximal zulässige Mietdauer von %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "Du hast nicht genug Geld um die Miete zu verlängern. (Du hast %0% und benötigst %price%)."
|
||||
"rent-lowMoneyRent": "Du hast nicht genug Geld um die Region %lang:region% zu mieten. (Du hast %0% und benötigst %price%)."
|
||||
"rent-someoneElse": "Die Region %lang:region% ist bereits vermietet."
|
||||
"rent-notRentable": "Region '%0%' ist nicht vorhanden (Nicht registiert in Areashop oder nur zu verkaufen)."
|
||||
"rent-maxExtends": "Du kannst diese Miete nicht weiter verlängern. (Zulässig sind %maxextends% Verlängerungen). Nachdem die Miete abgelaufen ist, kannst du die Region %lang:region% erneut mieten."
|
||||
"rent-maxRentTime": "Du kannst die Region%lang:region% nicht noch mehr im Voraus mieten. Die maximale Zeit beträgt %maxrenttime% und du hast diese Region für %timeleft% gemietet."
|
||||
"rent-restrictedToWorld": "Du musst dich in der Welt '%world%' befinden, um die Region %lang:region% mieten zu können (Du befindest Dich in der Welt '%0%')."
|
||||
"rent-restrictedToRegion": "Du musst innerhalb der Region %lang:region% sein, um diese mieten zu können."
|
||||
"rent-expireWarning": "Deine Region %lang:region% hat %timeleft% übrig. Beachte, dass du sie rechtzeitig verlängerst, wenn du sie behalten willst."
|
||||
"rent-expiringSoon": "Deine Region %lang:tRegion|%0%|% hat noch %1% übrig. Verlängere sie, wenn du sie behalten möchtest."
|
||||
"rent-alreadyAtFull": "Die Region %lang:region% ist bereits auf oder über der maximalen Mietzeit, Du kannst diese noch nicht verlängern."
|
||||
"buy-help": "/as buy [Regionname], Die Region in der du stehst wird gekauft wenn keine Region angegeben wurde."
|
||||
"buy-noPermission": "Du bist nicht berechtigt, eine Region zu kaufen."
|
||||
"buy-noPermissionResell": "Du hast keine Berechtigung eine Region im Weiterverkaufs-Modus zu kaufen."
|
||||
"buy-noPermissionNoResell": "Du hast keine Berechtigung um eine Region zu kaufen, die nicht im Weiterverkaufs-Modus ist."
|
||||
"buy-notBuyable": "Region '1%0%' ist nicht zum Kauf verfügbar (nicht registriert in AreaShop oder es ist eine mietbare Region)"
|
||||
"buy-maximum": "Du kannst nicht mehr als %0% Region(en) erwerben (Du hast bereits %1% in Gruppe '%2%')."
|
||||
"buy-payError": "Die Bezahlung hat nicht funktioniert. Bitte versuche es später noch einmal."
|
||||
"buy-succes": "Du hast %lang:region% erfolgreich gekauft."
|
||||
"buy-successResale": "Du hast %lang:region% erfolgreich von %lang:tPlayer|%0%|% gekauft."
|
||||
"buy-successSeller": "Deine Region %lang:region% wurde an %lang:player% für %0% verkauft."
|
||||
"buy-lowMoney": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %price%)."
|
||||
"buy-lowMoneyResell": "Du hast nicht genug Geld um die Region %lang:region% zu kaufen. (Du hast %0% und benötigst %resellprice%)."
|
||||
"buy-yours": "Du besitzt die Region %lang:region% bereits."
|
||||
"buy-someoneElse": "Jemand anderes hat die Region %lang:region% bereits gekauft."
|
||||
"buy-restrictedToWorld": "Du musst Dich in der Welt '%world%' befinden, um die Region %lang:region% kaufen zu können. (Du befindest Dich in der Welt '%0%')."
|
||||
"buy-restrictedToRegion": "Du musst innerhalb der Region %lang:region% sein, um diese kaufen zu können."
|
||||
"unrent-help": "/as unrent [Region], Die Region in der du stehst wird entmietet, wenn keine Region angegeben wird."
|
||||
"unrent-noPermission": "Du bist nicht berechtigt, den Mietvertrag zu kündigen."
|
||||
"unrent-noPermissionOther": "Du bist nicht berechtigt, den Mietvertrag einer anderen Region zu kündigen."
|
||||
"unrent-notRegistered": "Die Region kann nicht entmietet werden, weil sie nicht für Vermietungen registriert ist."
|
||||
"unrent-notRented": "Die Region kann nicht entmietet werden, weil sie nicht gemietet ist."
|
||||
"unrent-unrented": "Die Region %lang:region% ist nun nicht mehr an %lang:player% vermietet."
|
||||
"unrent-expired": "Deine Miete von %lang:region% ist abgelaufen."
|
||||
"sell-help": "/as sell [Region], Die Region in der du stehst wird verkauft wenn keine Region angegeben wurde."
|
||||
"sell-notRegistered": "Die Region kann nicht verkauft werden, da sie nicht für den Verkauf registriert ist."
|
||||
"sell-notBought": "Die Region kann nicht verkauft werden, da sie keinen Eigentümer hat."
|
||||
"sell-sold": "Die Region %lang:region% von %lang:player% wurde verkauft."
|
||||
"sell-noPermission": "Du bist nicht berechtigt, diese Region zu verkaufen."
|
||||
"sell-noPermissionOther": "Du bist nicht berechtigt, eine Region zu verkaufen."
|
||||
"sell-disabled": "Das verkaufen dieser Region wurde deaktiviert."
|
||||
"reload-reloading": "Alle Konfigurationsdateien und Region-Dateien wurden neu geladen."
|
||||
"reload-noPermission": "Du hast keine Berechtigungen um die Konfigurationsdateien neu zu laden."
|
||||
"reload-updateCommandChanged": "'/as updaterents' und '/as updatebuys' wurden entfernt, bitte benutze '/as reload' um die Regionen neu zu laden."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [Gruppe] [Seite][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [Gruppe] [Seite][break]"
|
||||
- " %lang:command|sold|/as info sold|% [Gruppe] [Seite][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [Gruppe] [Seite][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [Gruppe] [Seite][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [Seite]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [Region]"
|
||||
"info-noPermission": "Du hast keine Berechtigung, Informationen über Regionen zu erhalten."
|
||||
"info-allHeader": "Alle Regionen%0%:"
|
||||
"info-rentedHeader": "Gemietete Regionen%0%:"
|
||||
"info-forrentHeader": "Mietbare Regionen%0%:"
|
||||
"info-forsaleHeader": "Kaufbare Regionen%0%:"
|
||||
"info-soldHeader": "Verkaufte Regionen%0%:"
|
||||
"info-resellingHeader": "Weiterverkaufbare Regionen%0%:"
|
||||
"info-nogroupHeader": "Regionen ohne Gruppe%0%:"
|
||||
"info-limitedToGroup": " (begrenzt auf Gruppe %0%)"
|
||||
"info-nogroupNone": "Es gibt keine Regionen ohne Gruppe."
|
||||
"info-noFiltergroup": "Gruppe '%0%' existiert nicht und kann deshalb nicht genutzt werden um die Ergebnisse zu limitieren."
|
||||
"info-noRegions": "Es wurden keine Regionen gefunden."
|
||||
"info-wrongPage": "%0% ist keine korrekte Seitenzahl."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zur Vermietung für %price% je %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vermietet an %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Zum Verkauf für %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkauft an %lang:player% (Weiterverkauf)."
|
||||
"info-pageStatus": "[gold]Seite %0%/%1%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Vorherige[/bold] "
|
||||
- " hover: Das ist bereits die erste Seite."
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Nächste►[/bold]"
|
||||
- " hover: Das ist bereits die letzte Seite."
|
||||
"info-playerHelp": "/as info player <Spielername>."
|
||||
"info-playerRents": "Gemietete Regionen von %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% hat bisher keine Region(en) gemietet."
|
||||
"info-playerBuys": "Gekaufte Regionen von %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% hat bisher keine Region(en) gekauft."
|
||||
"info-regionHelp": "/as info region [Region], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
|
||||
"info-regionHeaderRent": "[darkgreen]Informationen über %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Informationen über %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Gemietet von %lang:player% bis: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Gekauft von %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Gekauft von %lang:player%, derzeit Weiterverkauf."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Verlängern für[/bold]"
|
||||
- " hover: Miete verlängern für %region%"
|
||||
- " hover: mit %duration% für %price%"
|
||||
- " hover: %lang:action|Mieter Verlängern für %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% für %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Mieten für[/bold]"
|
||||
- " hover: Miete %region% für %price% für %duration%"
|
||||
- " hover: %lang:action|Miete %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% für %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Kaufen für[/bold]"
|
||||
- " hover: Kaufe %region% für %price%"
|
||||
- " hover: %lang:action|Kaufe %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Weiterverkaufspreis: [gray]%resellprice% (Du kannst es von %lang:player% kaufen)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Hinzugefügte Freunde: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|Lösche %0% als Freund|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkaufpreis: [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Verkaufsrückzahlung[/bold]"
|
||||
- " hover: Verkaufe %region% und bekomme %moneyback% zurück"
|
||||
- " hover: %lang:action|Verkaufe %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% des Kaufpreises)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Rückzahlung bei Mietkündigung: [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Mietrückzahlung[/bold]"
|
||||
- " hover: Entmiete %region% und bekomme %moneyback% zurück"
|
||||
- " hover: %lang:action|Unrent %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% der verbleibenden Zeit)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximale Anzahl an Verlängerungen: [gray]%maxextends% ."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Miete kann nicht verlängert werden."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Verbleibende Mietverlängerungen: [gray]%extendsleft% von %maxextends% ."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Miete im Voraus: [gray]Maximal %maxrenttime%."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Gehe zu der Region[/bold]"
|
||||
- " hover: %lang:action|Teleport to %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]Setze den Teleport Punkt[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Set teleport location|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Verbundene Schilder: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Zugewiesene Gruppen: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische Mietkündigung nach: [gray]%inactivetime% Inaktivität des Spielers."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatischer Verkauf nach: [gray]%inactivetime% Inaktivität des Spielers."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie mieten zu können."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% mieten zu können."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Du musst dich in der Region %lang:region% befinden, um sie kaufen zu können."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Du musst in der Welt '%world%' sein, um die Region %lang:region% kaufen zu können."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Wiederherstellung ist aktiviert [gray](Region wird bei Mietkündigung zurückgesetzt)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Wiederherstellung ist aktiviert. [gray](Region wird beim Verkauf zurückgesetzt)."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Vermieter: [gray]%lang:landlord% (Erhält das Geld)."
|
||||
"info-regionNotExisting": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"setrestore-help": "/as setrestore <Region> <true|false|general> [Profil]."
|
||||
"setrestore-noPermission": "Du bist nicht berechtigt, die Wiederherstellungs-Einstellungen zu verändern."
|
||||
"setrestore-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' ist keine gültige Angabe, benutze true, false oder general."
|
||||
"setrestore-success": "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert."
|
||||
"setrestore-successProfile": "Wiederherstellungs-Einstellungen von %lang:region% erfolgreich zu '%0%' geändert und das Profil zu '%1%'."
|
||||
"setprice-noPermission": "Du bist nicht berechtigt, den Preis einer Region zu ändern."
|
||||
"setprice-help": "/as setprice <Preis> [Region], Andert den Preis der Region in der du stehst wenn keine Region angegeben wird."
|
||||
"setprice-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"setprice-wrongPrice": "'%0%' ist kein gültiger Preis."
|
||||
"setprice-successRent": "Der Preis der Region %lang:region% änderte sich zu %price% per %duration%."
|
||||
"setprice-successBuy": "Der Preis der Region %lang:region% wurde zu %price% geändert."
|
||||
"setprice-successRemoved": "Der Preis der Region %lang:region% wurde entfernt, ab jetzt wird der Preis einer Gruppe oder der default.yml-Datei benutzt. Neuer Preis: %price%."
|
||||
"setprice-noLandlord": "Du hast keine Rechte um den Preis zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
|
||||
"setduration-noPermission": "Du hast keine Berechtigung, die Mietdauer zu verändern."
|
||||
"setduration-help": "/as setduration <Anzahl> <Zeiteinheit> [Region], ändert die Zeit der Region in der du dich befindest wenn keine Region angegeben wurde."
|
||||
"setduration-notRegistered": "%0% ist nicht als mietbar registriert."
|
||||
"setduration-wrongAmount": "'%0%' ist keine gültige Anzahl, gib eine ganze Zahl an."
|
||||
"setduration-wrongFormat": "'%0%' ist kein gültiges Zeitformat, schau in der Doku auf Bukkit nach."
|
||||
"setduration-success": "Dauer von Region %lang:region% zu '%duration%' geändert."
|
||||
"setduration-noLandlord": "Du hast keine Rechte um die Dauer der Miete zu ändern, da du nicht der Vermieter der Region %lang:region% bist."
|
||||
"setduration-successRemoved": "Die Mietdauer der Region %lang:region% wurde entfernt, es wird nun die Dauer von einer Gruppe oder der default.yml Datei benutzt. Neue Mietdauer: %duration%."
|
||||
"setup-noRegion": "Du hast in der zweiten Zeile keine Region angegeben."
|
||||
"setup-alreadyRentSign": "Die angegebene Region ist bereits in AreaShop als eine Miet-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
|
||||
"setup-alreadyOtherWorld": "Die Region, die angegeben wurde, wurde bereits in einer anderen Welt hinzugefügt, Regionen aus verschiedenen Welten benötigen dennoch andere Namen."
|
||||
"setup-alreadyBuySign": "Die angegebene Region ist bereits in AreaShop als eine Kauf-Region eingefügt, du kannst Schilder zu der Region mit [as] in der ersten Zeile hinzufügen, oder '/as addsign' verwenden."
|
||||
"setup-noDuration": "Du hast nicht angegeben, wie lange eine Region mietbar ist. Bitte trage dies in die dritte Zeile ein."
|
||||
"setup-wrongDuration": "Die angegebene Zeit liegt nicht in einem korrekten Format vor. Beispiel: 1 Tag."
|
||||
"setup-noPrice": "Du hast in der vierten Zeile noch keinen Preis angegeben."
|
||||
"setup-wrongPrice": "Du hast den Preis nicht korrekt angegeben, bitte nutze dafür ausschließlich Zahlen."
|
||||
"setup-rentSuccess": "Die Vermietung der Region %lang:region% ist erfolgreich erstellt worden."
|
||||
"setup-buySuccess": "Das Kaufen der Region %lang:region% ist erfolgreich erstellt worden."
|
||||
"setup-noPermissionRent": "Du hast keine Berechtigungen um mietbare Regionen zu erstellen."
|
||||
"setup-noPermissionBuy": "Du hast keine Berechtigungen um kaufbare Regionen zu erstellen."
|
||||
"setup-couldNotDetect": "Mehrere Regionen mit der selben Priorität und/oder Eltern/Kind-Verhältnis gefunden, bitte gib die gewünschte Region in der zweiten Zeile an (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% ist auf der Blacklist und kann nicht in AreaShop eingefügt werden."
|
||||
"setup-noPermission": "Du kannst die Region '%0%' nicht hinzufügen, da du weder Besitzer noch Mitglied der Region bist oder keine Rechte dazu hast."
|
||||
"destroy-noPermissionRent": "Du hast keine Berechtigungen um eine mietbare Region abzumelden. "
|
||||
"destroy-noPermissionBuy": "Du hast keine Berechtigungen um eine kaufbare Region abzumelden. "
|
||||
"destroy-successRent": "%lang:region% erfolgreich als mietbare Region abgemeldet."
|
||||
"destroy-successBuy": "%lang:region% erfolgreich als kaufbare Region abgemeldet."
|
||||
"teleport-help": "/as tp <Region> [Schild]."
|
||||
"teleport-noRentOrBuy": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"teleport-noPermission": "Du hast keine Rechte um dich zu dieser Region zu teleportieren."
|
||||
"teleport-noPermissionOther": "Du bist nicht berechtigt, dich zu einer Region zu teleportieren, welche du nicht besitzt."
|
||||
"teleport-noPermissionSign": "Du hast keine Rechte um dich zu diesem Schild in deiner Region zu teleportieren."
|
||||
"teleport-noPermissionOtherSign": "Du hast keine Berechtigung, dich zu Schildern von Regionen, die du nicht besitzt, zu teleportieren."
|
||||
"teleport-noPermissionFriend": "Du hast keine Berechtigungen, dich zu Regionen zu teleporten, in denen du als Freund hinzugefügt worden bist."
|
||||
"teleport-noPermissionFriendSign": "Du hast keine Berechtigungen, dich zu dem Schild einer Region zu teleportieren, in denen du als Freund hinzugefügt worden bist."
|
||||
"teleport-noPermissionAvailable": "Du hast keine Rechte um dich zu verfügbaren Regionen zu teleportieren."
|
||||
"teleport-noPermissionAvailableSign": "Du hast keine Rechte um dich zum Schild von verfügbaren Regionen zu teleportieren."
|
||||
"teleport-success": "Du wurdest zu %lang:region% teleportiert."
|
||||
"teleport-successSign": "Du wurdest zum Schild von %lang:region% teleportiert."
|
||||
"teleport-noSafe": "Keine sichere Position in %lang:region% gefunden, kein Boden vorhanden oder maximale Anzahl an Versuchen erreicht (%0%/%1%)."
|
||||
"teleport-blocked": "Du kannst dich nicht teleportieren, weil sich die Position außerhalb der Region befindet und du dich nur in die Region teleportieren kannst."
|
||||
"teleport-changedToSign": "Du hast nur Rechte um zum Schild der Region zu teleportieren und nicht um in die Region zu teleportieren. Teleportiere zum Schild."
|
||||
"teleport-changedToNoSign": "Es ist kein Schild zum teleportieren verfügbar, versuche stattdessen in die Region zu teleportieren."
|
||||
"setteleport-help": "/as settp [Region] [reset], Wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
|
||||
"setteleport-noPermission": "Du bist nicht berechtigt, einen Teleport-Punkt zu setzen."
|
||||
"setteleport-noPermissionOther": "Dir fehlt die Berechtigung die Teleportposition für eine Region, du du nicht besitzt, festzulegen."
|
||||
"setteleport-noRentOrBuy": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"setteleport-success": "Teleport-Punkt von %lang:region% erfolgreich gesetzt."
|
||||
"setteleport-notInside": "Der Teleportpunkt muss sich innerhalb einer Region befinden."
|
||||
"setteleport-reset": "Teleport-Punkt von %lang:region% erfolgreich zurückgesetzt."
|
||||
"find-help": "/as find <buy|rent> [maximaler Preis] [Gruppe]."
|
||||
"find-noPermission": "Du hast keine Berechtigungen nach Regionen zu suchen und zu ihnen zu teleporten."
|
||||
"find-success": "%0% Region gefunden: %lang:region%, bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
|
||||
"find-successMax": "%0% Region gefunden: %lang:region%,, bei Suche nach max. Preis in Höhe von %1%%2%."
|
||||
"find-wrongMaxPrice": "Der angegebene Maximal-Preis ist kein korrekter Betrag: %0%."
|
||||
"find-wrongGroup": "Die angegebene Gruppe existiert nicht: %0%."
|
||||
"find-noneFound": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe deines Guthabens: %1%%2%."
|
||||
"find-noneFoundMax": "Keine %0% Region gefunden bei Suche nach max. Preis in Höhe von %1%%2%."
|
||||
"find-onlyInGroup": ", nur nach Regionen in der Gruppe %0% suchen."
|
||||
"groupadd-help": "/as groupadd <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
|
||||
"groupadd-noPermission": "Du bist nicht berechtigt Regionen zu Gruppen hinzuzufügen."
|
||||
"groupadd-success": "Region %lang:region% wurde zur Gruppe '%0%' hinzugefügt. Diese Gruppe hat nun %1% Mitglied(er)."
|
||||
"groupadd-failed": "Region %lang:region% ist bereits Mitglied der Gruppe '%0%';."
|
||||
"groupadd-weSuccess": "Zu Gruppe %0% hinzugefügt: [gray]%1%."
|
||||
"groupadd-weFailed": "Ist bereits in Gruppe %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <Gruppe> [Region], Wenn kein Regionsname angegeben wird, werden alle Regionen deiner WorldEdit-Markierung einbezogen."
|
||||
"groupdel-noPermission": "Du bist nicht berechtigt, Regionen aus Gruppen zu entfernen."
|
||||
"groupdel-success": "Region %lang:region% ist aus Gruppe '%0%' entfernt worden. Diese Gruppe hat nun %1% Mitglied(er)."
|
||||
"groupdel-failed": "Region %lang:region% gehört nicht zur Gruppe '%0%'."
|
||||
"groupdel-weSuccess": "Entfernt aus Gruppe %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Ist nicht länger in Gruppe %0%: [gray]%1%."
|
||||
"grouplist-noPermission": "Du bist nicht berechtigt, die eingetragenen Gruppen abzurufen."
|
||||
"grouplist-noGroups": "Momentan sind keine Gruppen vorhanden."
|
||||
"grouplist-success": "Folgende Gruppen sind vorhanden: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <Gruppe>."
|
||||
"groupinfo-noPermission": "Du bist nicht berechtigt, Informationen über eine Gruppe abzurufen."
|
||||
"groupinfo-noGroup": "Es ist keine Gruppe mit dem Namen '%0%' vorhanden, bitte benutze zum Anzeigen der verfügbaren Gruppen /as grouplist."
|
||||
"groupinfo-members": "Die folgenden Regionen gehören zur Gruppe %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "Gruppe %0% hat keine Mitglieder."
|
||||
"schemevent-help": "/as schemevent <Region> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Das angegebene Event '%0%' existiert nicht, bitte benutze eines der folgenden: [gray]%1%."
|
||||
"schemevent-success": "'%0%'-Event wurde erfolgreich für Region %lang:region% ausgelöst."
|
||||
"schemevent-noPermission": "Du bist nicht berechtigt, Schematic-Events auszuführen."
|
||||
"add-help": "/as add <rent|buy> [Region] [Welt]."
|
||||
"add-noPermission": "Du bist nicht berechtigt, eine Region in AreaShop hinzuzufügen."
|
||||
"add-success": "Hinzugefügt als %0%: [gray]%1%."
|
||||
"add-failed": "Bereits eingetragen: [gray]%0%."
|
||||
"add-blacklisted": "Auf der Blacklist: [gray]%0%."
|
||||
"add-specifyWorld": "Bei Verwendung der Konsole bitte Welt der Region eintragen."
|
||||
"add-incorrectWorld": "Welt '%0%' nicht gefunden, versuche es bitte noch einmal (Groß- und Kleinschreibung beachten)."
|
||||
"add-noPermissionRegions": "Keine Rechte zum hinzufügen: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Entweder bist du weder Mitglied noch Besitzer der Region oder hast keine Rechte um deine Regionen hinzuzufügen."
|
||||
"del-noPermission": "Du bist nicht berechtigt, Regionen zu entfernen."
|
||||
"del-success": "Entfernte Region(en): [gray]%0%."
|
||||
"del-failed": "Keine Berechtigung zum Entfernen oder nicht eingetragen: [gray]%0%."
|
||||
"addsign-help": "/as addsign [Region] [Profil]."
|
||||
"addsign-noSign": "Du schaust gerade nicht auf ein Schild."
|
||||
"addsign-noRegions": "Keine Region(en) um das Schild herum gefunden."
|
||||
"addsign-couldNotDetect": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region als Argument angeben (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Mehrere Regionen um das Schild herum gefunden, bitte gewünschte Region in die zweite Zeile eintragen (zwei der gefundenen Regionen: %lang:tRegion|%0%|% und %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Das eingetragene Profil existiert nicht. Bitte benutze eines der folgenden (überprüfe config): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Schildprofil %0%"
|
||||
- " hover: %lang:action|Use this profile|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "Das Schild wurde hinzugefügt zu %lang:region%."
|
||||
"addsign-successProfile": "Das Schild wurde zu %lang:region% mit dem Profil %0% hinzugefügt."
|
||||
"addsign-alreadyRegistered": "Dieses Schild ist bereits für die Region %lang:region% registriert."
|
||||
"addsign-noPermission": "Du bist nicht berechtigt, ein Schild hinzuzufügen."
|
||||
"delsign-noSign": "Du schaust gerade nicht auf ein Schild."
|
||||
"delsign-noPermission": "Du bist nicht berechtigt, ein Schild zu entfernen."
|
||||
"delsign-noRegion": "Dieses Schild gehört zu keiner in AreaShop eingetragenen Region."
|
||||
"delsign-success": "Das Schild wurde von der Region %lang:region% entfernt."
|
||||
"me-noPermission": "Dir fehlt die Berechtigung einzusehen, welche Regionen du besitzt."
|
||||
"me-header": "Regionen von %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Du bist kein Spieler, darum können dir keine Regionen gehören."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% übrig"
|
||||
- " hover: bis %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "Im Besitz von %lang:player%"
|
||||
- " hover: Du wurdest als Freund hinzugefügt"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% hat keine gemieteten oder gekaufen Regionen und wurde nicht als Freund zu einem hinzugefügt."
|
||||
"me-noPlayer": "%0% konnte nicht gefunden werden, möglicherweise war er nie auf diesem Server."
|
||||
"me-clickHint": "[gray][italic]Klicke auf eine Region, um weitere Details zu erhalten."
|
||||
"setowner-help": "/as setowner <Spieler> [Region], wenn kein Regionsname angegeben wird, wird die Region genutzt, in der du dich gerade befindest."
|
||||
"setowner-noPermission": "Dir fehlt die Berechtigung den Besitzer einer Region festzulegen."
|
||||
"setowner-noPermissionRent": "Dir fehlt die Berechtigung den Mieter einer Region festzulegen."
|
||||
"setowner-noPermissionBuy": "Dir fehlt die Berechtigung den Eigentümer einer Region festzulegen."
|
||||
"setowner-notRegistered": "Die angegebene Region ist nicht registriert, Besitzer kann nicht festgelegt werden."
|
||||
"setowner-noPlayer": "Die UUID des Spielers %0% konnte nicht gefunden werden."
|
||||
"setowner-succesRent": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%, gemietet bis %until% (%timeleft% verbleibend)."
|
||||
"setowner-succesRentExtend": "%lang:player% ist bereits Besitzer, Miete verlängert um '%duration%', nun gemietet bis %until% (%timeleft% verbleibend)."
|
||||
"setowner-succesBuy": "Besitzer von %lang:region% erfolgreich geändert zu %lang:player%."
|
||||
"resell-help": "/as resell <Preis> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
|
||||
"resell-wrongPrice": "'%0%' ist keine gültige Preisangabe."
|
||||
"resell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"resell-notBought": "Du kannst %lang:region% nicht weiterverkaufen, weil sie noch nicht erworben wurde."
|
||||
"resell-success": "Weiterverkauf für %lang:region% erfolgreich aktiviert. Preis: %resellprice%."
|
||||
"resell-noPermission": "Du hast keine Berechtigung, deine Region weiterzuverkaufen."
|
||||
"resell-noPermissionOther": "Du hast keine Berechtigung, den Weiterverkauf von Regionen zu aktivieren."
|
||||
"resell-disabled": "Der Weiterverkauf wurde für diese Region deaktiviert."
|
||||
"stopresell-help": "/as stopresell [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
|
||||
"stopresell-notRegistered": "Die angegebene Region ist nicht registriert: %0%."
|
||||
"stopresell-notResell": "Du kannst den Weiterverkauf von %lang:region% nicht stoppen, weil sie bisher nicht weiterverkauft werden soll."
|
||||
"stopresell-success": "Weiterverkauf von %lang:region% wurde erfolgreich gestoppt."
|
||||
"stopresell-noPermission": "Du hast keine Berechtigung, den Weiterverkauf deiner Region zu stoppen."
|
||||
"stopresell-noPermissionOther": "Du hast keine Berechtigung, den Weiterverkauf einer Region zu stoppen."
|
||||
"addfriend-help": "/as addfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
|
||||
"addfriend-noPermissionOther": "Du hast keine Berechtigung, Freunde zu einer Region hinzufügen, welche dir nicht gehört."
|
||||
"addfriend-noPermission": "Du hast keine Berechtigung, Spieler zu deiner Region hinzuzufügen."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% wurde als Freund zur Region %lang:region% hinzugefügt."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% wurde als Freund zu deiner Region %lang:region% hinzugefügt."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% wurde bereits als Freund zu der Region %lang:region% hinzugefügt."
|
||||
"addfriend-self": "Den Besitzer der Region als Freund hinzuzufügen wäre sinnlos."
|
||||
"addfriend-noOwner": "Du kannst keine Freunde zu einer Region ohne Besitzer hinzufügen."
|
||||
"addfriend-notVisited": "Du kannst %0% nicht hinzufügen, weil dieser Spieler noch nie auf dem Server war."
|
||||
"delfriend-help": "/as delfriend <Spieler> [Region], wählt automatisch die Region, in der du dich befindest, wenn nicht angegeben."
|
||||
"delfriend-noPermissionOther": "Du hast keine Berechtigung, Freunde von Regionen zu entfernen, die dir nicht gehören."
|
||||
"delfriend-noPermission": "Du hast keine Berechtigung, Freunde von deinen Regionen zu entfernen."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% wurde als Freund der Region %lang:region% entfernt."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% wurde als Freund Deiner Region %lang:region% entfernt."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% wurde nicht als Freund zur Region %lang:region% hinzugefügt."
|
||||
"delfriend-noOwner": "Du kannst keine Freunde von einer Region ohne Besitzer entfernen."
|
||||
"linksigns-multipleRegions": "Mehrere Regionen gefunden: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Bitte klicke nochmal oder benutze '/as linksigns', um aufzuhören."
|
||||
"linksigns-noRegions": "Keine AreaShop Regionen in Cursorrichtung gefunden, bitte stell sicher, dass die Region in AreaShop registriert ist. [gray](Maximale Reichweite 100 Blöcke)"
|
||||
"linksigns-regionFound": "Region %lang:region% wurde gefunden, verbinde sie jetzt mit einem Linksklick auf ein Schild."
|
||||
"linksigns-signFound": "Schild gefunden bei (%0%, %1%, %2%), mach einen Rechtsklick auf eine Region um das Schild zu verbinden."
|
||||
"linksigns-noSign": "Kein Schild in Cursorrichtung gefunden, bitte stell sicher, dass du eine direkte Sicht auf ein Schild hast und klicke erneut [gray](Maximale Reichweite 100 Blöcke)."
|
||||
"linksigns-alreadyRegistered": "Dieses Schild ist bereits auf die Region %lang:region% registriert, klicke erneut um ein anderes Schild zu wählen."
|
||||
"linksigns-first": "Du bist nun im Schilderverbindungsmodus."
|
||||
"linksigns-next": "[gray]Linksklicke um ein Schild zu wählen, Rechtsklicke um eine Region zu wählen. Benutze /as linksigns um aufzuhören."
|
||||
"linksigns-noPermission": "Du hast keine Berechtigungen um den Schilder-Massenverbindungsmodus zu benutzen."
|
||||
"linksigns-stopped": "Schilder-Verbindungsmodus verlassen."
|
||||
"stack-help":
|
||||
- "/as stack <Menge> <Abstand> <Name> <rent|buy> [Gruppe]."
|
||||
- "[gray]<Menge> Nummer der Regionen, die erstellt werden."
|
||||
- "[gray]<Abstand> Block-Abstand zwischen den Regionen."
|
||||
- "[gray]<Name> Namen der Regionen (Nummer wird dahinter sein)."
|
||||
- "[gray]<rent|buy> Macht die Regionen zu kauf- oder Mietregionen"
|
||||
- "[gray][Gruppe] Eine Gruppe, die zu den erstellten Regionen hinzugefügt wird."
|
||||
- "Die Regionen werden in deiner Blickrichtung erstellt."
|
||||
"stack-accepted": "Erstelle %0% %1% Regionen mit %2% Blöcken Abstand, Namen beginnend mit %3% und einer Zahl dahinter. %4%"
|
||||
"stack-addToGroup": "Gruppe '%0%' wird zu den erstellten Regionen hinzugefügt."
|
||||
"stack-noPermission": "Du hast keine Berechtigungen um Regionen massenweise in AreaShop zu erstellen und hinzuzufügen."
|
||||
"stack-wrongAmount": "'%0%' ist keine korrekte Anzahl von Regionen."
|
||||
"stack-wrongGap": "'%0%' ist keine korrekte Nummer von Blöcken für den Abstand, der zwischen den Regionen sein soll."
|
||||
"stack-noSelection": "Du hast keine Auswahl, die angibt, wo die erste Region erstellt werden soll."
|
||||
"stack-addStart": "[gray]Füge %0% Regionen mit %1% Regionen pro Sekunde hinzu."
|
||||
"stack-addComplete": "[gray]%0% Regionen%1% hinzugefügt."
|
||||
"stack-tooHigh": ", %0% Regionen übersprungen, da sie sich über Y=256 befinden."
|
||||
"stack-tooLow": ", %0% Regionen übersprungen, da sie sich unter Y=0 befinden."
|
||||
"stack-unclearDirection": "Bitte gucke ganz klar nach Norden, Osten, Süden, Westen, nach oben oder unten. Du guckst im Moment nach %0%."
|
||||
"setlandlord-help": "/as setlandlord <Spieler> [Region], die Region in der du stehst wird verwendet, wenn keine angegeben wird."
|
||||
"setlandlord-noPermission": "Du hast keine Rechte um den Vermieter einer Region zu setzen."
|
||||
"setlandlord-success": "%lang:landlord% wurde erfolgreich als Vermieter der Region %lang:region% gesetzt."
|
||||
"message-help": "/as message <Spieler> <Nachricht...>"
|
||||
"message-noPermission": "Du hast keine Berechtigung AreaShop Nachrichten zu senden."
|
||||
"message-notOnline": "%0% ist nicht online."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% mieten willst?"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Mieten %0%|%"
|
||||
- "hover: %lang:action|Rent %0%|%"
|
||||
- "command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% verlängern willst?"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verlängern %0%|%"
|
||||
- "hover: %lang:action|Verlängern %0%|%"
|
||||
- "command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Bist du sicher, dass du %lang:tRegion|%0%|% nicht länger mieten möchtest?"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Auflösen %0%|%"
|
||||
- "hover: %lang:action|Mietvertrag auslösen %0%|%"
|
||||
- "command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix% Bist du sicher das du %lang:tRegion|%0%|% kaufen möchtest?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
|
||||
- " hover: %lang:action|Buy %0%|%"
|
||||
- " command: /areashop buy %0% "
|
||||
"confirm-sell":
|
||||
- "%lang:prefix% Bist du sicher, dass du %lang:tRegion|%0%|% verkaufen willst?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klick zum Verkaufen von %0%|%"
|
||||
- " hover: %lang:action|Verkaufe %0%|%"
|
||||
- " command: /areashop sell %0% "
|
||||
"timeleft-years": "%0% Jahre"
|
||||
"timeleft-months": "%0% Monate"
|
||||
"timeleft-days": "%0% Tage"
|
||||
"timeleft-hours": "%0% Stunden"
|
||||
"timeleft-minutes": "%0% Minuten"
|
||||
"timeleft-second": "%0% Sekunde"
|
||||
"timeleft-seconds": "%0% Sekunden"
|
||||
"timeleft-ended": "abgelaufen"
|
||||
"greeting-forrent": "%region% kann gemietet werden für %price% je %duration%."
|
||||
"greeting-rented": "%region% ist vermietet an %player% bis %until%."
|
||||
"greeting-forsale": "%region% kann gekauft werden für %price%."
|
||||
"greeting-bought": "%region% ist Eigentum von %player%."
|
||||
"greeting-resale": "%region% kann für %resellprice% von 1%player% gekauft werden."
|
||||
@@ -0,0 +1,621 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ English language file, plugin version 2.5.0
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
action: "[gold][bold]<%0%>[/bold]"
|
||||
|
||||
button: "[bold]<%0%>[/bold]"
|
||||
|
||||
command:
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Use %1%|%"
|
||||
- " command: %1%"
|
||||
|
||||
helpCommand:
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Use %0%|%"
|
||||
- " command: %0%"
|
||||
|
||||
region: "%lang:tRegion|%region%|%"
|
||||
|
||||
tRegion:
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Region %0%"
|
||||
- " hover: %lang:action|Region information|%"
|
||||
- " command: /areashop info region %0%"
|
||||
|
||||
player: "%lang:tPlayer|%player%|%"
|
||||
|
||||
tPlayer:
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Player %0%"
|
||||
- " hover: %lang:action|Regions of %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
|
||||
landlord:
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Landlord %landlord%"
|
||||
- " hover: %lang:action|Regions of %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
|
||||
total-maximum: "You can't rent and buy more than %0% region(s) in total (you already have %1% in group '%2%')."
|
||||
|
||||
confirm-yes: " [gray]Click to %lang:command|Confirm|%0%|%[gray], or repeat the command."
|
||||
|
||||
general-notReady: "AreaShop has not fully loaded yet, please wait."
|
||||
general-noWorld: "You cannot do that, the world of %lang:region% is currently unavailable (world '%world%')."
|
||||
general-noRegion: "You cannot do that, the WorldGuard region is currently unavailable (region %lang:region%)."
|
||||
general-noEconomy: "There is no Economy plugin installed or it is not setup correctly, notify the server owner about this."
|
||||
general-cancelled: "%0%"
|
||||
|
||||
cmd-notValid: "That command is not valid, use '/as help' for info."
|
||||
cmd-onlyByPlayer: "This command can only be run by a player."
|
||||
cmd-weOnlyByPlayer: "Using a WorldEdit selection is only possible as a player, specify the region name as extra argument."
|
||||
cmd-noSelection: "You don't have a WorldEdit selection."
|
||||
cmd-noRegionsFound: "No regions registered in AreaShop are found in your selection."
|
||||
cmd-noWERegionsFound: "No WorldEdit regions intersecting your selection are found."
|
||||
cmd-notRegistered: "Region '%0%' is not available in AreaShop."
|
||||
cmd-noRegion: "'%0%' is not a valid WorldGuard region."
|
||||
cmd-noRegionsAtLocation: "No regions found at your location, specify the region as argument."
|
||||
cmd-moreRegionsAtLocation: "More than one region has been found at your location, specify the region as argument."
|
||||
cmd-automaticRegionOnlyByPlayer: "Automatically determining the region is only possible for players, specify the region as argument."
|
||||
|
||||
help-header: "Help page, commands that you can execute."
|
||||
help-noPermission: "You do not have permission to view the help page."
|
||||
help-alias: "Command aliases: /areashop, /as."
|
||||
help-help: "%lang:helpCommand|/as help|% Shows this help page."
|
||||
help-info: "%lang:helpCommand|/as info|% Get info about current regions."
|
||||
help-rent: "%lang:helpCommand|/as rent|% Rent a region or extend your current rent."
|
||||
help-buy: "%lang:helpCommand|/as buy|% Buy a region."
|
||||
help-unrent: "%lang:helpCommand|/as unrent|% Unrent a region."
|
||||
help-sell: "%lang:helpCommand|/as sell|% Sell a region."
|
||||
help-reload: "%lang:helpCommand|/as reload|% Reload all files and update the regions."
|
||||
help-setrestore: "%lang:helpCommand|/as setrestore|% Set restoring on/off and choose profile."
|
||||
help-setprice: "%lang:helpCommand|/as setprice|% Change the price of a region."
|
||||
help-setduration: "%lang:helpCommand|/as setduration|% Change the duration of a rent region."
|
||||
help-teleport: "%lang:helpCommand|/as tp|% Teleport to a rent/buy region."
|
||||
help-setteleport: "%lang:helpCommand|/as settp|% Set teleport position for a region."
|
||||
help-find: "%lang:helpCommand|/as find|% Find an empty buy or rent."
|
||||
help-groupadd: "%lang:helpCommand|/as groupadd|% Add a region to a group."
|
||||
help-groupdel: "%lang:helpCommand|/as groupdel|% Delete a region from a group."
|
||||
help-grouplist: "%lang:helpCommand|/as grouplist|% Display all groups currently registered."
|
||||
help-groupinfo: "%lang:helpCommand|/as groupinfo|% Display information about a group."
|
||||
help-schemevent: "%lang:helpCommand|/as schemevent|% Trigger a schematic event for a region."
|
||||
help-add: "%lang:helpCommand|/as add|% Register a region as rent or buy."
|
||||
help-del: "%lang:helpCommand|/as del|% Delete a registered region from AreaShop."
|
||||
help-addsign: "%lang:helpCommand|/as addsign|% Add a sign to an existing region."
|
||||
help-delsign: "%lang:helpCommand|/as delsign|% Delete the sign you are looking at."
|
||||
help-me: "%lang:helpCommand|/as me|% Check which regions you have (+expiration)."
|
||||
help-setowner: "%lang:helpCommand|/as setowner|% Set region owner or extend the rent."
|
||||
help-resell: "%lang:helpCommand|/as resell|% Put a region into resell mode."
|
||||
help-stopResell: "%lang:helpCommand|/as stopresell|% Put a region back into sold mode."
|
||||
help-addFriend: "%lang:helpCommand|/as addfriend|% Add a friend to a region."
|
||||
help-delFriend: "%lang:helpCommand|/as delfriend|% Delete a friend from a region."
|
||||
help-linksigns: "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
|
||||
help-stack: "%lang:helpCommand|/as stack|% Create multiple regions and add them."
|
||||
help-setlandlord: "%lang:helpCommand|/as setlandlord|% Set the landlord of a region."
|
||||
help-import: "%lang:helpCommand|/as import|% Import region from RegionForSale."
|
||||
|
||||
rent-help: "/as rent [region], the region you stand in will be used if not specified."
|
||||
rent-noPermission: "You don't have permission to rent a region."
|
||||
rent-maximum: "You can't rent more than %0% region(s) (you already have %1% in group '%2%')."
|
||||
rent-maximumExtend: "You can't extend this rent because you have more than %0% region(s) (you already have %1% in group '%2%')."
|
||||
rent-payError: "Something went wrong with paying, try again later."
|
||||
rent-rented: "You rented %lang:region% until %until%, you can extend your rent by rightclicking the sign again or using /as rent."
|
||||
rent-extended: "You extended your rent of %lang:region% until %until%."
|
||||
rent-extendedToMax: "You extended your rent of %lang:region% until %until% (which is the maximum rental time of %maxrenttime%)."
|
||||
rent-lowMoneyExtend: "You don't have enough money to extend the rent (you have %0% and you need %price%)."
|
||||
rent-lowMoneyRent: "You don't have enough money to rent %lang:region% (you have %0% and you need %price%)."
|
||||
rent-someoneElse: "Someone else already rented %lang:region%."
|
||||
rent-notRentable: "Region '%0%' is not available for renting (not registered in AreaShop or it is a buy region)."
|
||||
rent-maxExtends: "You cannot extend this rent anymore (the maximum is %maxextends% times), however after the rent is over you can rent %lang:region% again."
|
||||
rent-maxRentTime: "You cannot rent %lang:region% more time in advance, the maximum time is %maxrenttime% and you have currently rented it for %timeleft%."
|
||||
rent-restrictedToWorld: "You need to be in the '%world%' world to rent %lang:region% (you are in '%0%')."
|
||||
rent-restrictedToRegion: "You need to be inside %lang:region% to rent it."
|
||||
rent-expireWarning: "Your region %lang:region% has %timeleft% left, be sure to extend it if you want to keep it."
|
||||
rent-expiringSoon: "Your region %lang:tRegion|%0%|% has %1% left, be sure to extend it if you want to keep it."
|
||||
rent-alreadyAtFull: "%lang:region% is already at or above the maximum rental time, you cannot extend it yet."
|
||||
|
||||
buy-help: "/as buy [region], the region you stand in will be used if not specified."
|
||||
buy-noPermission: "You don't have permission to buy a region."
|
||||
buy-noPermissionResell: "You don't have permission to buy a region in resell mode."
|
||||
buy-noPermissionNoResell: "You don't have permission to buy a region that is not in resell mode."
|
||||
buy-notBuyable: "Region '%0%' is not available for buying (not registered in AreaShop or it is a rental region)."
|
||||
buy-maximum: "You can't buy more than %0% region(s) (you already have %1% in group '%2%')."
|
||||
buy-payError: "Something went wrong with paying, try again later."
|
||||
buy-succes: "You successfully bought %lang:region%."
|
||||
buy-successResale: "You successfully bought %lang:region% from %lang:tPlayer|%0%|%."
|
||||
buy-successSeller: "Your region %lang:region% has been sold to %lang:player% for %0%."
|
||||
buy-lowMoney: "You don't have enough money to buy %lang:region% (you have %0% and you need %price%)."
|
||||
buy-lowMoneyResell: "You don't have enough money to buy %lang:region% (you have %0% and you need %resellprice%)."
|
||||
buy-yours: "You already own %lang:region%."
|
||||
buy-someoneElse: "Someone else already bought %lang:region%."
|
||||
buy-restrictedToWorld: "You need to be in the '%world%' world to buy %lang:region% (you are in '%0%')."
|
||||
buy-restrictedToRegion: "You need to be inside %lang:region% to buy it."
|
||||
|
||||
unrent-help: "/as unrent [region], the region you stand in will be used if not specified."
|
||||
unrent-noPermission: "You don't have permission to unrent a region."
|
||||
unrent-noPermissionOther: "You don't have permission to unrent another region."
|
||||
unrent-notRegistered: "The region can't be unrented because it is not registered for renting."
|
||||
unrent-notRented: "The region can't be unrented because it is not rented."
|
||||
unrent-unrented: "%lang:region% of %lang:player% has been unrented."
|
||||
unrent-expired: "Your rent of %lang:region% has expired."
|
||||
|
||||
sell-help: "/as sell [region], the region you stand in will be used if not specified."
|
||||
sell-notRegistered: "The region can't be sold because it is not registered for buying."
|
||||
sell-notBought: "The region can't be sold because it is not someone's property."
|
||||
sell-sold: "%lang:region% of %lang:player% has been sold."
|
||||
sell-noPermission: "You don't have permission to sell a region."
|
||||
sell-noPermissionOther: "You don't have permission to sell another region."
|
||||
sell-disabled: "Selling has been disabled for this region."
|
||||
|
||||
reload-reloading: "Reloaded all configuration and region files."
|
||||
reload-updateStart: ""
|
||||
reload-updateComplete: ""
|
||||
reload-noPermission: "You don't have permission to reload the config files."
|
||||
reload-updateCommandChanged: "'/as updaterents' and '/as updatebuys' have been removed, '/as reload' will also update the regions now so use that command instead."
|
||||
|
||||
info-help:
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
info-noPermission: "You don't have permission to get information about regions."
|
||||
info-allHeader: "All regions%0%:"
|
||||
info-rentedHeader: "Rented regions%0%:"
|
||||
info-forrentHeader: "For rent regions%0%:"
|
||||
info-forsaleHeader: "For sale regions%0%:"
|
||||
info-soldHeader: "Sold regions%0%:"
|
||||
info-resellingHeader: "Reselling regions%0%:"
|
||||
info-nogroupHeader: "Regions without group%0%:"
|
||||
info-limitedToGroup: " (limited to group %0%)"
|
||||
info-nogroupNone: "There are no regions without a group."
|
||||
info-noFiltergroup: "Group '%0%' does not exist and therefore cannot be used to limit the results."
|
||||
info-noRegions: "No regions have been found."
|
||||
info-wrongPage: "%0% is not a correct page number."
|
||||
info-entryForrent: "[darkgreen][bold]►[reset] %lang:region%: [gray]For rent for %price% per %duration%."
|
||||
info-entryRented: "[darkgreen][bold]►[reset] %lang:region%: [gray]Rented to %lang:player%."
|
||||
info-entryForsale: "[darkgreen][bold]►[reset] %lang:region%: [gray]For sale for %price%."
|
||||
info-entrySold: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player%."
|
||||
info-entryReselling: "[darkgreen][bold]►[reset] %lang:region%: [gray]Sold to %lang:player% (reselling)."
|
||||
info-pageStatus:
|
||||
- "[gold]Page %0%/%1%"
|
||||
info-pagePrevious:
|
||||
- " [gold][bold]◄Previous[/bold] "
|
||||
- " hover: %lang:action|Show previous page|%"
|
||||
- " command: /areashop %0%"
|
||||
info-pageNoPrevious:
|
||||
- " [darkgray][bold]◄Previous[/bold] "
|
||||
- " hover: This is already the first page"
|
||||
info-pageNext:
|
||||
- " [gold][bold]Next►[/bold]"
|
||||
- " hover: %lang:action|Show next page|%"
|
||||
- " command: /areashop %0%"
|
||||
info-pageNoNext:
|
||||
- " [darkgray][bold]Next►[/bold]"
|
||||
- " hover: This is already the last page"
|
||||
info-playerHelp: "/as info player <name>."
|
||||
info-playerRents: "Regions rented by %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
info-playerNoRents: "%lang:tPlayer|%0%|% has not rented a region."
|
||||
info-playerBuys: "Regions bought by %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
info-playerNoBuys: "%lang:tPlayer|%0%|% has not bought a region."
|
||||
info-regionHelp: "/as info region [name], the region you stand in will be used if not specified."
|
||||
info-regionHeaderRent: "[darkgreen]Information about %lang:region%:"
|
||||
info-regionHeaderBuy: "[darkgreen]Information about %lang:region%:"
|
||||
info-regionFooterRent: ""
|
||||
info-regionFooterBuy: ""
|
||||
info-regionRented: "[darkgreen][bold]►[reset] Rented by %lang:player% until: [gray]%until%."
|
||||
info-regionBought: "[darkgreen][bold]►[reset] Bought by %lang:player%."
|
||||
info-regionReselling: "[darkgreen][bold]►[reset] Bought by %lang:player%, currently reselling."
|
||||
info-regionExtending:
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Extend for[/bold]"
|
||||
- " hover: Extend rent of %region%"
|
||||
- " hover: with %duration% for %price%"
|
||||
- " hover: %lang:action|Extend rent of %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
info-regionCanBeRented:
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Rent for[/bold]"
|
||||
- " hover: Rent %region% for %price% per %duration%"
|
||||
- " hover: %lang:action|Rent %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
info-regionCanBeBought:
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Buy for[/bold]"
|
||||
- " hover: Buy %region% for %price%"
|
||||
- " hover: %lang:action|Buy %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
info-regionReselPrice: "[darkgreen][bold]►[reset] Resell price: [gray]%resellprice% (you can buy it from %lang:player%)."
|
||||
info-regionFriends: "[darkgreen][bold]►[reset] Added friends: [gray]%0%."
|
||||
info-friend: "%lang:tPlayer|%0%|%"
|
||||
info-friendRemove:
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|Remove %0% as friend|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
info-regionMoneyBackBuy:
|
||||
- "[darkgreen][bold]►[reset] Selling payback: [gray]%moneyback% (%moneybackpercent%% of the price)."
|
||||
info-regionMoneyBackBuyClick:
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Selling payback[/bold]"
|
||||
- " hover: Sell %region% and get back %moneyback%"
|
||||
- " hover: %lang:action|Sell %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% of the price)."
|
||||
info-regionMoneyBackRent:
|
||||
- "[darkgreen][bold]►[reset] Unrenting payback: [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
|
||||
info-regionMoneyBackRentClick:
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Unrenting payback[/bold]"
|
||||
- " hover: Unrent %region% and get back %moneyback%"
|
||||
- " hover: %lang:action|Unrent %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% of the remaining time)."
|
||||
info-regionMaxExtends: "[darkgreen][bold]►[reset] Maximum number of extensions: [gray]%maxextends% time(s)."
|
||||
info-regionNoExtending: "[darkgreen][bold]►[reset] Rent cannot be extended."
|
||||
info-regionExtendsLeft: "[darkgreen][bold]►[reset] Extensions left: [gray]%extendsleft% time(s) out of %maxextends%."
|
||||
info-regionMaxRentTime: "[darkgreen][bold]►[reset] In advance renting: [gray]%maxrenttime% at maximum."
|
||||
info-prefix: "[darkgreen][bold]►[reset] "
|
||||
info-regionTeleport:
|
||||
- "[bold]Go to the region[/bold]"
|
||||
- " hover: %lang:action|Teleport to %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
info-setRegionTeleport:
|
||||
- "[bold]set teleport location[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Set teleport location|%"
|
||||
- " command: /areashop settp %region%"
|
||||
info-regionSigns: "[darkgreen][bold]►[reset] Connected signs: [gray]%0%."
|
||||
info-regionSignLocation: "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
info-regionGroups: "[darkgreen][bold]►[reset] Assigned groups: [gray]%0%."
|
||||
info-regionInactiveUnrent: "[darkgreen][bold]►[reset] Auto unrent after: [gray]%inactivetime% of inactivity by the player."
|
||||
info-regionInactiveSell: "[darkgreen][bold]►[reset] Auto sell after: [gray]%inactivetime% of inactivity by the player."
|
||||
info-regionRestrictedRegionRent: "[darkgreen][bold]►[reset] You must be inside %lang:region% to rent it."
|
||||
info-regionRestrictedWorldRent: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to rent %lang:region%."
|
||||
info-regionRestrictedRegionBuy: "[darkgreen][bold]►[reset] You must be inside %lang:region% to buy it."
|
||||
info-regionRestrictedWorldBuy: "[darkgreen][bold]►[reset] You need to be inside world '%world%' to buy %lang:region%."
|
||||
info-regionRestoringRent: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at unrent)."
|
||||
info-regionRestoringBuy: "[darkgreen][bold]►[reset] Restoring is enabled [gray](region will reset at sell)."
|
||||
info-regionLandlord: "[darkgreen][bold]►[reset] Landlord: [gray]%lang:landlord% (receives the money)."
|
||||
info-regionNotExisting: "The specified region is not registered: %0%."
|
||||
|
||||
setrestore-help: "/as setrestore <region> <true|false|general> [profile]."
|
||||
setrestore-noPermission: "You don't have permission to change the restore settings."
|
||||
setrestore-notRegistered: "The specified region is not registered: %0%."
|
||||
setrestore-invalidSetting: "'%0%' is not a valid state, should be true, false or general."
|
||||
setrestore-success: "Successfully set the restore setting of %lang:region% to '%0%'."
|
||||
setrestore-successProfile: "Successfully set the restore setting of %lang:region% to '%0%' and the profile to '%1%'."
|
||||
|
||||
setprice-noPermission: "You don't have permission to change the price of a region."
|
||||
setprice-help: "/as setprice <price> [region], the region you stand in will be used if not specified."
|
||||
setprice-notRegistered: "The specified region is not registered: %0%."
|
||||
setprice-wrongPrice: "'%0%' is not a valid price."
|
||||
setprice-successRent: "Price of region %lang:region% changed to %price% per %duration%."
|
||||
setprice-successBuy: "Price of region %lang:region% changed to %price%."
|
||||
setprice-successRemoved: "Price of %lang:region% has been removed, it will now use the price from a group or the default.yml file, new price: %price%."
|
||||
setprice-noLandlord: "You don't have permission to change the price because you are not the landlord of %lang:region%."
|
||||
|
||||
setduration-noPermission: "You don't have permission to change the duration of a rent."
|
||||
setduration-help: "/as setduration <amount> <identifier> [region], the region you stand in will be used if not specified."
|
||||
setduration-notRegistered: "%0% is not registered for renting."
|
||||
setduration-wrongAmount: "'%0%' is not a valid amount, use a whole number."
|
||||
setduration-wrongFormat: "'%0%' is not a proper timeformat, check the documentation on Bukkit."
|
||||
setduration-success: "Duration of region %lang:region% changed to '%duration%'."
|
||||
setduration-noLandlord: "You don't have permission to change the duration because you are not the landlord of %lang:region%."
|
||||
setduration-successRemoved: "Duration of %lang:region% has been removed, it will now use the duration from a group or the default.yml file, new duration: %duration%."
|
||||
|
||||
setup-noRegion: "You did not specify a region on the second line."
|
||||
setup-alreadyRentSign: "The region you specified is already added to AreaShop as a rent region, add signs with [as] on the first line or '/as addsign'."
|
||||
setup-alreadyOtherWorld: "The region you specified is already added to AreaShop in another world, regions from different worlds still need different names."
|
||||
setup-alreadyBuySign: "The region you specified is already added to AreaShop as a buy region, add signs with [as] on the first line or '/as addsign'."
|
||||
setup-noDuration: "You did not specify how long the region can be rented, do this on the third line."
|
||||
setup-wrongDuration: "The time specified is not in the correct format, example: 1 day."
|
||||
setup-noPrice: "You did not specify the price on the fourth line."
|
||||
setup-wrongPrice: "You did not specify the price correctly, use numbers only."
|
||||
setup-rentSuccess: "Renting of region %lang:region% is setup correctly."
|
||||
setup-buySuccess: "Buying of region %lang:region% is setup correctly."
|
||||
setup-noPermissionRent: "You don't have permission for setting up rental regions."
|
||||
setup-noPermissionBuy: "You don't have permission for setting up buy regions."
|
||||
setup-couldNotDetect: "Found multiple regions with the same priority and/or parent/child relation, specify one on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
setup-blacklisted: "%0% is on the blacklist and cannot be added to AreaShop."
|
||||
setup-noPermission: "You cannot add the region '%0%', you are not an owner/member or don't have the permission for it."
|
||||
|
||||
destroy-noPermissionRent: "You don't have permission for deregistering a rental region."
|
||||
destroy-noPermissionBuy: "You don't have permission for deregistering a buy region."
|
||||
destroy-successRent: "%lang:region% successfully deregistered as rental region."
|
||||
destroy-successBuy: "%lang:region% successfully deregistered as buy region."
|
||||
|
||||
teleport-help: "/as tp <region> [sign]."
|
||||
teleport-noRentOrBuy: "The specified region is not registered: %0%."
|
||||
teleport-noPermission: "You don't have permission to teleport to your region."
|
||||
teleport-noPermissionOther: "You don't have permission to teleport to regions you do not own."
|
||||
teleport-noPermissionSign: "You don't have permission to teleport to the sign of your region."
|
||||
teleport-noPermissionOtherSign: "You don't have permission to teleport to signs of regions you do not own."
|
||||
teleport-noPermissionFriend: "You don't have permission to teleport to regions you are added to as a friend."
|
||||
teleport-noPermissionFriendSign: "You don't have permission to teleport to the sign of regions you are added to as a friend."
|
||||
teleport-noPermissionAvailable: "You don't have permission to teleport to available regions."
|
||||
teleport-noPermissionAvailableSign: "You don't have permission to teleport to the sign of available regions."
|
||||
teleport-success: "You teleported to %lang:region%."
|
||||
teleport-successSign: "You teleported to the sign of %lang:region%."
|
||||
teleport-noSafe: "No safe position found in %lang:region%, no spots in the region left or maximum tries exceeded (%0%/%1%)."
|
||||
teleport-blocked: "You can't teleport because the position is outside the region, and you are forced to teleport inside."
|
||||
teleport-changedToSign: "You only have permission to teleport to the sign and not inside the region, teleporting to sign."
|
||||
teleport-changedToNoSign: "No sign available to teleport to, trying to teleport inside the region instead."
|
||||
teleport-wrongWorld: "You need to be in world '%world%' to teleport to %lang:region%, but you are in world '%0%'."
|
||||
|
||||
setteleport-help: "/as settp [region] [reset], the region you stand in will be used if not specified."
|
||||
setteleport-noPermission: "You don't have permission to set the teleport location."
|
||||
setteleport-noPermissionOther: "You don't have permission to set the teleport location for a region you do not own."
|
||||
setteleport-noRentOrBuy: "The specified region is not registered: %0%."
|
||||
setteleport-success: "Teleport location of %lang:region% set."
|
||||
setteleport-notInside: "The location has to be inside the region."
|
||||
setteleport-reset: "Teleport location of %lang:region% has been reset."
|
||||
|
||||
find-help: "/as find <buy|rent> [maxprice] [group]."
|
||||
find-noPermission: "You don't have permission to search regions and teleport to them."
|
||||
find-success: "Found a %0% region: %lang:region%, while searching with a max price of your balance: %1%%2%."
|
||||
find-successMax: "Found a %0% region: %lang:region%, while searching with a max price of %1%%2%."
|
||||
find-wrongMaxPrice: "The specified maximum price is not a correct number: %0%."
|
||||
find-wrongGroup: "The specified group does not exist: %0%."
|
||||
find-noneFound: "No %0% region found while searching with a max price of your balance: %1%%2%."
|
||||
find-noneFoundMax: "No %0% region found while searching with a max price of %1%%2%."
|
||||
find-onlyInGroup: ", only searched for regions in group: %0%."
|
||||
|
||||
groupadd-help: "/as groupadd <group> [region], if no region specified all regions from your WorldEdit selection are used."
|
||||
groupadd-noPermission: "You don't have permission to add regions to groups."
|
||||
groupadd-success: "Region %lang:region% has been added to group '%0%', this group now has %1% member(s)."
|
||||
groupadd-failed: "Region %lang:region% is already a member of group '%0%'."
|
||||
groupadd-weSuccess: "Added to group %0%: [gray]%1%."
|
||||
groupadd-weFailed: "Were already in group %0%: [gray]%1%."
|
||||
|
||||
groupdel-help: "/as groupdel <group> [region], if no region specified all regions from your WorldEdit selection are used."
|
||||
groupdel-noPermission: "You don't have permission to remove regions from groups."
|
||||
groupdel-wrongGroup: "Group %0% not found, check '/as grouplist' for registered groups."
|
||||
groupdel-success: "Region %lang:region% has been removed from group '%0%', this group now has %1% member(s)."
|
||||
groupdel-failed: "Region %lang:region% is not a member of group '%0%'."
|
||||
groupdel-weSuccess: "Removed from group %0%: [gray]%1%."
|
||||
groupdel-weFailed: "Were not in group %0% anyway: [gray]%1%."
|
||||
|
||||
grouplist-noPermission: "You don't have permission to display the registered groups."
|
||||
grouplist-noGroups: "There are currently no groups registered."
|
||||
grouplist-success: "The following groups are registered: [gray]%0%."
|
||||
|
||||
groupinfo-help: "/as groupinfo <group>."
|
||||
groupinfo-noPermission: "You don't have permission to display information about a group."
|
||||
groupinfo-noGroup: "There is no group registered with the name '%0%', use /as grouplist to check groups."
|
||||
groupinfo-members: "The following regions are member of group %0%: [gray]%1%."
|
||||
groupinfo-noMembers: "Group %0% does not have any members."
|
||||
|
||||
schemevent-help: "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
|
||||
schemevent-wrongEvent: "The specified event '%0%' does not exist, use one of the following: [gray]%1%."
|
||||
schemevent-success: "Event '%0%' has successfully been triggered for region %lang:region%."
|
||||
schemevent-noPermission: "You don't have permission to trigger schematic events."
|
||||
|
||||
add-help: "/as add <rent|buy> [region] [world]."
|
||||
add-noPermission: "You don't have permission to add a region to AreaShop."
|
||||
add-success: "Added as %0%: [gray]%1%."
|
||||
add-failed: "Already registered: [gray]%0%."
|
||||
add-failedOtherWorld: "Already registered from another world: [gray]%0%."
|
||||
add-blacklisted: "On the blacklist: [gray]%0%."
|
||||
add-specifyWorld: "Specify the world of the region when using from console."
|
||||
add-incorrectWorld: "World '%0%' not found, try again (case-sensitive)."
|
||||
add-noPermissionRegions: "No permission to add: [gray]%0%."
|
||||
add-noPermissionOwnerMember: "[gray]You either are not a member/owner of these regions or have no permission to add your regions."
|
||||
|
||||
del-noPermission: "You don't have permission to remove regions."
|
||||
del-success: "Removed regions: [gray]%0%."
|
||||
del-failed: "No permission to remove or not registered: [gray]%0%."
|
||||
|
||||
addsign-help: "/as addsign [region] [profile]."
|
||||
addsign-noSign: "You are not looking at a sign."
|
||||
addsign-noRegions: "No region found around the sign position."
|
||||
addSign-notRegistered: "The specified region is not registered in AreaShop: %0% (it first needs to be added to AreaShop before a sign can be added)."
|
||||
addsign-couldNotDetect: "Found multiple regions around the sign, specify region as extra argument (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
addsign-couldNotDetectSign: "Found multiple regions around the sign, specify region on the second line (2 of the regions that were found: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
addsign-wrongProfile: "The specified profile does not exist, use one of the following (check config): [gray]%0%."
|
||||
addsign-profile:
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Signprofile %0%"
|
||||
- " hover: %lang:action|Use this profile|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
addsign-success: "The sign has been added to %lang:region%."
|
||||
addsign-successProfile: "The sign has been added to %lang:region% with profile %0%."
|
||||
addsign-alreadyRegistered: "That sign is already registered for region %lang:region%."
|
||||
addsign-noPermission: "You don't have permission to add a sign."
|
||||
|
||||
delsign-noSign: "You are not looking at a sign."
|
||||
delsign-noPermission: "You don't have permission to delete a sign."
|
||||
delsign-noRegion: "That sign does not belong to an AreaShop region."
|
||||
delsign-success: "The sign has been removed from region %lang:region%."
|
||||
|
||||
me-noPermission: "You don't have permission to check which regions you have."
|
||||
me-header: "Regions of %lang:tPlayer|%0%|%:"
|
||||
me-notAPlayer: "You are not a player so you can't have any regions."
|
||||
me-rentLine:
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% left"
|
||||
- " hover: until %until%"
|
||||
- ")."
|
||||
me-buyLine: "[darkgreen][bold]►[reset] %lang:region%."
|
||||
me-friendLine:
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "owned by %lang:player%"
|
||||
- " hover: You are added as friend"
|
||||
- ")."
|
||||
me-nothing: "%lang:tPlayer|%0%|% has not rented or bought regions and is not added as friend to one."
|
||||
me-noPlayer: "%0% cannot be found, probably never joined the server."
|
||||
me-clickHint: "[gray][italic]Click a region name to see details."
|
||||
|
||||
setowner-help: "/as setowner <player> [region], the region you stand in will be used if not specified."
|
||||
setowner-noPermission: "You don't have permission to set the owner of a region."
|
||||
setowner-noPermissionRent: "You don't have permission to set the owner of rent regions."
|
||||
setowner-noPermissionBuy: "You don't have permission to set the owner of buy regions."
|
||||
setowner-notRegistered: "The specified region is not registered, owner cannot be set."
|
||||
setowner-noPlayer: "Could not get the UUID of the specified player: %0%."
|
||||
setowner-succesRent: "Owner of %lang:region% successfully changed to %lang:player%, rented until %until% (%timeleft% left)."
|
||||
setowner-succesRentExtend: "Owner was already %lang:player%, rent extended with '%duration%', now rented until %until% (%timeleft% left)."
|
||||
setowner-succesBuy: "Owner of %lang:region% successfully changed to %lang:player%."
|
||||
|
||||
resell-help: "/as resell <price> [region], the region you stand in will be used if not specified."
|
||||
resell-wrongPrice: "'%0%' is not a valid price."
|
||||
resell-notRegistered: "The specified region is not registered: %0%."
|
||||
resell-notBought: "You can't resell %lang:region% because it is not sold yet."
|
||||
resell-success: "%lang:region% is successfully put into reselling mode for %resellprice%."
|
||||
resell-noPermission: "You don't have permission to set your region in reselling mode."
|
||||
resell-noPermissionOther: "You don't have permission to set regions in reselling mode."
|
||||
resell-disabled: "Reselling has been disabled for this region."
|
||||
|
||||
stopresell-help: "/as stopresell [region], the region you stand in will be used if not specified."
|
||||
stopresell-notRegistered: "The specified region is not registered: %0%."
|
||||
stopresell-notResell: "You can't stop reselling %lang:region% because it is not in resell mode."
|
||||
stopresell-success: "%lang:region% is successfully put back into sold mode."
|
||||
stopresell-noPermission: "You don't have permission to set your region back to sold mode."
|
||||
stopresell-noPermissionOther: "You don't have permission to set regions back to sold mode."
|
||||
|
||||
addfriend-help: "/as addfriend <player> [region], the region you stand in will be used if not specified."
|
||||
addfriend-noPermissionOther: "You don't have permission to add friends to regions that are not yours."
|
||||
addfriend-noPermission: "You don't have permission to add friends to your region."
|
||||
addfriend-successOther: "%lang:tPlayer|%0%|% has been added as friend to region %lang:region%."
|
||||
addfriend-success: "%lang:tPlayer|%0%|% has been added as friend to your region %lang:region%."
|
||||
addfriend-alreadyAdded: "%lang:tPlayer|%0%|% is already added as friend to %lang:region%."
|
||||
addfriend-self: "Adding the owner of the region as friend would be pointless."
|
||||
addfriend-noOwner: "You cannot add friends to a region without owner."
|
||||
addfriend-notVisited: "You cannot add %0% because he did not visit the server yet."
|
||||
|
||||
delfriend-help: "/as delfriend <player> [region], the region you stand in will be used if not specified."
|
||||
delfriend-noPermissionOther: "You don't have permission to delete friends from regions that are not yours."
|
||||
delfriend-noPermission: "You don't have permission to delete friends from your region."
|
||||
delfriend-successOther: "%lang:tPlayer|%0%|% has been deleted as friend from region %lang:region%."
|
||||
delfriend-success: "%lang:tPlayer|%0%|% has been deleted as friend from your region %lang:region%."
|
||||
delfriend-notAdded: "%lang:tPlayer|%0%|% is not added as friend to %lang:region%."
|
||||
delfriend-noOwner: "You cannot remove friends from a region without owner."
|
||||
|
||||
linksigns-multipleRegions: "Found multiple regions: [gray]%0%."
|
||||
linksigns-multipleRegionsAdvice: "Click another time to try again or use '/as linksigns' to stop."
|
||||
linksigns-noRegions: "No AreaShop regions found in the direction of your cursor, make sure the region is added to AreaShop [gray](maximum range 100 blocks)."
|
||||
linksigns-regionFound: "Region %lang:region% has been found, now point to a sign and leftclick to link it."
|
||||
linksigns-signFound: "Found a sign at (%0%, %1%, %2%), now point towards a region and rightclick to link it"
|
||||
linksigns-noSign: "No sign found in the direction of your cursor, make sure you have a direct sight to a sign and click again [gray](maximum range 100 blocks)."
|
||||
linksigns-alreadyRegistered: "That sign is already registered for region %lang:region%, click again to select another sign."
|
||||
linksigns-first: "You have entered sign linking mode."
|
||||
linksigns-next: "[gray]Leftclick to select a sign, rightclick to select a region, use /as linksigns to stop."
|
||||
linksigns-noPermission: "You don't have permission to enter bulk sign linking mode."
|
||||
linksigns-stopped: "Exited sign linking mode."
|
||||
|
||||
stack-help:
|
||||
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
|
||||
- " [gray]<amount> Number of regions that will be created.[break]"
|
||||
- " [gray]<gap> Blocks distance between the regions.[break]"
|
||||
- " [gray]<name> Name of the regions (number will be behind it).[break]"
|
||||
- " [gray]<rent|buy> Make then rent or buy regions.[break]"
|
||||
- " [gray][group] A group to add the created regions to.[break]"
|
||||
- " [gray]The regions will be created in the direction you are facing."
|
||||
stack-accepted: "Starting to create %0% %1% regions with %2% blocks in between, names start with %3% and have a number behind them.%4%"
|
||||
stack-addToGroup: " Created regions will be added to the group '%0%'."
|
||||
stack-noPermission: "You don't have permission to create and add regions to AreaShop in bulk."
|
||||
stack-wrongAmount: "'%0%' is not a correct amount of regions."
|
||||
stack-wrongGap: "'%0%' is not a correct number for the number of blocks gap between regions."
|
||||
stack-noSelection: "You don't have a selection that indicates where the first region should be created."
|
||||
stack-addStart: "[gray]Adding %0% regions at %1% per second."
|
||||
stack-addComplete: "[gray]Added %0% regions%1%."
|
||||
stack-tooHigh: ", %0% regions skipped because they were above Y=256"
|
||||
stack-tooLow: ", %0% regions skipped because they were below Y=0"
|
||||
stack-unclearDirection: "Please look clearly in the north, east, south, west, up or down direction, currently detected %0%."
|
||||
|
||||
setlandlord-help: "/as setlandlord <player> [region], the region you stand in will be used if not specified."
|
||||
setlandlord-noPermission: "You don't have permission to set the landlord for a region."
|
||||
setlandlord-success: "%lang:landlord% has successfully been set as landlord of %lang:region%."
|
||||
|
||||
message-help: "/as message <player> <message...>"
|
||||
message-noPermission: "You do not have permission to send AreaShop messages."
|
||||
message-notOnline: "%0% is not online."
|
||||
|
||||
import-help: "/as import RegionForSale"
|
||||
import-wrongSource: "Specify from where you want to import data, options: RegionForSale."
|
||||
import-noPluginFolder: "Could not find the %0% folder, are you sure you are importing from the correct source?"
|
||||
import-noWorldsFolder: "There is no 'plugins/RegionForSale/worlds' folder, therefore nothing could be imported."
|
||||
import-confirm: "Are you sure you want to import all regions from RegionForSale?"
|
||||
import-start: "Starting import of RegionForSale data:"
|
||||
import-doWorld: "[darkgreen][bold]► World %0%:"
|
||||
import-noBukkitWorld: "[red]Could not find world in Bukkit."
|
||||
import-noRegionManager: "[red]Could not get RegionManager from WorldGuard, are regions enabled in this world?"
|
||||
import-noRegions: "[red]No regions.yml file found."
|
||||
import-loadRegionsFailed: "[red]Could not load regions.yml at: %0%"
|
||||
import-invalidRegionSection: "[red]Invalid section in regions.yml: %0%."
|
||||
import-noWorldGuardRegion: "[red]WorldGuard region not found: %0%."
|
||||
import-noWorldGuardRegionParent: "[red]WorldGuard region for parent region not found: %0%."
|
||||
import-buyAndRent: "[gold]%0% can be bought and rented, only adding as buy in AreaShop (cannot be both)."
|
||||
import-noBuyAndNoRent: "[red]%0% cannot be bought and cannot be rented, skipping import."
|
||||
import-imported: "[green]%lang:tRegion|%0%|% imported."
|
||||
import-loadWorldConfigFailed: "[red]Loading world-specific config.yml failed: %0%."
|
||||
import-improperParentRegion: "[red]Parent region %0% does not have readable settings."
|
||||
import-alreadyAdded: "[red]Region '%0%' has already been added."
|
||||
import-alreadyAddedOtherWorld: "[red]Region '%0%' has already been added in world %1%, regions in different worlds cannot have the same name in AreaShop."
|
||||
import-invalidSignLocation: "[red]Failed to import a sign of region '%0%', invalid location: '%1%'."
|
||||
import-signAlreadyAdded: "[red]Skipped adding sign at location '%1%' to region '%0%', it is already added to region '%2%'."
|
||||
import-moneyBackFailed: "[red]Failed to parse buy price '%0%' and sell price '%1%' to set the money back percentage."
|
||||
|
||||
confirm-rent:
|
||||
- "%lang:prefix%Are you sure you want to rent %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to rent %0%|%"
|
||||
- " hover: %lang:action|Rent %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
confirm-extend:
|
||||
- "%lang:prefix%Are you sure you want to extend %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to extend %0%|%"
|
||||
- " hover: %lang:action|Extend %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
confirm-unrent:
|
||||
- "%lang:prefix%Are you sure you want to stop renting %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to stop renting %0%|%"
|
||||
- " hover: %lang:action|Stop renting %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
confirm-buy:
|
||||
- "%lang:prefix%Are you sure you want to buy %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to buy %0%|%"
|
||||
- " hover: %lang:action|Buy %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
confirm-sell:
|
||||
- "%lang:prefix%Are you sure you want to sell %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
|
||||
- " hover: %lang:action|Sell %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
|
||||
timeleft-years: "%0% years"
|
||||
timeleft-months: "%0% months"
|
||||
timeleft-days: "%0% days"
|
||||
timeleft-hours: "%0% hours"
|
||||
timeleft-minutes: "%0% minutes"
|
||||
timeleft-second: "%0% second"
|
||||
timeleft-seconds: "%0% seconds"
|
||||
timeleft-ended: "Expired"
|
||||
|
||||
greeting-forrent: "%region% can be rented for %price% per %duration%."
|
||||
greeting-rented: "%region% is rented by %player% until %until%."
|
||||
greeting-forsale: "%region% can be bought for %price%."
|
||||
greeting-bought: "%region% is bought by %player%."
|
||||
greeting-resale: "%region% can be bought for %resellprice% from %player%."
|
||||
|
||||
update-playerNotify:
|
||||
- "[darkgreen]Update from AreaShop V%0% to AreaShop V%1% available, get the latest version at "
|
||||
- "[bold]Spigot[/bold]"
|
||||
- " hover: %lang:action|Go to the Spigot AreaShop page|%"
|
||||
- " link: https://www.spigotmc.org/resources/areashop.2991/"
|
||||
- " (and leave a review)."
|
||||
@@ -0,0 +1,555 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Spanish language file, plugin version 2.5.0, 424/428 messages are translated (99%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Use %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Use %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Region %0%"
|
||||
- " hover: %lang:action|Region information|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Player %0%"
|
||||
- " hover: %lang:action|Regions of %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Landlord %landlord%"
|
||||
- " hover: %lang:action|Regions of %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "No puedes alquilar o comprar %0% region(es) en total (ya tienes %1% en el grupo '%2%')."
|
||||
"confirm-yes": " [gray]Haz click en %lang:command|Confirm||%[gray], o reenvía el comando."
|
||||
"general-notReady": "AreaShop no se ha cargado todavía. Espera un poco."
|
||||
"general-noWorld": "No puedes hacer esto, el mundo de la región %lang:region% no está disponible (mundo '%world%')."
|
||||
"general-noRegion": "No puedes hacer esto, la región de WorldGuard no está disponible (region %lang:region%)."
|
||||
"general-noEconomy": "No hemos detectado un plugin de Economía o no está bien configurado. Habla con un staff para solucionar esto."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Este comando no es válido, usa '/as help' para mas informacion."
|
||||
"cmd-onlyByPlayer": "Este comando solo puede ser ejecutado por un jugador."
|
||||
"cmd-weOnlyByPlayer": "Se puede usar la selección de WorldEdit, especifica un nombre de región como argumento extra."
|
||||
"cmd-noSelection": "No has hecho una selección de WorldEdit."
|
||||
"cmd-noRegionsFound": "La región en la que te encuentras no está registrada en AreaShop."
|
||||
"cmd-noWERegionsFound": "No se han encontrado regiones en medio de tu selección de WorldEdit."
|
||||
"cmd-notRegistered": "La region '%0%' no está disponible en AreaShop."
|
||||
"cmd-noRegion": "'%0%' no es una región de WorldGuard válida."
|
||||
"cmd-noRegionsAtLocation": "No se han encontrado regiones en tu localización, especifica el nombre como un argumento extra."
|
||||
"cmd-moreRegionsAtLocation": "Se han encontrado varias regiones en tu localización, especifica el nombre como argumento extra."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Solo se permite determinar regiones a los jugadores, especifica la región como argumento extra."
|
||||
"help-header": "Página de Ayuda - Comandos que puedes ejecutar."
|
||||
"help-noPermission": "No tienes permiso para ver la página de ayuda."
|
||||
"help-alias": "Alias de comandos: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Muestra esta página de ayuda."
|
||||
"help-info": "%lang:helpCommand|/as info|% Ver la información de las regiones."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Alquilar una región o extender su alquiler."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Comprar una región."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Desalquilar una región."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Vender una región."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Recargar los archivos y actualizar las regiones."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Configurar el reseteo en on/off y elegir el perfil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Cambiar el precio de una región."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Cambiar el tiempo de alquiler de una región."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teletransportarse a una región de venta/alquiler."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Configurar el punto de teletransporte de una región."
|
||||
"help-find": "%lang:helpCommand|/as find|% Encontrar una región en venta o alquiler."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Agregar una región a un grupo."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Borrar una región de un grupo."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Ver todos los grupos registrados."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Mostrar información sobre un grupo."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Ejecutar un evento de schematic para la región."
|
||||
"help-add": "%lang:helpCommand|/as add|% Registrar una región como compra/alquiler."
|
||||
"help-del": "%lang:helpCommand|/as del|% Borrar una región de AreaShop."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Agregar un cartel a una región."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Borrar el cartel que estás mirando."
|
||||
"help-me": "%lang:helpCommand|/as me|% Ver las regiones que posees (+expiración)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Configurar el propietario de la región o extender su alquiler."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Configurar una región en el modo reventa."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Configurar una región como vendida."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Agregar un amigo a la región."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Borrar a un amigo de la región."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Empezar el enlace de carteles - regiones."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Crear regiones múltiples y agregarlas."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Configurar el propietario de una región."
|
||||
"help-import": "%lang:helpCommand|/as import|% Importar región desde RegionForSale."
|
||||
"rent-help": "/as rent [region], la región en la que estás será usada si no se especifican nombres."
|
||||
"rent-noPermission": "No tienes permiso para alquilar una región."
|
||||
"rent-maximum": "No puedes alquilar más de %0% region(es) (ya tienes %1% en el grupo '%2%')."
|
||||
"rent-maximumExtend": "No puedes extender el alquiler porque tienes más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
|
||||
"rent-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
|
||||
"rent-rented": "Has alquilado la región %lang:region% hasta %until%, puedes extender el alquiler haciendo click derecho en el cartel o usando /as rent."
|
||||
"rent-extended": "El alquiler de la región %lang:region% se ha extendido hasta %until%."
|
||||
"rent-extendedToMax": "Has extendido el alquiler de %lang:region% hasta %until% (Tiempo de alquiler máximo de %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "No tienes dinero suficiente para extender el alquiler (tienes %0% y necesitas %price%)."
|
||||
"rent-lowMoneyRent": "No tienes dinero suficiente para alquilar la región %lang:region% (tienes %0% y necesitas %price%)."
|
||||
"rent-someoneElse": "Otra persona ha alquilado antes la región %lang:region%."
|
||||
"rent-notRentable": "Esta región no está disponible para alquilar."
|
||||
"rent-maxExtends": "No puedes extender más el alquiler (el máximo de veces es %maxextends%), pero cuando acabe el alquiler podrás alquilar la región de nuevo."
|
||||
"rent-maxRentTime": "No puedes alquilar la región %lang:region% más tiempo por adelantado, el tiempo máximo es de %maxrenttime% y ya la has alquilado por %timeleft%."
|
||||
"rent-restrictedToWorld": "Necesitas estar en el mundo '%world%' para alquilar la región %lang:region% (estás en '%0%')."
|
||||
"rent-restrictedToRegion": "Tienes que estar dentro de %lang:region% para alquilarla."
|
||||
"rent-expireWarning": "Tu región %lang:region% está a punto de caducar (%timeleft% restantes), extiéndela si quieres seguir usándola."
|
||||
"rent-expiringSoon": "Tu región %lang:tRegion|%0%|% está a punto de caducar (%1% restantes), extiéndela si quieres seguir usándola."
|
||||
"rent-alreadyAtFull": "%lang:region% ha alcanzado su tiempo máximo de alquiler. Espera hasta que puedas alquilar más veces."
|
||||
"buy-help": "/as buy [region], la región en la que estás será usada si no se especifican nombres."
|
||||
"buy-noPermission": "No tienes permiso para comprar una región."
|
||||
"buy-noPermissionResell": "No tienes permiso para comprar una región en modo reventa."
|
||||
"buy-noPermissionNoResell": "No tienes permiso para comprar una región que no esté en modo reventa."
|
||||
"buy-notBuyable": "La región %lang:region% no se puede comprar."
|
||||
"buy-maximum": "No puedes comprar más de %0% región(es) (ya tienes %1% en el grupo '%2%')."
|
||||
"buy-payError": "Algo ha ido mal a la hora de pagar, inténtalo de nuevo más tarde."
|
||||
"buy-succes": "Has comprado la región %lang:region%."
|
||||
"buy-successResale": "Has comprado la región %lang:region%, provinente de %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Tu región %lang:region% se ha vendido a %lang:player% por %0%."
|
||||
"buy-lowMoney": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %price%)."
|
||||
"buy-lowMoneyResell": "No tienes dinero suficiente para comprar la región %lang:region% (tienes %0% y necesitas %resellprice%)."
|
||||
"buy-yours": "Ya eres propietario de la %lang:region%."
|
||||
"buy-someoneElse": "Alguien más ha comprado la %lang:region%."
|
||||
"buy-restrictedToWorld": "Necesitas estar en el mundo '%world%' para comprar la región %lang:region% (estas en '%0%')."
|
||||
"buy-restrictedToRegion": "Tienes que estar dentro de %lang:region% para comprarla."
|
||||
"unrent-help": "/as unrent [region], la región en la que estás será usada si no se especifican nombres."
|
||||
"unrent-noPermission": "No tienes permiso para desalquilar una región."
|
||||
"unrent-noPermissionOther": "No tienes permiso para desalquilar una región ajena."
|
||||
"unrent-notRegistered": "La región no se puede desalquilar porque no está registrada en el modo Alquiler."
|
||||
"unrent-notRented": "La región no se puede desalquilar porque no está alquilada."
|
||||
"unrent-unrented": "%lang:region%, de %lang:player%, ha sido desalquilada."
|
||||
"unrent-expired": "El alquiler de tu región %lang:region% ha expirado."
|
||||
"sell-help": "/as sell [region], la región en la que estás será usada si no se especifican nombres."
|
||||
"sell-notRegistered": "La región no se puede vender porque no está registrada para comprar."
|
||||
"sell-notBought": "La región no se puede vender porque no tiene propietario."
|
||||
"sell-sold": "La región %lang:region%, de %lang:player%, ha sido vendida."
|
||||
"sell-noPermission": "No tienes permiso para vender regiones."
|
||||
"sell-noPermissionOther": "No tienes permiso para vender regiones ajenas."
|
||||
"reload-reloading": "Todos los archivos han sido recargados, comprobando alquileres y actualizando regiones..."
|
||||
"reload-noPermission": "No tienes permiso para recargar los archivos de configuración."
|
||||
"reload-updateCommandChanged": "Los comandos '/as updaterents' y '/as updatebuys' han sido borrados, '/as reload' actualizará las regiones. Puedes usar este comando en vez de los 2 primeros."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
"info-noPermission": "No tienes permiso para ver información sobre las regiones."
|
||||
"info-allHeader": "Todas las regiones%0%:"
|
||||
"info-rentedHeader": "Regiones alquiladas%0%:"
|
||||
"info-forrentHeader": "Regiones en alquiler%0%:"
|
||||
"info-forsaleHeader": "Regiones en venta%0%:"
|
||||
"info-soldHeader": "Regiones vendidas%0%:"
|
||||
"info-resellingHeader": "Regiones de reventa%0%:"
|
||||
"info-nogroupHeader": "Regiones sin grupo%0%:"
|
||||
"info-limitedToGroup": " (limitado al grupo %0%)"
|
||||
"info-nogroupNone": "No hay regiones sin grupo."
|
||||
"info-noFiltergroup": "El grupo '%0%' no existe, y por lo tanto no puede ser usado para limitar los resultados."
|
||||
"info-noRegions": "No se han encontrado regiones."
|
||||
"info-wrongPage": "%0% no es un número de página correcto."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]En alquiler por %price% durante %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Alquilada a %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]En venta por %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendida a %lang:player% (reventa)."
|
||||
"info-pageStatus": "[gold]Pagina %0%/%1%"
|
||||
"info-pagePrevious":
|
||||
- " [gold][bold]◄Anterior[/bold] "
|
||||
- " hover: %lang:action|Mostrar la página anterior|%"
|
||||
- " command: %0%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Anterior[/bold] "
|
||||
- " hover: Esta es la primera página"
|
||||
"info-pageNext":
|
||||
- " [gold][bold]Siguiente►[/bold]"
|
||||
- " hover: %lang:action|Mostrar la página siguiente|%"
|
||||
- " command: %0%"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Next►[/bold]"
|
||||
- " hover: Esta es la última pagina"
|
||||
"info-playerHelp": "/as info player <nombre>."
|
||||
"info-playerRents": "Regiones alquiladas por %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% no ha alquilado una región."
|
||||
"info-playerBuys": "Regiones compradas por %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% no ha comprado una región."
|
||||
"info-regionHelp": "/as info region [name], la región donde estás será utilizada si no se especifican nombres."
|
||||
"info-regionHeaderRent": "[darkgreen]Información sobre %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Información sobre %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Alquilada por %lang:player% hasta: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Comprada por %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Comprada por %lang:player%, actualvente en reventa."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Extender por[/bold]"
|
||||
- " hover: Extender el alquiler de %region%"
|
||||
- " hover: con %duration% por %price%"
|
||||
- " hover: %lang:action|Extender el alquiler de %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% por %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Alquilar por[/bold]"
|
||||
- " hover: Alquilar %region% por %price% durante %duration%"
|
||||
- " hover: %lang:action|Alquilar %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% por %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Comprar por[/bold]"
|
||||
- " hover: Comprar %region% por %price%"
|
||||
- " hover: %lang:action|Comprar %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Precio de reventa: [gray]%resellprice% (puedes comprarla de %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Jugadores agregados: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|Borrar a %0% como amigo|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Paga de venta: [gray]%moneyback% (%moneybackpercent%% del precio)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Paga de venta[/bold]"
|
||||
- " hover: Vender %region% y recuperar %moneyback%"
|
||||
- " hover: %lang:action|Vender %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% del precio)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Paga por desalquilar: [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Paga por desalquilar[/bold]"
|
||||
- " hover: Desalquilar %region% y recuperar %moneyback%"
|
||||
- " hover: %lang:action|Desalquilar %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% del tiempo restante)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Numero de extensiones máximas: [gray]%maxextends% veces."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] No se puede extender el alquiler."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensiones restantes: [gray]%extendsleft% veces de %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Alquiler por adelantado: [gray]%maxrenttime% como máximo."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Ir a la region[/bold]"
|
||||
- " hover: %lang:action|Teletransportarse a %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]Configurar un punto de teletransporte[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Configurar un punto de teletransporte|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Carteles conectados: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Grupos asignados: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Desalquiler automático después de: [gray]%inactivetime% de inactividad por parte del jugador."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Venta automática después de: [gray]%inactivetime% de inactividad por parte del jugador."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para alquilarla."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para alquilar la %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Tienes que estar dentro de la %lang:region% para comprarla."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Tienes que estar en el mundo '%world%' para comprar %lang:region%."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Restauración Activada [gray](la región se vaciará al desalquilarla)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Restauración Alquilada [gray](la región se vaciará al venderla)."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Propietario de la región: [gray]%lang:landlord% (recibe el dinero)."
|
||||
"info-regionNotExisting": "La región especificada no está registrada: %0%."
|
||||
"setrestore-help": "/as setrestore <región> <true|false|general> [perfil]."
|
||||
"setrestore-noPermission": "No tienes permiso para cambiar la configuración de restauración."
|
||||
"setrestore-notRegistered": "La región especificada no está registrada: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' no es un estado válido. Debe ser true, false o general."
|
||||
"setrestore-success": "Se ha configurado la opción de restauración de %lang:region% a '%0%'."
|
||||
"setrestore-successProfile": "Se ha configurado la opción de restauración de %lang:region% a '%0%' y el perfil a '%1%'."
|
||||
"setprice-noPermission": "No tienes permiso para cambiar el precio de una región."
|
||||
"setprice-help": "/as setprice <precio> [región], la región en la que estás será utilizada si no se especifican nombres."
|
||||
"setprice-notRegistered": "La región especificada no está registrada: %0%."
|
||||
"setprice-wrongPrice": "'%0%' no es un precio válido."
|
||||
"setprice-successRent": "El precio de la región %lang:region% se ha cambiado a %price% por %duration%."
|
||||
"setprice-successBuy": "El precio de la región %lang:region% se ha cambiado a %price%."
|
||||
"setprice-successRemoved": "El precio de la región %lang:region% ha sido borrado, ahora se utilizará el precio por defecto. Nuevo Precio: %price%."
|
||||
"setprice-noLandlord": "No puedes cambiar el precio de la región %lang:region% porque no eres su propietario."
|
||||
"setduration-noPermission": "No tienes permiso para editar la duración de un alquiler."
|
||||
"setduration-help": "/as setduration <cantidad> <identificador> [región], la región en la que estás será utilizada si no se especifican nombres."
|
||||
"setduration-notRegistered": "%0% no está registrada para alquilar."
|
||||
"setduration-wrongAmount": "'%0%' no es una cantidad válida, especifica un número entero."
|
||||
"setduration-wrongFormat": "'%0%' no es un formato de tiempo válido, comprueba la documentación en Bukkit."
|
||||
"setduration-success": "La duración de la región %lang:region% se ha cambiado a '%duration%'."
|
||||
"setduration-noLandlord": "No tienes permiso para cambiar la duración porque no eres propietario de la región %lang:region%."
|
||||
"setduration-successRemoved": "La duración de la %lang:region% ha sido borrada, ahora se utilizará la duración por defecto. Nueva Duración: %duration%."
|
||||
"setup-noRegion": "No has especificado una región en la segunda línea."
|
||||
"setup-alreadyRentSign": "La región que has especificado ya está registrada en AreaShop como región de Alquiler, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
|
||||
"setup-alreadyBuySign": "La región que has especificado ya está registrada en AreaShop como región de Compra, agrega los carteles con [as] en la primera línea o usa '/as addsign'."
|
||||
"setup-noDuration": "No has especificado cuánto tiempo puede ser alquilada la región, haz esto en la tercera línea."
|
||||
"setup-wrongDuration": "El tiempo especificado no está en el formato correcto, ejemplo: 1 día."
|
||||
"setup-noPrice": "No has especificado el precio en la cuarta línea."
|
||||
"setup-wrongPrice": "No has especificado el precio correctamente, hazlo usando números solamente."
|
||||
"setup-rentSuccess": "El alquiler de la región %lang:region% se ha configurado correctamente."
|
||||
"setup-buySuccess": "La venta de la región %lang:region% se ha configurado correctamente."
|
||||
"setup-noPermissionRent": "No tienes permiso para crear regiones de alquiler."
|
||||
"setup-noPermissionBuy": "No tienes permiso para crear regiones de venta."
|
||||
"setup-couldNotDetect": "Se han encontrado regiones con la misma prioridad o con relación principal/secundaria, especifica una en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% está en la lista negra y no puede usarse en AreaShop."
|
||||
"setup-noPermission": "No puedes agregar la región '%0%', no eres un propietario/miembro o no tienes permiso para esto."
|
||||
"destroy-noPermissionRent": "No tienes permiso para eliminar el registro de una región de Alquiler."
|
||||
"destroy-noPermissionBuy": "No tienes permiso para eliminar el registro de una región de Compra."
|
||||
"destroy-successRent": "La region %lang:region% ha sido eliminada como región de Alquiler."
|
||||
"destroy-successBuy": "La region %lang:region% ha sido eliminada como región de Compra."
|
||||
"teleport-help": "/as tp <region> [cartel]."
|
||||
"teleport-noRentOrBuy": "La región especificada no está registrada: %0%."
|
||||
"teleport-noPermission": "No tienes permiso para teletransportarte a tu región."
|
||||
"teleport-noPermissionOther": "No tienes permiso para teletransportarte a regiones que no te pertenecen."
|
||||
"teleport-noPermissionSign": "No tienes permiso para teletransportarte al cartel de tu región."
|
||||
"teleport-noPermissionOtherSign": "No tienes permiso para teletransportarte al cartel de regiones que no te pertenecen."
|
||||
"teleport-noPermissionFriend": "No tienes permiso para teletransportarte a regiones a las que estas agregado como amigo."
|
||||
"teleport-noPermissionFriendSign": "No tienes permiso para teletransportarte a los carteles de las regiones a las que estas agregado como amigo."
|
||||
"teleport-noPermissionAvailable": "No tienes permiso para teletransportarte a las regiones disponibles."
|
||||
"teleport-noPermissionAvailableSign": "No tienes permiso para teletransportarte a los carteles de las regiones disponibles."
|
||||
"teleport-success": "Te has teletransportado a %lang:region%."
|
||||
"teleport-successSign": "Te has teletransportado al cartel de %lang:region%."
|
||||
"teleport-noSafe": "No se han encontrado posiciones seguras en %lang:region%, no quedan puntos en la región o se han excedido los intentos (%0%/%1%)."
|
||||
"teleport-blocked": "No puedes teletransportarte porque la posición del teletransporte esta dentro de la región, y no tienes permiso para entrar en ella."
|
||||
"teleport-changedToSign": "Tienes permiso para teletransportarte al cartel, pero no a la region. Teletransportando al cartel..."
|
||||
"teleport-changedToNoSign": "No hay cartel al que puedas teletransportarte. Intentando teletransportarse dentro..."
|
||||
"teleport-wrongWorld": "Necesitas estar en el mundo '%world%' para aparecer en %lang:region%, porque estas en el mundo '%0%'."
|
||||
"setteleport-help": "/as settp [region] [reset], la región en la que estás será utilizada si no se especifican nombres."
|
||||
"setteleport-noPermission": "No tienes permiso para configurar el punto de teletransporte."
|
||||
"setteleport-noPermissionOther": "No tienes permiso para configurar el punto de teletransporte de regiones que no te pertenecen."
|
||||
"setteleport-noRentOrBuy": "La region %0% no está registrada."
|
||||
"setteleport-success": "El punto de teletransporte de %lang:region% ha sido configurado."
|
||||
"setteleport-notInside": "La localización tiene que estar dentro de la region."
|
||||
"setteleport-reset": "El punto de teletransporte de %lang:region% ha sido reseteado."
|
||||
"find-help": "/as find <buy|rent> [preciomaximo] [grupo]."
|
||||
"find-noPermission": "No tienes permiso para buscar regiones o teletransportarte a ellas."
|
||||
"find-success": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
|
||||
"find-successMax": "Encontrada una región de %0%: %lang:region%, mientras se buscaba un precio máximo de %1%%2%."
|
||||
"find-wrongMaxPrice": "El precio máximo especificado no es un nímero válido: %0%."
|
||||
"find-wrongGroup": "El grupo %0% no existe."
|
||||
"find-noneFound": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo basado en tu balance: %1%%2%."
|
||||
"find-noneFoundMax": "No se han encontrado regiones de %0% mientras se buscaba un precio máximo de %1%%2%."
|
||||
"find-onlyInGroup": ", solo se han buscado regiones en el grupo: %0%."
|
||||
"groupadd-help": "/as groupadd <group> [region], si no se especifican regiones todas las regiones del WorldEdit serán usadas."
|
||||
"groupadd-noPermission": "No tienes permiso para agregar regiones a grupos."
|
||||
"groupadd-success": "La región %lang:region% ha sido agregada al grupo '%0%', este grupo ahora tiene %1% miembro(s)."
|
||||
"groupadd-failed": "La región %lang:region% ya forma parte del grupo '%0%'."
|
||||
"groupadd-weSuccess": "Agregada al grupo %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Regiones que ya estaban en el grupo %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <group> [region], si no se especifican regiones todas las regiones del WorldEdit seran usadas"
|
||||
"groupdel-noPermission": "No tienes permiso para eliminar regiones de los grupos."
|
||||
"groupdel-wrongGroup": "No se ha encontrado el grupo %0%, comprueba los grupos registrado usando '/as grouplist'."
|
||||
"groupdel-success": "La región %lang:region% ha sido borrada del grupo '%0%', este grupo ahora tiene %1% miembro(s)."
|
||||
"groupdel-failed": "La región %lang:region% no forma parte del grupo '%0%'."
|
||||
"groupdel-weSuccess": "Borradas del grupo %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "No estaban en el grupo %0: [gray]%1%."
|
||||
"grouplist-noPermission": "No tienes permiso para mostrar los grupos registrados."
|
||||
"grouplist-noGroups": "No hya grupos registrados ahora mismo."
|
||||
"grouplist-success": "Grupos que están registrados: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <grupo>."
|
||||
"groupinfo-noPermission": "No tienes permiso para ver la información de los grupos."
|
||||
"groupinfo-noGroup": "No hay ningún grup grupo llamado '%0%', usa /as grouplist para ver todos los grupos."
|
||||
"groupinfo-members": "Las siguientes regiones forman parte del grupo %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "El grupo %0% no tiene miembros."
|
||||
"schemevent-help": "/as schemevent <región> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "El evento '%0%' no existe, usa uno de los siguientes: [gray]%1%."
|
||||
"schemevent-success": "El evento '%0%' ha sido provocado para la región %lang:region%."
|
||||
"schemevent-noPermission": "No tienes permiso para provocar eventos de schematic."
|
||||
"add-help": "/as add <rent|buy> [región] [mundo]."
|
||||
"add-noPermission": "No tienes permiso para agregar una región a AreaShop."
|
||||
"add-success": "Agregado como %0%: [gray]%1%."
|
||||
"add-failed": "Ya registrado: [gray]%0%."
|
||||
"add-blacklisted": "En la lista negra: [gray]%0%."
|
||||
"add-specifyWorld": "Especifica el mundo de la región (Consola)."
|
||||
"add-incorrectWorld": "El mundo '%0%' no existe, inténtalo de nuevo (distingue entre mayúsculas y minúsculas)."
|
||||
"add-noPermissionRegions": "No tienes permiso para agregar: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]No eres miembro/propietario de estas regiones o no tienes permiso para agregar tus regiones."
|
||||
"del-noPermission": "No tienes permiso para borrar regiones."
|
||||
"del-success": "Regiones Borradas: [gray]%0%."
|
||||
"del-failed": "No tienes permiso para borrarlas o no están registradas: [gray]%0%."
|
||||
"addsign-help": "/as addsign [región] [perfil]."
|
||||
"addsign-noSign": "No estás mirando el cartel."
|
||||
"addsign-noRegions": "No se han encontrado regiones alrededor del cartel."
|
||||
"addSign-notRegistered": "La región especificada no está registrada en AreaShop: %0% (primero ha de agregarse a AreaShop antes de que se pueda agregar un cartel)."
|
||||
"addsign-couldNotDetect": "Se han encontrado muchas regiones alrededor del cartel (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Se han encontrado muchas regiones alrededor del cartel, especifica la región en la segunda línea (2 de las regiones que se han encontrado: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "El perfil especificado no existe, usa uno de los siguientes (comprueba la config): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Signprofile %0%"
|
||||
- " hover: %lang:action|Usar este perfil|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "El cartel ha sido agregado a %lang:region%."
|
||||
"addsign-successProfile": "El cartel ha sido agregado a %lang:region% con el perfil %0%."
|
||||
"addsign-alreadyRegistered": "Este cartel ya está registrado para la región %lang:region%."
|
||||
"addsign-noPermission": "No tienes permiso para agregar un cartel."
|
||||
"delsign-noSign": "No estás mirando al cartel."
|
||||
"delsign-noPermission": "No tienes permiso para borrar carteles."
|
||||
"delsign-noRegion": "Este cartel no tiene que ver con ninguna región de AreaShop."
|
||||
"delsign-success": "El cartel se ha desvinculado de la región %lang:region%."
|
||||
"me-noPermission": "No tienes permiso para ver tus regiones."
|
||||
"me-header": "Regiones de %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "No eres un jugador, y no puedes tener regiones."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% restante"
|
||||
- " hover: hasta %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "de %lang:player%"
|
||||
- " hover: Estás agregado como amigo"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% no ha comprado/alquilado regiones y no está agregado como amigo a ninguna."
|
||||
"me-noPlayer": "%0% no existe. Comprueba si ha entrado al servidor."
|
||||
"me-clickHint": "[gray][italic]Haz click en un nombre de región para ver los detalles."
|
||||
"setowner-help": "/as setowner <jugador> [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"setowner-noPermission": "No tienes permiso para cambiar el propietario de una región."
|
||||
"setowner-noPermissionRent": "No tienes permiso para cambiar el propietario de una región de alquiler."
|
||||
"setowner-noPermissionBuy": "No tienes permiso para cambiar el propietario de una región de compra."
|
||||
"setowner-notRegistered": "No se puede cambiar el propietario de la región porque la región no existe."
|
||||
"setowner-noPlayer": "No se pudo encontrar la UUID del jugador: %0%."
|
||||
"setowner-succesRent": "El propietario de %lang:region% ahora es %lang:player%, y su región está alquilada hasta %until% (%timeleft% restante)."
|
||||
"setowner-succesRentExtend": "El propietario de la región ya era %lang:player%, su alquiler se ha extendido '%duration%', y ahora caducará: %until% (%timeleft% restante)."
|
||||
"setowner-succesBuy": "El propietario de la región %lang:region% ahora es %lang:player%."
|
||||
"resell-help": "/as resell <precio> [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"resell-wrongPrice": "'%0%' no es un precio válido."
|
||||
"resell-notRegistered": "La región especificada no es válida: %0%."
|
||||
"resell-notBought": "No puedes revender %lang:region% porque no está vendida todavía."
|
||||
"resell-success": "%lang:region% está en modo reventa por %resellprice%."
|
||||
"resell-noPermission": "No tienes permiso para cambiar tu región a modo reventa."
|
||||
"resell-noPermissionOther": "No tienes permiso para cambiar las regiones a modo reventa."
|
||||
"stopresell-help": "/as stopresell [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"stopresell-notRegistered": "La región especificada no es válida: %0%."
|
||||
"stopresell-notResell": "No puedes parar la reventa de %lang:region% porque no está en modo reventa."
|
||||
"stopresell-success": "%lang:region% ahora está vendida."
|
||||
"stopresell-noPermission": "No tienes permiso para cambiar tu región al modo vendido."
|
||||
"stopresell-noPermissionOther": "No tienes permiso para cambiar las regiones al modo vendido."
|
||||
"addfriend-help": "/as addfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"addfriend-noPermissionOther": "No tienes permiso para agregar amigos en regiones que no te pertenecen."
|
||||
"addfriend-noPermission": "No tienes permiso para agregar amigos a tu región."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% ha sido agregado como amigo en la región %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% ha sido agregado como amigo en tu región %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% ya está agregado como amigo en la región %lang:region%."
|
||||
"addfriend-self": "Es inútil agregar al propietario de la región como amigo."
|
||||
"addfriend-noOwner": "No puedes agregar amigos a regiones sin propietario."
|
||||
"addfriend-notVisited": "No puedes agregar a %0% a la región porque nunca ha visitado el servidor."
|
||||
"delfriend-help": "/as delfriend <jugador> [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"delfriend-noPermissionOther": "No tienes permiso para borrar amigos en regiones que no te pertenecen."
|
||||
"delfriend-noPermission": "No tienes permiso para borrar amigos en tu región."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% ha sido borrado como amigo en la región %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% ha sido borrado como amigo en tu región %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% no está agregado como amigo en %lang:region%."
|
||||
"delfriend-noOwner": "No puedes borrar amigos de regiones sin propietario."
|
||||
"linksigns-multipleRegions": "Se han encontrado muchas regiones: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Haz lick otra vez para intentarlo de nuevo o usa '/as linksigns' para parar."
|
||||
"linksigns-noRegions": "No se han encontrado regiones en esa dirección, comprueba que están añadidas a AreaShop [gray](rango máximo 100 bloques)."
|
||||
"linksigns-regionFound": "Se ha encontrado la región %lang:region%, ahora haz lick izquierdo en un cartel para linkearlo."
|
||||
"linksigns-signFound": "Se ha encontrado un cartel en (%0%, %1%, %2%), ahora haz click derecho en una región para seleccionarla."
|
||||
"linksigns-noSign": "No se ha encontrado ningún cartel, inténtalo de nuevo [gray](rango máximo 100 bloques)."
|
||||
"linksigns-alreadyRegistered": "Este cartel ya está linkeado a la región %lang:region%, haz click otra vez para seleccionar otro cartel."
|
||||
"linksigns-first": "Has entrado en el modo de linkeo de carteles."
|
||||
"linksigns-next": "[gray]Click izquierdo para seleccionar un cartel, click derecho para seleccionar una región, /as linksigns para parar."
|
||||
"linksigns-noPermission": "No tienes permiso para entrar en el modo de linkeo de carteles."
|
||||
"linksigns-stopped": "Has salido del modo de linkeo de carteles."
|
||||
"stack-help":
|
||||
- "/as stack <cantidad> <espacio> <ombre> <rent|buy> [grupo].[break]"
|
||||
- " [gray]<cantidad> Número de regiones que serán creadas.[break]"
|
||||
- " [gray]<espacio> Bloques de distancia entre regiones.[break]"
|
||||
- " [gray]<nombre> Nombre de las regiones (el número estará detrás).[break]"
|
||||
- " [gray]<rent|buy> Hacer las regiones de compra o alquiler.[break]"
|
||||
- " [gray][grupo] Un grupo para agregar las regiones.[break]"
|
||||
- " [gray]Las regiones serán creadas en la dirección en que estás mirando."
|
||||
"stack-accepted": "Empezando a crear %0% %1% regiones con %2% bloques en medio, los nombres empiezan con %3% y tienen un número detrás.%4%"
|
||||
"stack-addToGroup": "Las regiones creadas serán añadidas al grupo '%0%'."
|
||||
"stack-noPermission": "No tienes permiso para crear y agregar regiones."
|
||||
"stack-wrongAmount": "'%0%' no es un número correcto de regiones."
|
||||
"stack-wrongGap": "'%0%' no es un número correcto para el espacio entre las regiones."
|
||||
"stack-noSelection": "No tienes una selección que indique donde se creará la primera región."
|
||||
"stack-addStart": "[gray]Agregando %0% regiones a %1% por segundo."
|
||||
"stack-addComplete": "[gray]Agregadas %0% regiones%1%."
|
||||
"stack-tooHigh": ", %0% regiones saltadas porque estaban por encima de Y=256"
|
||||
"stack-tooLow": ", %0% regiones saltadas porque estaban por debajo de Y=0"
|
||||
"stack-unclearDirection": "Mira hacia todas las direcciones, se han detectado: %0%."
|
||||
"setlandlord-help": "/as setlandlord <jugador> [región], la región en la que estás se usará si no se especifican nombres."
|
||||
"setlandlord-noPermission": "No tienes permiso para configurar el propietario de una región."
|
||||
"setlandlord-success": "%lang:landlord% se ha hecho propietario de la región %lang:region%."
|
||||
"message-help": "/as message <jugador> <mnsaje...>"
|
||||
"message-noPermission": "No tienes permiso para enviar mensajes de AreaShop."
|
||||
"message-notOnline": "%0% no está conectado."
|
||||
"import-help": "/as import RegionForSale"
|
||||
"import-wrongSource": "Especifica de donde quieres importar los datos, opciones: 'RegionForSale'"
|
||||
"import-noPluginFolder": "No se pudo encontrar la carpeta %0%, ¿Seguro que lo está importando del lugar correcto?"
|
||||
"import-noWorldsFolder": "No hay una carpeta 'plugins/RegionForSale/worlds', por lo tanto no se ha importado nada."
|
||||
"import-confirm": "Estás seguro/a de que quieres importar todas las regiones desde RegionForSale?"
|
||||
"import-start": "Empezando importanción de datos de RegionForSale:"
|
||||
"import-doWorld": "[darkgreen][bold]► Mundo %0%:"
|
||||
"import-noBukkitWorld": "[red]no se pudo encontrar el mundo en Bukkit"
|
||||
"import-noRegionManager": "[red]No se encontró RegionManager de WorldGuard, Asegurese de que las regiones están activadas en este mundo."
|
||||
"import-noRegions": "[red]No se encontró regions.yml"
|
||||
"import-loadRegionsFailed": "[red]No se pudo cargar regions.yml en: %0%"
|
||||
"import-invalidRegionSection": "[red]Sección invalida en regions.yml: %0%"
|
||||
"import-noWorldGuardRegion": "[red]Región de WorldGuard no encontrada: %0%"
|
||||
"import-noWorldGuardRegionParent": "[red]Región de WorldGuard para la región padre no encontrada: %0%."
|
||||
"import-buyAndRent": "[gold]%0% puede ser comprada o vendida, solo añadiendo como compra en AreaShop (No puede ser ambos)."
|
||||
"import-noBuyAndNoRent": "[red]%0% no puede ser comprada o alquilada, omitiendo importe."
|
||||
"import-imported": "[green]%lang:tRegion|%0%|% importado."
|
||||
"import-loadWorldConfigFailed": "[red]Carga de config.yml especifica del mundo fallida: %0%"
|
||||
"import-improperParentRegion": "[red]La region padre %0% no tiene configuraciones legibles."
|
||||
"import-alreadyAdded": "[red]La región '%0%' ya ha sido añadida"
|
||||
"import-alreadyAddedOtherWorld": "[red]La región '%0%' ya ha sido añadida al mundo %1%, regiones en diferentes mundos no pueden tener el mismo nombre en AreaShop"
|
||||
"import-invalidSignLocation": "[red]Fallo al importar un cartel de la región '%0%', ubicación invalida '%1%"
|
||||
"import-signAlreadyAdded": "[red]Omitido cartel en la ubicación '%1%' a la región '%0%', ya que ya ha sido añadida a la región '%2%"
|
||||
"import-moneyBackFailed": "[red]Fallo al analizar el precio de compra '%0%' y venta '%1%' para establecer en porcentaje de dinero devuelto"
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Quieres alquilar la %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Haz click para alquilarla %0%|%"
|
||||
- " hover: %lang:action|Alquilar %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Quieres extender el alquiler de la %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click para extender %0%|%"
|
||||
- " hover: %lang:action|Extender %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Quieres dejar de alquilar la %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click para dejar de alquilar %0%|%"
|
||||
- " hover: %lang:action|Dejar de alquilar %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Quieres comprar la %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click para comprar %0%|%"
|
||||
- " hover: %lang:action|Comprar %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Quieres vender la %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Click to sell %0%|%"
|
||||
- " hover: %lang:action|Sell %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% años"
|
||||
"timeleft-months": "%0% meses"
|
||||
"timeleft-days": "%0% días"
|
||||
"timeleft-hours": "%0% horas"
|
||||
"timeleft-minutes": "%0% minutos"
|
||||
"timeleft-second": "%0% segundo"
|
||||
"timeleft-seconds": "%0% segundos"
|
||||
"timeleft-ended": "Expirado"
|
||||
"greeting-forrent": "%region% puede ser alquilada por %price% cada %duration%."
|
||||
"greeting-rented": "%region% está alquilada por %player% hasta %until%."
|
||||
"greeting-forsale": "%region% puede ser comprada por %price%."
|
||||
"greeting-bought": "%region% está comprada por %player%."
|
||||
"greeting-resale": "%region% puede ser comprada por %resaleprice% al jugador %player%."
|
||||
"update-playerNotify": "[darkgreen]Hay una actualización disponible para AreaShop (V%0% - %1%). Consigue la más reciente en https://github.com/NLthijs48/AreaShop/releases."
|
||||
@@ -0,0 +1,532 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ French language file, plugin version 2.5.0, 399/428 messages are translated (93%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Utilisez %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Utilisez %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Région %0%"
|
||||
- " hover: %lang:action|Information sur la région|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Joueur %0%"
|
||||
- " hover: %lang:action|Régions de %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Bailleur %landlord%"
|
||||
- " hover: %lang:action|Région de %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Vous ne pouvez pas louer ou acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
|
||||
"confirm-yes": " [gray]Clique ici %lang:command|Confirm%0% |%[gray], ou refait la commande."
|
||||
"general-notReady": "AreaShop n'est pas totalement chargé, merci d'attendre."
|
||||
"general-noWorld": "Vous ne pouvez pas faire ceci, le monde de %lang:region% n'est en ce moment pas disponible (monde '%world%')."
|
||||
"general-noRegion": "Vous ne pouvez pas faire ceci, la région WorldGuard n'est pour le moment pas disponible (région %lang:region%)."
|
||||
"general-noEconomy": "Il n'y a pas de plugin d'économie sur votre serveur, ou celui-ci n'est pas correctement installé. Merci de prévenir l'administrateur du serveur."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Cette commande est incorrecte, utilisez '/as help' pour plus de détails."
|
||||
"cmd-onlyByPlayer": "Cette commande ne peut être utilisée que par un joueur."
|
||||
"cmd-weOnlyByPlayer": "Utiliser une sélection WorldEdit n'est possible qu'en tant que joueur. Spécifiez le nom de la région en argument supplémentaire."
|
||||
"cmd-noSelection": "Vous n'avez pas de séléction WorldEdit."
|
||||
"cmd-noRegionsFound": "Aucune région enregistrée dans AreaShop n'a été trouvée dans votre séléction."
|
||||
"cmd-noWERegionsFound": "Aucune région WorldEdit croisant votre séléction n'a été trouvée."
|
||||
"cmd-notRegistered": "La région '%0%' n'est pas disponible dans AreaShop."
|
||||
"cmd-noRegion": "'%0%' n'est pas une région WorldGuard valide."
|
||||
"cmd-noRegionsAtLocation": "Aucune région trouvée à votre emplacement, spécifiez la région comme un argument."
|
||||
"cmd-moreRegionsAtLocation": "Plus d'une région ont été trouvées à votre emplacement, spécifiez la région comme un argument."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Déterminer la région automatiquement est possible uniquement pour les joueurs, spécifiez la région comme un argument."
|
||||
"help-header": "Page d'aide, commandes que vous pouvez exécuter."
|
||||
"help-noPermission": "Vous n'avez pas la permission de voir la page d'aide."
|
||||
"help-alias": "Alias des commandes : /areashop, /as"
|
||||
"help-help": "%lang:helpCommand|/as help|% Affiche cette page d'aide."
|
||||
"help-info": "%lang:helpCommand|/as info|% Obtenir les informations sur les régions actuelles."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Louer une région, ou prolonger la location actuelle."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Acheter une région."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Ne plus louer une région."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Vendre une région."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Recharge tous les fichiers et met à jour les régions."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Active/Désactive la restauration et choix du profil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Changer le prix d'une région."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Changer le temps de location d'une région."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Se téléporter à une région vendue/louée."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Définir le point de téléportation d'une région."
|
||||
"help-find": "%lang:helpCommand|/as find|% Trouver une région à vendre/louer vide."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Ajouter une région à un groupe."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Supprimer une région d'un groupe."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Afficher tout les groupes."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Afficher des informations sur un groupe."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Déclenche un événement schématique d'une région."
|
||||
"help-add": "%lang:helpCommand|/as add|% Enregistrer une région à la vente ou à la location."
|
||||
"help-del": "%lang:helpCommand|/as del|% Supprimer une région enregistrée dans AreaShop."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Ajouter un panneau à une région existante."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Supprimer le panneau que vous regardez."
|
||||
"help-me": "%lang:helpCommand|/as me|% Voir les régions que vous possédez (et le temps restant)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Change le propriétaire d'une région ou prolonge le temps de location."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Mettre une région en revente."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Ne plus revendre votre région."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Ajouter un ami à votre région."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Supprimer un ami de votre région."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Utilisez le mode de liaison de panneau."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Créez plusieurs régions et ajoutez les."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Définir le bailleur d'une région"
|
||||
"help-import": "%lang:helpCommand|/as import|% Importe les régions des régions à vendre."
|
||||
"rent-help": "/as rent [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"rent-noPermission": "Vous n'avez pas la permission de louer une région."
|
||||
"rent-maximum": "Vous ne pouvez pas louer plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
|
||||
"rent-maximumExtend": "Vous ne pouvez pas prolonger cette location car vous avez plus de %0% région(s) (Vous avez déjà %1% dans le groupe '%2%')."
|
||||
"rent-payError": "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
|
||||
"rent-rented": "Vous louez %lang:region% jusqu'à %until%, vous pouvez étendre la location en faisant un clic droit sur le panneau ou avec la commande /as rent."
|
||||
"rent-extended": "Vous avez prolongé votre location de %lang:region% jusqu'au %until%."
|
||||
"rent-extendedToMax": "Vous avez allongé votre location de %lang:region% jusqu'au %until% (qui est la durée maximum de location de %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "Vous n'avez pas assez d'argent pour prolonger votre location (Vous avez %0% et vous avez besoin de %price%)."
|
||||
"rent-lowMoneyRent": "Vous n'avez pas assez d'argent pour louer %lang:region% (Vous avez %0% et vous avez besoin de %price%)."
|
||||
"rent-someoneElse": "Quelqu'un d'autre loue déjà %lang:region%."
|
||||
"rent-notRentable": "La région '%0%' n'est pas disponible à la location (région en vente ou non enregistrée) ."
|
||||
"rent-maxExtends": "Vous ne pouvez plus prolonger cette location (le maximum est de %maxextends% fois), mais après que la prochaine location soit terminé, vous pourrez louer %lang:region% à nouveau."
|
||||
"rent-maxRentTime": "Vous ne pouvez pas louer %lang:region% plus longtemps à l'avance, le maximum est de %maxrenttime% et vous avez déjà loué pour %timeleft%."
|
||||
"rent-restrictedToWorld": "Vous devez être dans le monde '%world%' pour louer %lang:region% (vous êtes dans '%0%')."
|
||||
"rent-restrictedToRegion": "Vous devez être à l'intérieur de %lang:region% pour pouvoir la louer."
|
||||
"rent-expireWarning": "Votre région %lang:region% n'a plus que %timeleft% de temps de restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
|
||||
"rent-expiringSoon": "Votre région %lang:tRegion|%0%|% n'a plus que %1% de temps de restant de location, soyez sûr d'allonger ce temps de location si vous voulez la conserver."
|
||||
"rent-alreadyAtFull": "%lang:region% a déjà atteint ou a dépassé le temps maximum de location, vous ne pouvez pas encore l'étendre la location."
|
||||
"buy-help": "/as buy [région], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"buy-noPermission": "Vous n'avez pas la permission d'acheter une région."
|
||||
"buy-noPermissionResell": "Vous n'avez pas la permission d'acheter une région dans le mode revente."
|
||||
"buy-noPermissionNoResell": "Vous n'avez pas la permission d'acheter une région qui n'est pas dans le mode revente."
|
||||
"buy-notBuyable": "La région '%0%' n'est pas disponible à l'achat (région en location ou non enregistrée)."
|
||||
"buy-maximum": "Vous ne pouvez pas acheter plus de %0% région(s) au total (vous possédez déjà %1% dans le groupe '%2%')."
|
||||
"buy-payError": "Une erreur durant le paiement s'est produite. Essayez de nouveau plus tard."
|
||||
"buy-succes": "Vous avez acheté la région %lang:region%."
|
||||
"buy-successResale": "Vous avez racheté la région %lang:region% qui appartenait à %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Votre région %lang:region% a été vendue à %lang:player% pour %0%."
|
||||
"buy-lowMoney": "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et devez payer %price%)."
|
||||
"buy-lowMoneyResell": "Vous n'avez pas assez d'argent pour acheter %lang:region% (vous possédez %0% et vous avez besoin de %resellprice%)."
|
||||
"buy-yours": "Vous avez déjà acheté %lang:region%."
|
||||
"buy-someoneElse": "Quelqu'un a déjà acheté %lang:region%."
|
||||
"buy-restrictedToWorld": "Vous devez être dans le monde '%world%' pour acheter %lang:region% (vous êtes dans '%0%')."
|
||||
"buy-restrictedToRegion": "Vous devez être dans %lang:region% pour pouvoir l'acheter."
|
||||
"unrent-help": "/as unrent [région], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"unrent-noPermission": "Vous n'avez pas la permission de cesser la location d'une région."
|
||||
"unrent-noPermissionOther": "Vous n'avez pas la permission de cesser la location d'une autre région."
|
||||
"unrent-notRegistered": "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas enregistrer comme location."
|
||||
"unrent-notRented": "Vous ne pouvez pas cesser la location sur cette région car elle n'est pas louée."
|
||||
"unrent-unrented": "Vous avez rompu la location de %lang:region% de %lang:player%."
|
||||
"unrent-expired": "Votre location de %lang:region% a expirée."
|
||||
"sell-help": "/as sell [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"sell-notRegistered": "La région ne peut pas être vendue car elle n'est pas enregistrée comme à vendre."
|
||||
"sell-notBought": "La région ne peut pas être vendue car elle n'est la propriété de personne."
|
||||
"sell-sold": " %lang:player% a vendu la région %lang:region%"
|
||||
"sell-noPermission": "Vous n'avez pas la permission de vendre une région."
|
||||
"sell-noPermissionOther": "Vous n'avez pas la permission de vendre une autre région."
|
||||
"sell-disabled": "La vente a été désactivé dans cette région."
|
||||
"reload-reloading": "Fichiers de configurations et des régions rechargés."
|
||||
"reload-noPermission": "Vous n'avez pas la permission de recharger les fichiers."
|
||||
"reload-updateCommandChanged": "'/as updaterents' et '/as updatebuys' ont été supprimées, '/as reload' est la commande à utiliser pour mettre à jour les régions."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
"info-noPermission": "Vous n'avez pas la permission d'avoir des informations à propos des régions."
|
||||
"info-allHeader": "Toutes les régions%0%:"
|
||||
"info-rentedHeader": "Les régions louées%0%:"
|
||||
"info-forrentHeader": "Les régions à louer%0%:"
|
||||
"info-forsaleHeader": "Les régions à vendre%0%:"
|
||||
"info-soldHeader": "Les régions vendues%0%:"
|
||||
"info-resellingHeader": "Les régions en revente%0%:"
|
||||
"info-nogroupHeader": "Les régions sans groupe%0%:"
|
||||
"info-limitedToGroup": " (limité au groupe %0%)"
|
||||
"info-nogroupNone": "Il n'y a pas de région sans groupe."
|
||||
"info-noFiltergroup": "Le groupe '%0%' n'existe pas ou ne peut donc pas être utilisé pour limiter les résultats."
|
||||
"info-noRegions": "Aucune région trouvée."
|
||||
"info-wrongPage": "%0% n'est pas un numéro de page correct."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]A louer pour %price% par %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Loué à %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]A vendre pour %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Vendu à %lang:player% (revente)."
|
||||
"info-pageStatus": "[gold]Page %0%/%1%"
|
||||
"info-pagePrevious":
|
||||
- "[gold][bold]◄Précédent[/bold] "
|
||||
- "hover: %lang:action|Montrer la page précédente |%"
|
||||
- "command: /areashop %0%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Précédent[/bold] "
|
||||
- " hover: C'est déjà la premier page"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Suivaznt►[/bold]"
|
||||
- " hover: C'est déjà la dernière page"
|
||||
"info-playerHelp": "/as info player <name>"
|
||||
"info-playerRents": "Régions louée par %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% n'a de régions louées."
|
||||
"info-playerBuys": "Régions achetées par %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% n'a pas acheté de régions."
|
||||
"info-regionHelp": "/as info region [name], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"info-regionHeaderRent": "[darkgreen]Informations à propos de %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Informations à propos de %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Louée par %lang:player% jusqu'à: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Achetée par %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Achetée par %lang:player%, actuellement en revente."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Etendre pour[/bold]"
|
||||
- " hover: Etendre votre location de %region%"
|
||||
- " hover: pour %duration% coutant %price%"
|
||||
- " hover: %lang:action|Etendre votre location de %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% pour %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Louer pour[/bold]"
|
||||
- " hover: Louer %region% pour %price% pour %duration%"
|
||||
- " hover: %lang:action|Rent %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% pour %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Prix d'achat[/bold]"
|
||||
- " hover: Acheter%region% pour %price%"
|
||||
- " hover: %lang:action|Acheter %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Prix de revente : [gray]%resellprice% (vous pouvez l'acheter à %player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Ami(s) ajouté(s) : [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Région %region%"
|
||||
- " hover: %lang:action|retirer %0% comme ami|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Prix de revente : [gray]%moneyback% (%moneybackpercent%% du prix)"
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Retour sur investissement de la vente[/bold]"
|
||||
- " hover: Vendez %region% et recupérer %moneyback% de retour sur investissement"
|
||||
- " hover: %lang:action|Vendre %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% du prix)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Remboursement de location : [gray]%moneyback% (%moneybackpercent%% du temps restant)"
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Prorata du loyer remboursé[/bold]"
|
||||
- " hover: Cesser la location %region% et récupérer %moneyback%"
|
||||
- " hover: %lang:action|Cesser la location%region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% du temps restant)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Nombre maximum de région : [gray]%maxextends% fois."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] La location ne peut être allongée."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Extensions restantes : [gray]%extendsleft% fois sur %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Location à l'avance : [gray]%maxrenttime% au maximum"
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Aller à la région[/bold]"
|
||||
- " hover: %lang:action|Se téleporter à %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]Définir la position de téléportation[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Définir la position de téléportation|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Pancartes connectées: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Assigné aux groupes: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Fin de le location automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Revente automatique après : [gray]%inactivetime% de temps d'inactivité du joueur"
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour la louer."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour louer %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Vous devez être à l'intérieur de %lang:region% pour l'acheter."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Vous devez à l'intérieur du monde '%world%' pour acheter %lang:region%."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro a la fin de la location)%0%"
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] La restauration est activée [gray](la région sera remise à zéro à la vente)%0%"
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Bailleur : [gray]%lang:landlord% (reçoit l'argent)."
|
||||
"info-regionNotExisting": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]"
|
||||
"setrestore-noPermission": "Vous n'avez pas la permission de restaurer les paramètres."
|
||||
"setrestore-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"setrestore-invalidSetting": "'%0%' est invalide. Doit être true, false ou general."
|
||||
"setrestore-success": "Paramètre de restauration défini de %lang:region% à '%0%' avec succès."
|
||||
"setrestore-successProfile": "Paramètre de restauration défini de %lang:region% à %0% et le profil à '%1%' avec succès."
|
||||
"setprice-noPermission": "Vous n'avez pas la permission de changer le prix d'une région."
|
||||
"setprice-help": "/as setprice <price> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"setprice-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"setprice-wrongPrice": "'%0%' n'est pas un prix valide."
|
||||
"setprice-successRent": "Le prix de la région %lang:region% à changé pour %price% par %duration%."
|
||||
"setprice-successBuy": "Le prix de la région %lang:region% a changé pour %price%"
|
||||
"setprice-successRemoved": "Le prix de la %lang:region% a été supprimé, maintenant celle-ci utilisera le prix du group ou du fichier default.yml, nouveau prix: %price%."
|
||||
"setprice-noLandlord": "Vous n'avez pas la permission de changer le prix car vous n'êtes pas le bailleur de la région %lang:region%."
|
||||
"setduration-noPermission": "Vous n'avez pas la permission de changer le temps d'une location."
|
||||
"setduration-help": "/as setduration <amount> <identifier> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne précisez pas quelle région doit être utilisée."
|
||||
"setduration-notRegistered": "%0% n'est pas enregistrée dans les régions à louer."
|
||||
"setduration-wrongAmount": "'%0%' n'est pas un montant valide, utilisez un nombre entier."
|
||||
"setduration-wrongFormat": "'%0%' n'est pas un format de temps valide, regardez la documentation de Bukkit."
|
||||
"setduration-success": "Durée de location de la région %lang:region% changé à %duration%."
|
||||
"setduration-noLandlord": "Vous n'avez pas la permission de changer la durée car vous n'êtes pas le bailleur de la région %lang:region%."
|
||||
"setduration-successRemoved": "La durée de location de %lang:region% a été supprimé, maintenant celle-ci utilisera le durée de location du group ou du fichier default.yml, nouvelle durée de location : %duration%."
|
||||
"setup-noRegion": "Vous n'avez pas spécifié de région à la seconde ligne."
|
||||
"setup-alreadyRentSign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région louable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
|
||||
"setup-alreadyBuySign": "La région que vous avez spécifiée a déjà été ajoutée à AreaShop en tant qu'une région achetable, ajoutez un panneau avec [as] sur le première ligne ou tapez '/as addsign'."
|
||||
"setup-noDuration": "A la troisième ligne, vous n'avez pas spécifié la durée de location de la région."
|
||||
"setup-wrongDuration": "Le temps spécifié n'est pas au bon format. Exemple : 1 day."
|
||||
"setup-noPrice": "A la quatrième ligne, vous n'avez pas spécifié le prix."
|
||||
"setup-wrongPrice": "Le prix spécifié n'est pas correct, n'utilisez que des chiffres s'il vous plaît."
|
||||
"setup-rentSuccess": "La location de la région %lang:region% est correctement configurée."
|
||||
"setup-buySuccess": "La vente de la région %lang:region% est correctement configurée."
|
||||
"setup-noPermissionRent": "Vous n'avez pas la permission de définir des région louables."
|
||||
"setup-noPermissionBuy": "Vous n'avez pas la permission de définir des régions achetables."
|
||||
"setup-couldNotDetect": "Multiples régions trouvées avec la même priorité et/ou étant de même nature : parent ou enfant. Spécifiez-en une sur la deuxième ligne. (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% est sur la blacklist et ne peut pas être ajouté à AreaShop."
|
||||
"setup-noPermission": "Vous ne pouvez pas ajouter la région '%0%', vous n'êtes pas un propriétaire / membre ou n'avez pas permission pour celle-ci."
|
||||
"destroy-noPermissionRent": "Vous n'avez pas la permission de dés-enregistrer des régions louables. "
|
||||
"destroy-noPermissionBuy": "Vous n'avez pas la permission de dés-enregistrer des régions achetables."
|
||||
"destroy-successRent": "%lang:region% a bien été dés-enregistrée des régions louables."
|
||||
"destroy-successBuy": "%lang:region% a bien été dés-enregistrée des régions achetables."
|
||||
"teleport-help": "/as tp <region> [sign]"
|
||||
"teleport-noRentOrBuy": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"teleport-noPermission": "Vous n'avez pas la permission de vous téléporter à votre région."
|
||||
"teleport-noPermissionOther": "Vous n'avez pas la permission de vous téléporter à une région qui ne vous appartient pas."
|
||||
"teleport-noPermissionSign": "Vous n'avez pas la permission de vous téléporter à la pancarte de votre région."
|
||||
"teleport-noPermissionOtherSign": "Vous n'avez pas la permission de vous téléporter aux pancartes des régions que vous ne possédez pas."
|
||||
"teleport-noPermissionFriend": "Vous n'avez pas la permission de vous téléporter vers les régions sur lesquelles vous êtes ajoutés en tant qu'ami."
|
||||
"teleport-noPermissionFriendSign": "Vous n'avez pas la permission de vous téléporter vers le panneau des régions sur lesquelles vous êtes ajoutés en tant qu'ami."
|
||||
"teleport-noPermissionAvailable": "Vous n'avez pas la permission de vous téléporter vers les régions disponibles."
|
||||
"teleport-noPermissionAvailableSign": "Vous n'avez pas la permission de vous téléporter vers les panneaux des régions disponibles."
|
||||
"teleport-success": "Vous avez été téléporté vers %lang:region%"
|
||||
"teleport-successSign": "Vous avez été téléporté vers le panneau de %lang:region%"
|
||||
"teleport-noSafe": "Aucune position sécurisée trouvée dans la région '%lang:region%'. Pas de point restant, ou tentatives maximales dépassées (%0%/%1%)."
|
||||
"teleport-blocked": "Vous ne pouvez pas vous téléporter car la position est en dehors de la région, et vous êtes obligés de vous téléporter à l'intérieur."
|
||||
"teleport-changedToSign": "Vous n'avez seulement la permission de vous téléporter à la pancarte et non dans la région, téléportation vers la pancarte."
|
||||
"teleport-changedToNoSign": "Aucune pancarte disponible pour être téléporter. Essayer de vous téléporter dans la région."
|
||||
"teleport-wrongWorld": "Vous avez besoin d'être dans le monde '%world%' pour vous téléporter à la région %lang:region%. Vous êtes dans le monde '%0%'."
|
||||
"setteleport-help": "/as settp [region] [reset], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"setteleport-noPermission": "Vous n'avez pas la permission de définir un point de téléportation."
|
||||
"setteleport-noPermissionOther": "Vous n'avez pas la permission de définir l'emplacement de téléportation d'une région que vous ne possédez pas."
|
||||
"setteleport-noRentOrBuy": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"setteleport-success": "Le point de téléportation de %lang:region% a été défini."
|
||||
"setteleport-notInside": "Le lieu doit se trouver dans votre région."
|
||||
"setteleport-reset": "Le point de téléportation de %lang:region% a été réinitialisé."
|
||||
"find-help": "/as find <buy|rent> [prix maximum] [group]"
|
||||
"find-noPermission": "Vous n'avez pas la permission de rechercher des régions et de vous y téléporter."
|
||||
"find-success": "Une région %0% trouvée : %lang:region%, en recherchant avec un prix maximum de: %1%%2%."
|
||||
"find-successMax": "%0% region trouvé : %lang:region%, tout en recherchant avec un prix maximum de %1%%2%."
|
||||
"find-wrongMaxPrice": "Le prix maximum n'est pas un nombre valide : %0%."
|
||||
"find-wrongGroup": "Le groupe spécifié n'existe pas : %0%."
|
||||
"find-noneFound": "Aucune région %0% trouvée ayant pour un prix maximum : %1%%2%."
|
||||
"find-noneFoundMax": "Aucune région %0% trouvée en cherchant à un prix maximum de %1%%2%."
|
||||
"find-onlyInGroup": ", recherche de régions uniquement dans le groupe: %0%."
|
||||
"groupadd-help": "/as groupadd <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"groupadd-noPermission": "Vous n'avez pas la permission d'ajouter des régions aux groupes."
|
||||
"groupadd-success": "La région %lang:region% a été ajoutée au groupe '%0%'. Ce groupe a maintenant %1% membre(s)."
|
||||
"groupadd-failed": "La région %lang:region% est déjà membre du groupe '%0%'."
|
||||
"groupadd-weSuccess": "Ajouté au groupe %0% : [gray]%1%."
|
||||
"groupadd-weFailed": "Nous étions déjà dans le groupe %0% : [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <group> [region], Si non spécifiée, cible la région dans laquelle vous vous trouvez."
|
||||
"groupdel-noPermission": "Vous n'avez pas la permission de supprimer des régions depuis les groupes."
|
||||
"groupdel-wrongGroup": "Le groupe %0% n’existe pas, faire '/as grouplist' pour afficher les groupes enregistrés."
|
||||
"groupdel-success": "La région %lang:region% a été supprimée du groupe '%0%', ce groupe a maintenant %1% membre(s)."
|
||||
"groupdel-failed": "La région %lang:region% n'est pas membre du groupe '%0%'."
|
||||
"groupdel-weSuccess": "Supprimée du groupe %0% : [gray]%1%."
|
||||
"groupdel-weFailed": "Nous ne sommes de toute façon pas dans le groupe %0% : [gray]%1%."
|
||||
"grouplist-noPermission": "Vous n'avez pas l'autorisation d'afficher les groupes enregistrés."
|
||||
"grouplist-noGroups": "Il n'y a actuellement aucun groupe enregistré."
|
||||
"grouplist-success": "Les groupes suivants sont enregistrés: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <group>"
|
||||
"groupinfo-noPermission": "Vous n'avez pas la permission d'afficher des informations sur un groupe."
|
||||
"groupinfo-noGroup": "Il n'y a pas de groupe enregistré sous le nom '%0%', utilisez /as grouplist pour vérifier les groupes."
|
||||
"groupinfo-members": "Les régions suivantes sont membres du groupe %0% : [gray]%1%."
|
||||
"groupinfo-noMembers": "Le groupe %0% ne possède aucun membre."
|
||||
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>"
|
||||
"schemevent-wrongEvent": "L'évent spécifié '%0%' n'existe pas, utilisez un des suivants: [gray]%1%."
|
||||
"schemevent-success": "L’événement '%0%' a été activé dans la région %lang:region%."
|
||||
"schemevent-noPermission": "Vous n'avez pas la permission de déclencher des événements schématiques."
|
||||
"add-help": "/as add <rent|buy> [region] [world]"
|
||||
"add-noPermission": "Vous n'avez pas la permission d'ajouter une région à AreaShop."
|
||||
"add-success": "Ajoutée comme %0% : [gray]%1%."
|
||||
"add-failed": "Déjà enregistré: [gray]%0%."
|
||||
"add-blacklisted": "Dans la liste noir: [gray]%0%."
|
||||
"add-specifyWorld": "Spécifiez le monde de la région lors de l'utilisation de la console."
|
||||
"add-incorrectWorld": "Le monde '%0%' est introuvable, essayez de nouveau (attention à la casse)."
|
||||
"add-noPermissionRegions": "Pas de permission à ajouter: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Soit vous n'êtes pas membre / propriétaire de cette région ou n'avez pas la permission d'ajouter vos régions."
|
||||
"del-noPermission": "Vous n'avez pas la permission de supprimer des régions."
|
||||
"del-success": "Régions supprimées: [gray]%0%."
|
||||
"del-failed": "Vous n'avez pas la permission, ou vous n’être pas enregistré: [gray]%0%."
|
||||
"addsign-help": "/as addsign [region] [profile]"
|
||||
"addsign-noSign": "Vous ne regardez pas de panneau."
|
||||
"addsign-noRegions": "Aucune région trouvée autour du panneau."
|
||||
"addsign-couldNotDetect": "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région en argument supplémentaire (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Plusieurs régions ont été trouvées à proximité du panneau. Spécifiez la région à la deuxième ligne (2 des régions trouvées: %lang:tRegion|%0%|% et %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Le profil spécifié n'existe pas, utilisez l'un de la liste suivante (Vérifiez la config): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Connexion profil %0%"
|
||||
- " hover: %lang:action|Utiliser ce profil|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "Le panneau a été ajouté à %lang:region%."
|
||||
"addsign-successProfile": "Le panneau a été ajouté à %lang:region%. avec le profile %0%."
|
||||
"addsign-alreadyRegistered": "Ce panneau est déjà enregistré pour la région %lang:region%."
|
||||
"addsign-noPermission": "Vous n'avez pas la permission d'ajouter un panneau."
|
||||
"delsign-noSign": "Vous ne regardez pas un panneau."
|
||||
"delsign-noPermission": "Vous n'avez pas la permission de supprimer un panneau."
|
||||
"delsign-noRegion": "Ce signe n'appartient pas à une région AreaShop."
|
||||
"delsign-success": "Le panneau à été retiré de la région %lang:region%."
|
||||
"me-noPermission": "Vous n'avez pas la permission de voir quelle(s) région(s) vous possédez."
|
||||
"me-header": "Régions de %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Vous n'êtes pas un joueur. Vous ne pouvez donc pas avoir de régions."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% restant"
|
||||
- "⇥hover: depuis %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "propriétaire: %lang:player%"
|
||||
- "⇥hover: Vous avez ajouté comme ami"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% n'a pas loué ou acheté de régions et n'a pas été ajouté comme ami dans l'un entre eux."
|
||||
"me-noPlayer": "%0% n'a pas été trouvé, il ne s'est peut être jamais connecté sur le serveur."
|
||||
"me-clickHint": "[gray][italic]Cliquez sur le nom d'une région pour voir les détails."
|
||||
"setowner-help": "/as setowner <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
|
||||
"setowner-noPermission": "Vous n'avez pas la permission de définir le propriétaire d'une région."
|
||||
"setowner-noPermissionRent": "Vous n'avez pas la permission de définir le propriétaire de régions à louer."
|
||||
"setowner-noPermissionBuy": "Vous n'avez pas la permission de définir le propriétaire de régions à acheter."
|
||||
"setowner-notRegistered": "La région n'est pas enregistrée, le propriétaire ne peut être défini."
|
||||
"setowner-noPlayer": "UUID du joueur introuvable : %0%."
|
||||
"setowner-succesRent": "Propriétaire de la région %lang:region% modifié avec succès. Elle appartient maintenant à %lang:player% et est louée jusqu'au %until% (%timeleft% restant)."
|
||||
"setowner-succesRentExtend": "Le propriétaire était déjà %lang:player%, location prolongée de '%duration%', maintenant louée jusqu'au %until% (%timeleft% restant%)."
|
||||
"setowner-succesBuy": "Propriétaire de la région %lang:region% changé avec succès. Elle appartient maintenant à %lang:player%."
|
||||
"resell-help": "/as resell <prix> <région>, la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
|
||||
"resell-wrongPrice": "'%0%' n'est pas un prix valide."
|
||||
"resell-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"resell-notBought": "Vous ne pouvez pas revendre %lang:region% car elle n'est pas achetée pour le moment."
|
||||
"resell-success": "%lang:region% a été mise en revente avec succès pour un prix de %resellprice%."
|
||||
"resell-noPermission": "Vous n'avez pas la permission de mettre votre région en revente."
|
||||
"resell-noPermissionOther": "Vous n'avez pas la permission de mettre des régions en revente."
|
||||
"stopresell-help": "/as stropresell [région], la région où vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
|
||||
"stopresell-notRegistered": "La région spécifiée n'est pas enregistrée : %0%."
|
||||
"stopresell-notResell": "Vous ne pouvez pas stopper la revente %lang:region% car elle n'est pas en mode revente."
|
||||
"stopresell-success": "%lang:region% n'est plus en revente."
|
||||
"stopresell-noPermission": "Vous n'avez pas la permission de retirer votre région de la vente."
|
||||
"stopresell-noPermissionOther": "Vous n'avez pas la permission de retirer les régions de la vente."
|
||||
"addfriend-help": "/as addfriend <joueur> [region], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
|
||||
"addfriend-noPermissionOther": "Vous n'avez pas la permission d'ajouter des gens en amis dans une région qui n'est pas la vôtre."
|
||||
"addfriend-noPermission": "Vous n'avez pas la permission d'ajouter en amis des gens à votre région."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% a été ajouté comme ami sur la région %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% a été ajouté comme ami sur votre région %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% est déjà ajouté comme ami avec %lang:region%."
|
||||
"addfriend-self": "Ajouter le propriétaire de la région en ami n'aurait aucune utilité."
|
||||
"addfriend-noOwner": "Vous ne pouvez pas ajouter d'amis à une région sans propriétaire."
|
||||
"addfriend-notVisited": "Vous ne pouvez pas ajouter %0% car il n'est jamais venu sur le serveur."
|
||||
"delfriend-help": "/as delfriend <joueur> [région], la région dans laquelle vous vous trouvez sera utilisée si vous ne spécifiez pas de région."
|
||||
"delfriend-noPermissionOther": "Vous n'avez pas la permission de supprimer des amis à une région n'étant pas la vôtre."
|
||||
"delfriend-noPermission": "Vous n'avez pas la permission de supprimer des amis de votre région."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% a été supprimé comme ami de la région %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% a été supprimé comme ami de votre région %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% n'est pas dans les amis de %lang:region%."
|
||||
"delfriend-noOwner": "Vous ne pouvez pas supprimer les amis d'une région sans propriétaire."
|
||||
"linksigns-multipleRegions": "Plusieurs régions trouvées : [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Cliquez plus tard pour réessayer ou utilisez '/as linksigns' pour arrêter."
|
||||
"linksigns-noRegions": "Aucune région AreaShop trouvée dans la direction de votre curseur, soyez sûr que la région est bien ajoutée à AreaShop [gray](portée maximale de 100 blocs)."
|
||||
"linksigns-regionFound": "La région %lang:region% a été trouvée, maintenant montrer un panneau et faites un clic gauche sur celui-ci."
|
||||
"linksigns-signFound": "Un panneau a été trouvé à (%0%, %1%, %2%), maintenant montrez une région et faites un clic droit pour la lier."
|
||||
"linksigns-noSign": "Aucune panneau trouvé dans la direction de votre curseur, soyez sûr que vous regardez directement la panneau et re-cliquez[gray](portée maximale de 100 blocs)."
|
||||
"linksigns-alreadyRegistered": "Ce panneau est déjà enregistré avec la région %lang:region%, cliquez encore pour sélectionner un autre panneau."
|
||||
"linksigns-first": "Vous êtes entré dans le mode de liaison d'un panneau."
|
||||
"linksigns-next": "[gray]Faites un clic gauche pour sélectionner un panneau, un clic droit pour sélectionner une région et utilisez /as linksigns pour arrêter le mode."
|
||||
"linksigns-noPermission": "Vous n'avez pas la permission de rentrer dans le mode de liaison d'un panneau."
|
||||
"linksigns-stopped": "Vous êtes sorti du mode de liaison d'un panneau."
|
||||
"stack-help":
|
||||
- "/as stack <montant> <écart> <nom> <rent|buy> [groupe].[break]"
|
||||
- "⇥[gray<montant> Nombre de régions qui sera créé.[break]"
|
||||
- "⇥[gray]<écart> Distance en blocs entre les régions.[break]"
|
||||
- "⇥[gray]<nom> Nom des régions (un nombre sera ajouté à la fin[break]"
|
||||
- "⇥[gray]<rent|buy> Définir comme location (rent) ou achat (but).[break]"
|
||||
- "⇥[gray][groupe] Un groupe pour ajouter les régions créées..[break]"
|
||||
- "⇥[gray]Les régions seront créés dans la direction que vous faites face."
|
||||
"stack-accepted": "Commence à créer %0% %1% régions avec %2% blocs entre chacune, dont les noms commencent avec %3% et ont un chiffre derrière. %4%"
|
||||
"stack-addToGroup": "Les régions créées ont été ajoutées au groupe '%0%'."
|
||||
"stack-noPermission": "Vous n'avez pas la permission de créer et d'ajouter des régions à AreaShop en vrac."
|
||||
"stack-wrongAmount": "'%0%' n'est pas une quantité correcte de régions."
|
||||
"stack-wrongGap": "'%0%' n'est pas un nombre correct pour le nombre de blocs séparant deux régions."
|
||||
"stack-noSelection": "Vous n'avez pas de sélection qui indique où doit se trouver la première région créée."
|
||||
"stack-addStart": "[gray]Ajout de %0% régions, %1% par seconde."
|
||||
"stack-addComplete": "[gray]Ajout de la région %0% %1%."
|
||||
"stack-tooHigh": ", %0% regions annulées car ils sont au dessus de Y=256"
|
||||
"stack-tooLow": ", %0% regions annulées car ils sont au dessous de Y=0"
|
||||
"stack-unclearDirection": "Merci de regarder clairement le Nord, l'Est, le Sud, l'Ouest, le haut ou le bas, actuellement détectée %0%."
|
||||
"setlandlord-help": "/as setlandlord <joueur> [région], la région où vous êtes sera utilisé si non spécifié."
|
||||
"setlandlord-noPermission": "Vous n'avez pas la permission de définir le bailleur d'une région."
|
||||
"setlandlord-success": "%lang:landlord% a bien été défini comme bailleur de %lang:region%.."
|
||||
"message-help": "/as message <joueur> <message...>"
|
||||
"message-noPermission": "Vous n'avez pas la permission d'envoyer des messages AreaShop."
|
||||
"message-notOnline": "%0% n'est pas connecté."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Êtes-vous sur de vouloir louer %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour louer %0%|%"
|
||||
- " hover: %lang:action|Louer%0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Êtes-vous sur de vouloir prolonger la location %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour prolonger la location%0%|%"
|
||||
- " hover: %lang:action|Prolonger la location%0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Êtes-vous sur de vouloir arrêter la location %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour arrêter la location%0%|%"
|
||||
- " hover: %lang:action|Arrêter la location%0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Êtes-vous sur de vouloir acheter %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour acheter %0%|%"
|
||||
- " hover: %lang:action|Acheter%0%|%"
|
||||
- " command: /areashop buy%0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Êtes-vous sur de vouloir vendre %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Cliquez ici pour vendre %0%|%"
|
||||
- " hover: %lang:action|Vendre%0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% années"
|
||||
"timeleft-months": "%0% mois"
|
||||
"timeleft-days": "%0% jours"
|
||||
"timeleft-hours": "%0% heures"
|
||||
"timeleft-minutes": "%0% minutes"
|
||||
"timeleft-second": "%0% seconde"
|
||||
"timeleft-seconds": "%0% secondes"
|
||||
"timeleft-ended": "Expirée"
|
||||
"greeting-forrent": "%region% peut être louée pour %price% pour une durée de %duration%."
|
||||
"greeting-rented": "%region% est louée par %player% jusqu'au %until%."
|
||||
"greeting-forsale": "%region% peut être achetée pour %price%."
|
||||
"greeting-bought": "%region% est la propriété de %player%."
|
||||
"greeting-resale": "%region% peut être acheté pour %resellprice%. Offre par %player%."
|
||||
"update-playerNotify":
|
||||
- "[darkgreen]Mise à jours de AreaShop V%0% à AreaShop V%1% disponible, récupérez la nouvelle version sur "
|
||||
- "[bold]Spigot[/bold]"
|
||||
- " hover: %lang:action|Aller à la page Spigot de AreaShop|%"
|
||||
- " link: https://www.spigotmc.org/resources/areashop.2991/"
|
||||
- "(et laissez un avis)."
|
||||
@@ -0,0 +1,564 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Dutch language file, plugin version 2.5.0, 428/428 messages are translated (100%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Gebruik %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Gebruik %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Gebied %0%"
|
||||
- " hover: %lang:action|Gebied informatie|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Speler %0%"
|
||||
- " hover: %lang:action|Gebieden van %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Landeigenaar %landlord%"
|
||||
- " hover: %lang:action|Gebieden van %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Je kunt niet meer dan %0% gebied(en) kopen en huren in totaal (je hebt er al %1% in groep '%2%')."
|
||||
"confirm-yes": " [gray]Klik om te %lang:command|bevestigen|%0%|%[gray], of herhaal het commando."
|
||||
"general-notReady": "AreaShop is nog niet volledig geladen, even geduld."
|
||||
"general-noWorld": "Je kunt deze actie niet uitvoeren, de wereld van %lang:region% is niet beschikbaar (wereld '%0%')."
|
||||
"general-noRegion": "Je kunt deze actie niet uitvoeren, het WorldGuard gebied is niet beschikbaar (gebied %lang:region%)."
|
||||
"general-noEconomy": "Er is geen Economy plugin geïnstalleerd of deze is incorrect opgezet, stel de server eigenaar hiervan op de hoogte."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Dat commando is niet geldig , gebruik '/as help' voor informatie."
|
||||
"cmd-onlyByPlayer": "Dit commando kan alleen door een speler uitgevoert worden."
|
||||
"cmd-weOnlyByPlayer": "Gebruikmaken van een WorldEdit selectie is alleen mogelijk als speler, geef de naam van het gebied mee als extra argument."
|
||||
"cmd-noSelection": "Je hebt geen WorldEdit selectie."
|
||||
"cmd-noRegionsFound": "Er zijn geen gebieden in je selectie gevonden die geregistreerd staan in AreaShop."
|
||||
"cmd-noWERegionsFound": "Er zijn geen WorldEdit gebieden gevonden die zich in je selectie bevinden."
|
||||
"cmd-notRegistered": "Gebied '%0%' is niet beschikbaar in AreaShop."
|
||||
"cmd-noRegion": "'%0%' is geen geldig WorldGuard gebied."
|
||||
"cmd-noRegionsAtLocation": "Geen gebieden gevonden op je lokatie, geef het gebied mee als argument."
|
||||
"cmd-moreRegionsAtLocation": "Meerdere gebieden gevonden op je lokatie, geef het gebied mee als argument."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Automatisch bepalen van het gebied is alleen mogelijk voor spelers, geef het gebied mee als argument."
|
||||
"help-header": "Help pagina, commando's die jij kunt uitvoeren."
|
||||
"help-noPermission": "Je hebt geen toestemming om de help pagina te bekijken."
|
||||
"help-alias": "Commando aliassen: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Laat deze help pagina zien."
|
||||
"help-info": "%lang:helpCommand|/as info|% Vraag informatie over gebieden op."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Huur een gebied of verleng de huur."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Koop een gebied."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Stop de huur van een gebied."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Verkoop een gebied."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Herlaad bestanden en update gebieden."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Schakel herstellen in/uit en kies het profiel."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Verander de prijs van een gebied."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Verander de huurtijd van een region."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teleporteer naar koop/huur gebieden."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Stel een teleporteer plek in."
|
||||
"help-find": "%lang:helpCommand|/as find|% Zoek een leeg huur of koop gebied."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Voeg een gebied toe aan een groep."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Verwijder een gebied uit een groep."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Laat een lijst met groepen zien."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Laat informatie over een groep zien."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Voer een schematic gebeurtenis uit."
|
||||
"help-add": "%lang:helpCommand|/as add|% Registreer een huur of koop gebied."
|
||||
"help-del": "%lang:helpCommand|/as del|% Verwijder een geregistreerd gebied."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Voeg een bordje toe aan een bestaand gebied."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Verwijder het bord waar je naar kijkt."
|
||||
"help-me": "%lang:helpCommand|/as me|% Bekijk welke gebieden je hebt (+aflooptijd)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Stel gebied eigenaar in of verleng de huur."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Zet een gebied in doorverkoop modus."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Stop het herverkopen van een gebied."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Voeg een vriend toe aan een gebied."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Verwijder een vriend van een gebied."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Gebruik massa bord koppelen mode."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Creer meerdere gebieden en voeg ze toe."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Creer meerdere gebieden en voeg ze toe."
|
||||
"help-import": "%lang:helpCommand|/as import|% Importeer gebieden van RegionForSale."
|
||||
"rent-help": "/as rent [region], het gebied waarin je staat zal worden gebruikt als je het niet aangeeft."
|
||||
"rent-noPermission": "Je hebt geen toestemming om een gebied te huren."
|
||||
"rent-maximum": "Je kunt niet meer dan %0% gebied(en) huren (je hebt er al %1% in groep '%2%')."
|
||||
"rent-maximumExtend": "Je kunt dit gebied niet meer verlengen omdat je meer dan %0% gebied(en) bezit (je hebt er al %1% in groep '%2%')."
|
||||
"rent-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
|
||||
"rent-rented": "Je hebt %lang:region% gehuurd tot %until%, je kunt de huur verlengen door het rechtsklikken van het bord of /as rent."
|
||||
"rent-extended": "Je hebt de huur van %lang:region% verlengt tot %until%."
|
||||
"rent-extendedToMax": "Je hebt de huur van %lang:region% verlengt tot %until% (dit is de maximale huurtijd van %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "Je hebt niet genoeg geld om het gebied te huren (je hebt %0% van de %price%)."
|
||||
"rent-lowMoneyRent": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
|
||||
"rent-someoneElse": "Iemand anders heeft %lang:region% al gehuurd."
|
||||
"rent-notRentable": "Gebied '%0%' is niet beschikbaar om te huren (niet geregistreerd in AreaShop of een koop gebied)."
|
||||
"rent-maxExtends": "Je kunt de huur niet meer verlengen (het maximum is %maxextends% keer), je kunt echter wel %lang:region% opnieuw huren als het afgelopen is."
|
||||
"rent-maxRentTime": "Je kunt %lang:region% niet meer tijd van tevoren huren, de maximum tijd is %maxrenttime% en je hebt het al voor %timeleft% gehuurt."
|
||||
"rent-restrictedToWorld": "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
|
||||
"rent-restrictedToRegion": "Je moet in %lang:region% staan om hem te huren."
|
||||
"rent-expireWarning": "Je gebied %lang:region% heeft nog %timeleft% over, verleng het als je het wilt houden.."
|
||||
"rent-expiringSoon": "Je gebied %lang:tRegion|%0%|% heeft nog %1% over, verleng het als je het wilt houden."
|
||||
"rent-alreadyAtFull": "%lang:region% is al verhuurd voor de maximale tijd, je kunt hem niet verlengen."
|
||||
"buy-help": "/as buy [region], het gebied waarin je staat word gebruikt als je het niet aangeeft."
|
||||
"buy-noPermission": "Je hebt geen toestemming om een gebied te kopen."
|
||||
"buy-noPermissionResell": "Je hebt geen toestemming om een koop gebied in doorverkoop mode te kopen."
|
||||
"buy-noPermissionNoResell": "Je hebt geen toestemming om een koop gebied die niet in doorverkoop mode staat te kopen."
|
||||
"buy-notBuyable": "Gebied '%0%' is niet beschikbaar om te kopen (niet geregistreerd in AreaShop of een koop gebied)."
|
||||
"buy-maximum": "Je kunt niet meer dan %0% gebied(en) kopen (je hebt er al %1% in de groep '%2%')."
|
||||
"buy-payError": "Er is iets mis gegaan met betalen, probeer het later opnieuw."
|
||||
"buy-succes": "Je hebt %lang:region% succesvol gekocht."
|
||||
"buy-successResale": "Je hebt %lang:region% succesvol gekocht van %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Je gebied %lang:region% is verkocht aan %lang:player% voor %0%."
|
||||
"buy-lowMoney": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %price%)."
|
||||
"buy-lowMoneyResell": "Je hebt niet genoeg geld om %lang:region% te kopen (je hebt %0% van de %resellprice%)."
|
||||
"buy-yours": "Je bent al in bezit van %lang:region%."
|
||||
"buy-someoneElse": "Iemand anders is al in bezit van %lang:region%."
|
||||
"buy-restrictedToWorld": "Je moet in de wereld '%world%' zijn om %lang:region% te kopen (je ben in '%0%')."
|
||||
"buy-restrictedToRegion": "Je moet in %lang:region% staan om hem te kopen."
|
||||
"unrent-help": "/as unrent [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"unrent-noPermission": "Je hebt geen toestemming om te stoppen met huren."
|
||||
"unrent-noPermissionOther": "Je hebt geen toestemming om iemand anders huur te stoppen."
|
||||
"unrent-notRegistered": "De huur kan niet gestopt worden want het gebied is niet geregistreerd om te huren."
|
||||
"unrent-notRented": "De huur kan niet gestopt worden want het gebied is niet gehuurd."
|
||||
"unrent-unrented": "De huur van %lang:region% van %lang:player% is gestopt."
|
||||
"unrent-expired": "Je huur van %lang:region% is afgelopen."
|
||||
"sell-help": "/as sell [region], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"sell-notRegistered": "Het gebied kan niet verkocht worden want het staat niet geregistreerd om te kopen."
|
||||
"sell-notBought": "Het gebied kan niet verkocht worden want het is niet gekocht."
|
||||
"sell-sold": "%lang:region% is verkocht voor %lang:player%."
|
||||
"sell-noPermission": "Je hebt geen toestemming om een gebied te verkopen."
|
||||
"sell-noPermissionOther": "Je hebt geen toestemming om een gebied van iemand anders te verkopen."
|
||||
"sell-disabled": "Verkopen is uitgeschakeld voor dit gebied."
|
||||
"reload-reloading": "Alle configuratie en gebied bestanden zijn herladen."
|
||||
"reload-noPermission": "Je hebt geen toestemming om configuratiebestanden te herladen."
|
||||
"reload-updateCommandChanged": "'/as updaterents' en '/as updatebuys' zijn verwijderd, '/as reload' updated nu ook de gebieden, gebruik dus dat commando."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
"info-noPermission": "Je hebt geen toestemming om informatie over gebieden te bekijken."
|
||||
"info-allHeader": "Alle gebieden%0%:"
|
||||
"info-rentedHeader": "Verhuurde gebieden%0%:"
|
||||
"info-forrentHeader": "Gebieden te huur%0%:"
|
||||
"info-forsaleHeader": "Gebieden te koop%0%:"
|
||||
"info-soldHeader": "Verkochte gebieden%0%:"
|
||||
"info-resellingHeader": "Gebieden aan het doorverkopen%0%:"
|
||||
"info-nogroupHeader": "Gebieden zonder groep%0%:"
|
||||
"info-limitedToGroup": "(beperkt tot groep %0%)"
|
||||
"info-nogroupNone": "Er zijn geen gebieden zonder groep."
|
||||
"info-noFiltergroup": "Groep '%0%' bestaat niet en kan daardoor niet gebruikt worden om de resultaten te limiteren."
|
||||
"info-noRegions": "Er zijn geen gebieden gevonden."
|
||||
"info-wrongPage": "%0% is geen correct pagina nummer."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Te huur voor %price% per %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verhuurd aan %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Te koop voor %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Verkocht aan %lang:player% (aan het doorverkopen)."
|
||||
"info-pageStatus": "[gold]Pagina %0%/%1%"
|
||||
"info-pagePrevious":
|
||||
- " [gold][bold]◄Vorige[/bold] "
|
||||
- " hover: %lang:action|Laat de vorige pagina zien|%"
|
||||
- " command: /areashop %0%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Vorige[/bold] "
|
||||
- " hover: Dit is al de eerste pagina"
|
||||
"info-pageNext":
|
||||
- " [gold][bold]Volgende►[/bold]"
|
||||
- " hover: %lang:action|Laat de volgende pagina zien|%"
|
||||
- " command: /areashop %0%"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Volgende►[/bold]"
|
||||
- " hover: Dit is al de laatste pagina"
|
||||
"info-playerHelp": "/as info player <naam>."
|
||||
"info-playerRents": "Gebieden gehuurd door %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% heeft geen gebieden gehuurd."
|
||||
"info-playerBuys": "Gebieden gekocht door %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% heeft geen gebieden gekocht."
|
||||
"info-regionHelp": "/as info region <naam>."
|
||||
"info-regionHeaderRent": "[darkgreen]Informatie over %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Informatie over %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Gehuurd door %lang:player% tot: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Gekocht door %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Gekocht door %lang:player%, aan het doorverkopen."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Verleng voor[/bold]"
|
||||
- " hover: Verleng huur van %region%"
|
||||
- " hover: met %duration% voor %price%"
|
||||
- " hover: %lang:action|Verleng de huur van %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Huur voor[/bold]"
|
||||
- " hover: Huur %region% voor %price% per %duration%"
|
||||
- " hover: %lang:action|Huur %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Koop voor[/bold]"
|
||||
- " hover: Koop %region% voor %price%"
|
||||
- " hover: %lang:action|Koop %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Doorverkoop prijs: [gray]%resellprice% (je kunt het kopen van %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Toegevoegde vrienden: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Gebied %region%"
|
||||
- " hover: %lang:action|Verwijder %0% as friend|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Verkoop terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de prijs)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Verkoop terugbetaling[/bold]"
|
||||
- " hover: Verkoop %region% en krijg %moneyback% terug"
|
||||
- " hover: %lang:action|Verkoop %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% van de prijs)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Stop met huren terugbetaling: [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Stop met huren terugbetaling[/bold]"
|
||||
- " hover: Stop met huren van %region% en krijg %moneyback% terug"
|
||||
- " hover: %lang:action|Stop met huren van %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% van de overgebleven tijd)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximaal keer verlengen: [gray]%maxextends% keer."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Huur kan niet verlengt worden."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Verlengingen over: [gray]%extendsleft% keer van de %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Huurtijd: [gray]maximaal %maxrenttime%."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Ga naar het gebied[/bold]"
|
||||
- " hover: %lang:action|Ga naar %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]stel teleporteer locatie in[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Stel teleporteer locatie in|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Verbonden borden: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Toegewezen groepen: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatische huurstop na: [gray]Inactiviteit van %inactivetime% door de speler."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatische verkoop na: [gray]Inactiviteit van %inactivetime% door de spler."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te huren."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] je moet in de wereld '%world%' zijn om %lang:region% te huren."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Je moet in %lang:region% staan om deze te kopen."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Je moet in de wereld '%world%' staan om %lang:region% te kopen."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij een huurstop)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Herstellen is ingeschakeld [gray](gebied zal resetten bij verkoop)%0%."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Landeigenaar: [gray]%lang:landlord% (krijgt het geld)."
|
||||
"info-regionNotExisting": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"setrestore-help": "/as setrestore <gebied> <true|false|general> [profiel]."
|
||||
"setrestore-noPermission": "Je hebt geen toestemming om de herstel opties te veranderen."
|
||||
"setrestore-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' is geen geldige staat, gebruik true, false of general."
|
||||
"setrestore-success": "Herstel optie van %lang:region% succesvol gezet naar '%0%'."
|
||||
"setrestore-successProfile": "Herstel optie van %lang:region% succesvol gezet naar '%0%' en het profiel naar '%1%'."
|
||||
"setprice-noPermission": "Je hebt geen toestemming om de prijs van een gebied te veranderen."
|
||||
"setprice-help": "/as setprice <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"setprice-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"setprice-wrongPrice": "'%0%' is geen geldige prijs."
|
||||
"setprice-successRent": "Prijs van gebied %lang:region% is veranderd naar %price% per %duration%."
|
||||
"setprice-successBuy": "De prijs van het gebied %lang:region% is veranderd naar %price%."
|
||||
"setprice-successRemoved": "Prijs van %lang:region% is verwijderd, hij zal nu de prijs van de groep of default.yml file gebruiken, nieuwe prijs: %price%."
|
||||
"setprice-noLandlord": "Je hebt geen toestemming om de prijs te veranderen omdat je niet de landeigenaar bent van %lang:region%."
|
||||
"setduration-noPermission": "Je hebt geen toestemming om de duur van het huur gebied aan te passen."
|
||||
"setduration-help": "/as setduration <aantal> <identificator> [gebied], het gebied waarin je staat zal worden gebruikt als je niets aangeeft."
|
||||
"setduration-notRegistered": "%0% is niet geregistreerd voor verhuur."
|
||||
"setduration-wrongAmount": "'%0%' is geen geldig aantal, gebruik een geheel nummer."
|
||||
"setduration-wrongFormat": "'%0%' is geen goed tijdsformaat, bekijk de documentatie op Bukkit."
|
||||
"setduration-success": "Looptijd van gebeid %lang:region% veranderd naar '%duration%'."
|
||||
"setduration-noLandlord": "Je hebt geen toestemming om de tijdsduur te veranderen omdat je niet de landeigenaar bent van %lang:region%."
|
||||
"setduration-successRemoved": "Tijdsduur van %lang:region% is verwijderd, hij zal nu de tijdsduur van een group of default.yml gebruiken, nieuwe tijdsduur: %duration%."
|
||||
"setup-noRegion": "Je hebt geen gebied aangegeven op de tweede regel."
|
||||
"setup-alreadyRentSign": "Het aangegeven gebied is al toegevoegd als huur gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
|
||||
"setup-alreadyOtherWorld": "Het aangegeven gebied is al toegevoegd aan AreaShop in een andere wereld, gebieden in verschillende werelden moeten verschillende namen hebben."
|
||||
"setup-alreadyBuySign": "Het aangegeven gebied is al toegevoegd als koop gebied aan AreaShop, voeg een bord toe met [as] op de eerste regel of met '/as addsign'."
|
||||
"setup-noDuration": "Je hebt geen tijdsduur voor het huren aangegeven, zet dit op de derde regel."
|
||||
"setup-wrongDuration": "De aangegeven tijdsduur is niet in het correcte formaat, voorbeeld: 1 dag."
|
||||
"setup-noPrice": "Je hebt geen prijs aangegeven op de vierde regel."
|
||||
"setup-wrongPrice": "Je hebt de prijs niet goed aangegeven, gebruik alleen nummers."
|
||||
"setup-rentSuccess": "Huren van gebied %lang:region% is goed opgezet."
|
||||
"setup-buySuccess": "Kopen van gebied %lang:region% is goed opgezet."
|
||||
"setup-noPermissionRent": "Je hebt geen toestemming om huur gebieden op te zetten."
|
||||
"setup-noPermissionBuy": "Je hebt geen toestemming om koop gebieden op te zetten."
|
||||
"setup-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% staat op de blacklist en kan niet toegevoegd worden aan AreaShop."
|
||||
"setup-noPermission": "Je kunt de region '%0%' niet toevoegen, je bent geen owner/member of hebt geen toestemming."
|
||||
"destroy-noPermissionRent": "Je hebt geen toestemming om huur gebieden te verwijderen."
|
||||
"destroy-noPermissionBuy": "Je hebt geen toestemming om koop gebieden te verwijderen."
|
||||
"destroy-successRent": "%lang:region% succesvol verwijderd als huur gebied."
|
||||
"destroy-successBuy": "%lang:region% succesvol verwijderd als koop gebied."
|
||||
"teleport-help": "/as tp <gebied> <aantal> <soort>."
|
||||
"teleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"teleport-noPermission": "Je hebt geen toestemming om naar je gebied te teleporteren."
|
||||
"teleport-noPermissionOther": "Je hebt geen toestemming om te teleporteren naar een gebied dat niet van jou is."
|
||||
"teleport-noPermissionSign": "Je hebt geen toestemming om naar het bordje van je gebied te teleporteren."
|
||||
"teleport-noPermissionOtherSign": "Je hebt geen toestemming om naar bordjes te teleporteren van gebieden die niet van jou zijn."
|
||||
"teleport-noPermissionFriend": "Je hebt geen toestemming om te teleporteren naar gebieden waar je als vriend bent toegevoegd."
|
||||
"teleport-noPermissionFriendSign": "Je hebt geen toestemming om te teleporteren naar het bord van gebieden waar je als vriend bent toegevoegd."
|
||||
"teleport-noPermissionAvailable": "Je hebt geen toestemming om naar beschikbare gebieden te teleporteren."
|
||||
"teleport-noPermissionAvailableSign": "Je hebt geen toestemming om naar het bord van beschikbare gebieden te teleporteren."
|
||||
"teleport-success": "Je bent geteleporteerd naar %lang:region%."
|
||||
"teleport-successSign": "Je bent geteleporteerd naar het bord van %lang:region%."
|
||||
"teleport-noSafe": "Geen veilige plek gevonden in gebied %lang:region%, geen blokken over in het gebied of het maximum aantal pogingen overschreden (%0%%1%)."
|
||||
"teleport-blocked": "Je kunt niet teleporteren omdat de positie buiten het gebied ligt en je geforceerd word erbinnen te teleporteren."
|
||||
"teleport-changedToSign": "Je hebt alleen toestemming om te teleporteren naar het bord en niet binnen de region, teleporteren naar het bord."
|
||||
"teleport-changedToNoSign": "Er is geen bord beschikbaar om naar te teleporteren, proberen om naar het gebied te teleporteren."
|
||||
"teleport-wrongWorld": "Je moet in wereld '%world%' zijn om te teleporteren naar %lang:region%, maar je bent in wereld '%0%'."
|
||||
"setteleport-help": "/as settp [gebied] [reset], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"setteleport-noPermission": "Je hebt geen toestemming om de teleporteer lokatie in te stellen."
|
||||
"setteleport-noPermissionOther": "Je hebt geen toestemming om de teleporteer lokatie in te stellen voor een gebied dat niet van jou is."
|
||||
"setteleport-noRentOrBuy": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"setteleport-success": "Teleporteer lokatie van %lang:region% ingestelt."
|
||||
"setteleport-notInside": "De lokatie moet zich binnen het gebied bevinden."
|
||||
"setteleport-reset": "Teleporteer lokatie van %lang:region% is gereset."
|
||||
"find-help": "/as find <buy|rent> [maxprijs] [groep]."
|
||||
"find-noPermission": "Je hebt geen toestemming om te zoeken naar gebieden en naar deze te teleporteren."
|
||||
"find-success": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
|
||||
"find-successMax": "Een %0% gebied is gevonden: %lang:region%, bij het zoeken met een maximale prijs van %1%%2%."
|
||||
"find-wrongMaxPrice": "De aangegeven maximum prijs is geen correct nummer: %0%."
|
||||
"find-wrongGroup": "De aangegeven groep bestaat niet: %0%."
|
||||
"find-noneFound": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs gelijk aan je saldo: %1%%2%."
|
||||
"find-noneFoundMax": "Geen %0% gebied gevonden bij het zoeken met een maximale prijs van %1%%2%."
|
||||
"find-onlyInGroup": ", alleen gebieden gezocht in de groep: %0%."
|
||||
"groupadd-help": "/as groupadd <groep> [gebied], als er geen gebied is aangegeven dan worden alle gebieden in je WorldEdit selectie gebruikt."
|
||||
"groupadd-noPermission": "Je hebt geen toestemming om gebieden toe te voegen aan groepen."
|
||||
"groupadd-success": "Gebied %lang:region% is toegevoegd aan groep '%0%', deze group heeft nu %1% leden."
|
||||
"groupadd-failed": "Gebied %lang:region% is al toegevoegd aan groep '%0%'."
|
||||
"groupadd-weSuccess": "Toegevoegd aan groep %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Waren al toegevoegd aan groep %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <groep> [gebied], als er geen gebied is aangegeven worden alle gebieden in je WorldEdit selectie gebruikt."
|
||||
"groupdel-noPermission": "Je hebt geen toestemming om gebieden van groepen te verwijderen."
|
||||
"groupdel-wrongGroup": "Groep %0% niet gevonden, gebruik '/as grouplist' om de lijst van groepen te bekijken."
|
||||
"groupdel-success": "Gebied %lang:region% is verwijderd van groep '%0%', deze groep heeft nu %1% leden."
|
||||
"groupdel-failed": "Gebied %lang:region% is geen lid van groep '%0%'."
|
||||
"groupdel-weSuccess": "Verwijderd van groep %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Waren al niet in de groep %0%: [gray]%1%."
|
||||
"grouplist-noPermission": "Je hebt geen toestemming om de geregistreerde groepen te bekijken."
|
||||
"grouplist-noGroups": "Er zijn geen groepen aangemaakt."
|
||||
"grouplist-success": "De volgende groepen zijn geregistreerd: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <groep>."
|
||||
"groupinfo-noPermission": "Je hebt geen toestemming voor het bekijken van informatie over een groep."
|
||||
"groupinfo-noGroup": "Er is geen groep geregistreerd met de naam '%0%', gebruik /as grouplist om de lijst te bekijken."
|
||||
"groupinfo-members": "De volgende gebieden zijn leden van de groep %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "Groep %0% heeft geen leden."
|
||||
"schemevent-help": "/as schemevent <gebied> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Het aangegeven event '%0%' bestaat niet, gebruik een van de volgende: [gray]%1%."
|
||||
"schemevent-success": "Event '%0%' succesvol getriggerd voor gebied %lang:region%."
|
||||
"schemevent-noPermission": "Je hebt geen toestemming om events te triggeren."
|
||||
"add-help": "/as add <rent|buy> [gebied] [wereld]."
|
||||
"add-noPermission": "Je hebt geen toestemming om een gebied toe te voegen aan AreaShop."
|
||||
"add-success": "Toegevoegd als %0%: [gray]%1%."
|
||||
"add-failed": "Al geregistreerd: [gray]%0%."
|
||||
"add-failedOtherWorld": "Al geregistreerd in een andere wereld: [gray] %0%."
|
||||
"add-blacklisted": "Op de blacklist: [gray]%0%."
|
||||
"add-specifyWorld": "Geef de wereld van het gebied aan als je het commando vanuit de console gebruikt."
|
||||
"add-incorrectWorld": "Wereld '%0%' niet gevonden, probeer opnieuw (hoofdlettergevoelig)."
|
||||
"add-noPermissionRegions": "Geen toestemming om toe te voegen: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Je bent geen member/owner van deze gebieden of hebt geen toestemming om je gebieden toe te voegen."
|
||||
"del-noPermission": "Je hebt geen toestemming om gebieden te verwijderen."
|
||||
"del-success": "Verwijderde gebieden: [gray]%0%."
|
||||
"del-failed": "Geen toestemming om te verwijderen of niet geregistreerd: [gray]%0%."
|
||||
"addsign-help": "/as addsign [gebied] [profiel]."
|
||||
"addsign-noSign": "Je kijkt niet naar een bord."
|
||||
"addsign-noRegions": "Geen gebied gevonden op de lokatie van het bord."
|
||||
"addSign-notRegistered": "Het aangegeven gebied is niet geregistreerd in AreaShop: %0% (het gebied moet eerst worden toegevoegd aan AreaShop voordat een bord kan worden toegevoegd)."
|
||||
"addsign-couldNotDetect": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied mee als extra argument (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Meerdere gebieden gevonden op de lokatie van het bord, geef het gebied aan op de tweede regel (2 van de gevonden gebieden: %lang:tRegion|%0%|% en %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Het aangegeven profiel bestaat niet, gebruik een van de volgende (check de config): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Bord profiel %0%"
|
||||
- " hover: %lang:action|Gebruik dit profiel|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "Het bord is toegevoegd aan %lang:region%."
|
||||
"addsign-successProfile": "Het bord is toegevoegd aan %lang:region% met profiel %0%."
|
||||
"addsign-alreadyRegistered": "Dat bord is al geregistreerd voor gebied %lang:region%."
|
||||
"addsign-noPermission": "Je hebt geen toestemming om een bord toe te voegen."
|
||||
"delsign-noSign": "Je kijkt niet naar een bord."
|
||||
"delsign-noPermission": "Je hebt geen toestemming om een bord te verwijderen."
|
||||
"delsign-noRegion": "Dat bord hoort niet bij een AreaShop gebied."
|
||||
"delsign-success": "Het bord is verwijderd van gebied %lang:region%."
|
||||
"me-noPermission": "Je hebt geen toestemming om te zien welke gebieden je hebt."
|
||||
"me-header": "Gebieden van %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Je bent geen speler dus je kunt geen gebieden hebben."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% over"
|
||||
- " hover: tot %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%lang:player% is eigenaar"
|
||||
- " hover: Je bent toegevoegd als vriend"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% heeft geen gebieden gekocht of gehuurd en is niet als vriend toegevoegd bij gebieden."
|
||||
"me-noPlayer": "%0% kan niet gevonden worden, is waarschijnlijk nooit op de server geweest."
|
||||
"me-clickHint": "[gray][italic]Klik op een naam van een gebied voor details."
|
||||
"setowner-help": "/as setowner <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"setowner-noPermission": "Je hebt geen toestemming om de eigenaar van een gebied in te stellen."
|
||||
"setowner-noPermissionRent": "Je hebt geen toestemming om de eigenaar van huur gebieden in te stellen."
|
||||
"setowner-noPermissionBuy": "Je hebt geen toestemming om de eigenaar van koop gebieden in te stellen."
|
||||
"setowner-notRegistered": "Het aangegeven gebied is niet geregistreerd, eigenaar kan niet worden ingesteld."
|
||||
"setowner-noPlayer": "De UUID van de aangegeven speler kon niet worden gevonden: %0%."
|
||||
"setowner-succesRent": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%, gehuurt tot %until% (%timeleft% over)."
|
||||
"setowner-succesRentExtend": "Eigenaar was al %lang:player%, huur verlengt met '%duration%', nu gehuurd tot %until% (%timeleft% over)."
|
||||
"setowner-succesBuy": "Eigenaar van %lang:region% succesvol veranderd naar %lang:player%."
|
||||
"resell-help": "/as resell <prijs> [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"resell-wrongPrice": "'%0%' is geen geldige prijs."
|
||||
"resell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"resell-notBought": "Je kunt %lang:region% niet doorverkopen want dit gebied is nog niet verkocht."
|
||||
"resell-success": "%lang:region% is succesvol in doorverkoop mode gezet voor %resellprice%."
|
||||
"resell-noPermission": "Je hebt geen toestemming om je gebied in doorverkoop mode te zetten."
|
||||
"resell-noPermissionOther": "Je hebt geen toestemming om gebieden in doorverkoop mode te zetten."
|
||||
"resell-disabled": "Doorverkopen is uitgeschakeld voor dit gebied."
|
||||
"stopresell-help": "/as stopresell [gebied], het gebied waarin je staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"stopresell-notRegistered": "Het aangegeven gebied is niet geregistreerd: %0%."
|
||||
"stopresell-notResell": "Je kunt niet stoppen met doorverkopen van %lang:region% want hij staat niet in doorverkoop mode."
|
||||
"stopresell-success": "%lang:region% is succesvol terug gezet in verkocht mode."
|
||||
"stopresell-noPermission": "Je hebt geen toestemming om je gebied terug te zetten in verkocht mode."
|
||||
"stopresell-noPermissionOther": "Je hebt geen toestemming om een gebied terug te zetten in verkocht mode."
|
||||
"addfriend-help": "/as addfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"addfriend-noPermissionOther": "Je hebt geen toestemming om vrienden toe te voegen aan gebieden die niet van jou zijn."
|
||||
"addfriend-noPermission": "Je hebt geen toestemming om vrienden toe te voegen aan je gebied."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij gebied %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% is toegevoegd als vriend bij je gebied %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% is al toegevoegd als vriend voor %lang:region%."
|
||||
"addfriend-self": "Het toevoegen van de eigenaar van het gebied als vriend zou nutteloos zijn."
|
||||
"addfriend-noOwner": "Je kunt geen vrienden toevoegen aan een gebied zonder eigenaar."
|
||||
"addfriend-notVisited": "Je kunt %0% niet toevoegen omdat hij de server nog niet heeft bezocht."
|
||||
"delfriend-help": "/as delfriend <speler> [gebied], het gebied waar je in staat zal worden gebruikt als je deze niet aangeeft."
|
||||
"delfriend-noPermissionOther": "Je hebt geen toestemming om vrienden te verwijderen van gebieden die niet van jou zijn."
|
||||
"delfriend-noPermission": "Je hebt geen toestemming om vrienden te verwijderen van je gebied."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% is verwijderd als vriend van %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% is verwijderd als vriend van je gebied %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% is niet toegevoegd als vriend voor %lang:region%."
|
||||
"delfriend-noOwner": "Je kunt geen vrienden verwijderen van een gebied zonder eigenaar."
|
||||
"linksigns-multipleRegions": "Meerdere gebieden gevonden: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Klik nog een keer om het opnieuw te proberen of gebruik '/as linksigns' om te stoppen."
|
||||
"linksigns-noRegions": "Geen AreaShop gebieden gevonden in de richting van je cursor, controleer of het gebied is toegevoegd aan AreaShop [gray](maximaal bereik 100 blokken)."
|
||||
"linksigns-regionFound": "Gebied %lang:region% is gevonden, wijs nu naar een bord en linksklik om het te koppelen."
|
||||
"linksigns-signFound": "Bord gevonden op (%0%, %1%, %2%), wijs nu naar een gebied en rechtsklik om het te koppelen."
|
||||
"linksigns-noSign": "Geen bord gevonden in de richting van je cursor, controleer of je direct zicht hebt op een bord en klik opnieuw [gray](maximaal bereik 100 blokken)."
|
||||
"linksigns-alreadyRegistered": "Dat bord is al gekoppelt aan gebied %lang:region%, klik opnieuw om een ander bord te selecteren."
|
||||
"linksigns-first": "Je bent in bord-koppel modus gegaan."
|
||||
"linksigns-next": "[gray]Linksklik om een bord te selecteren, rechtsklik om een gebied te selecteren, gebruik '/as linksigns' om te stoppen."
|
||||
"linksigns-noPermission": "Je hebt geen toestemming om massa bord-koppel modus te gebruiken."
|
||||
"linksigns-stopped": "Je bent gestopt met bord-koppel modus."
|
||||
"stack-help":
|
||||
- "/as stack <aantal> <afstand> <naam> <rent|buy> [groep].[break]"
|
||||
- " [gray]<aantal> Het aantal gebieden dat word gemaakt.[break]"
|
||||
- " [gray]<afstand> Blokken afstand tussen de gebieden.[break]"
|
||||
- " [gray]<naam> Naam van de gebieden (komt een nummer achter).[break]"
|
||||
- " [gray]<rent|buy> Maak ze huur of koop gebieden.[break]"
|
||||
- " [gray][groep] Groep waaraan de gebieden worden toegevoegd.[break]"
|
||||
- " [gray]De gebieden zullen worden gemaakt in de richting waarnaar je kijkt."
|
||||
"stack-accepted": "Begonnen met %0% %1% gebieden maken met %2% blokken ruimte ertussen, namen beginnen met %3% en hebben een nummer erachter.%4%"
|
||||
"stack-addToGroup": " Gemaakte gebieden zullen worden toegevoegd aan de groep '%0%'."
|
||||
"stack-noPermission": "Je hebt geen toestemming om in grote aantallen gebieden toe te voegen aan AreaShop."
|
||||
"stack-wrongAmount": "'%0%' is geen goed aantal gebieden."
|
||||
"stack-wrongGap": "'%0%' is geen correct getal voor het aantal blokken ruimte tussen gebieden."
|
||||
"stack-noSelection": "Je hebt geen selectie die aangeeft waar het eerste gebied word gemaakt."
|
||||
"stack-addStart": "[gray]%0% gebieden aan het toevoegen met %1% per seconde."
|
||||
"stack-addComplete": "[gray]%0% gebieden toegevoegd%1%."
|
||||
"stack-tooHigh": ", %0% gebieden overgeslagen omdat ze zich boven Y=256 bevinden"
|
||||
"stack-tooLow": ", %0% gebieden overgeslagen omdat ze zich onder Y=0 bevinden"
|
||||
"stack-unclearDirection": "Kijk duidelijk in de noord, oost, zuid, west, omhoog of naar beneden richting, gedetecteerd: %0%."
|
||||
"setlandlord-help": "/as setlandlord <speler> [gebied], het gebied waar je in staat zal worden gebruikt als niet aangegeven."
|
||||
"setlandlord-noPermission": "Je hebt geen toestemming om de landeigenaar in te stellen voor een gebied."
|
||||
"setlandlord-success": "%lang:landlord% is succesvol ingesteld als landeigenaar voor %lang:region%."
|
||||
"message-help": "/as message <speler> <bericht...>"
|
||||
"message-noPermission": "Je hebt geen toestemming om AreaShop berichten te sturen."
|
||||
"message-notOnline": "%0% is niet online."
|
||||
"import-help": "/as import RegionForSale"
|
||||
"import-wrongSource": "Geef aan vanaf waar je data wilt importeren, opties: RegionForSale."
|
||||
"import-noPluginFolder": "Kon de folder %0% niet vinden, weet je zeker dat je de data van de juiste bron importeert?"
|
||||
"import-noWorldsFolder": "Er is geen 'plugins/RegionForSale/worlds' map, daarom kon niets geïmporteerd worden."
|
||||
"import-confirm": "Weet je het zeker dat je alle gebieden van RegionForSale wilt importeren?"
|
||||
"import-start": "Het importeren van de data van RegionForSale begint:"
|
||||
"import-doWorld": "[darkgreen][bold]► Wereld %0%:"
|
||||
"import-noBukkitWorld": "[red]Kon de wereld niet in Bukkit vinden."
|
||||
"import-noRegionManager": "[red] Kon de RegionManager van WorldGuard niet vinden, zijn gebieden aangezet in deze wereld?"
|
||||
"import-noRegions": "[red]Geen regions.yml bestand gevonden."
|
||||
"import-loadRegionsFailed": "[red]Kon regions.yml niet laden van: %0%"
|
||||
"import-invalidRegionSection": "[red]Ongeldige selectie in regions.yml: %0%"
|
||||
"import-noWorldGuardRegion": "[red]WorldGuard gebied niet gevonden: %0%."
|
||||
"import-noWorldGuardRegionParent": "[red]WorldGuard gebied voor ouder gebied niet gevonden: %0%."
|
||||
"import-buyAndRent": "[gold]%0% kan gekocht en gehuurd worden, alleen als kopen aan het toevoegen in AreaShop (kan niet beide zijn)."
|
||||
"import-noBuyAndNoRent": "[red]%0% kon niet gekocht en gehuurd worden, import overslaan."
|
||||
"import-imported": "[green]%lang:tRegion%0%l% geïmporteerd."
|
||||
"import-loadWorldConfigFailed": "[red]Het laden van Wereld-specifieke config.yml is mislukt: %0%."
|
||||
"import-improperParentRegion": "[red]Ouder gebied %0% heeft geen leesbare instellingen."
|
||||
"import-alreadyAdded": "[red]Gebied '%0%' is al een keer toegevoegd."
|
||||
"import-alreadyAddedOtherWorld": "[red]Gebied '%0%' is al een keer toegevoegd in de %1% wereld, gebieden in verschillende werelden kunnen niet dezelfde naam hebben in AreaShop."
|
||||
"import-invalidSignLocation": "[red]Het importeren van een bordje van gebied '%0%' is mislukt, ongeldige locatie: '%1%'."
|
||||
"import-signAlreadyAdded": "[red]Het toevoegen van een bordje op locatie '%1%' aan gebied '%0%' is overgeslagen, het is al aan gebied '%2%' toegevoegd."
|
||||
"import-moneyBackFailed": "[red]Het ontleden van de koop prijs '%0%' en de verkoop prijs '%1%' om het geld terug percentage in te voegen is mislukt."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt huren?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te huren|%"
|
||||
- " hover: %lang:action|Huur %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt verlengen?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verlengen|%"
|
||||
- " hover: %lang:action|Verleng %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Weet je zeker dat je de huur van %lang:tRegion|%0%|% wilt stoppen?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Stop de huur van %0%|%"
|
||||
- " hover: %lang:action|Stop de huur van %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt kopen?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te kopen|%"
|
||||
- " hover: %lang:action|Koop %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Weet je zeker dat je %lang:tRegion|%0%|% wilt verkopen?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klik om %0% te verkopen|%"
|
||||
- " hover: %lang:action|Verkoop %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% jaren"
|
||||
"timeleft-months": "%0% maanden"
|
||||
"timeleft-days": "%0% dagen"
|
||||
"timeleft-hours": "%0% uren"
|
||||
"timeleft-minutes": "%0% minuten"
|
||||
"timeleft-second": "%0% seconde"
|
||||
"timeleft-seconds": "%0% seconden"
|
||||
"timeleft-ended": "Verlopen"
|
||||
"greeting-forrent": "%region% kan worden gehuurd voor %price% per %duration%."
|
||||
"greeting-rented": "%region% is gehuurd door %player% tot %until%."
|
||||
"greeting-forsale": "%region% kan worden gekocht voor %price%."
|
||||
"greeting-bought": "%region% is gekocht door %player%."
|
||||
"greeting-resale": "%region% kan gekocht worden voor %resellprice% van %player%."
|
||||
"update-playerNotify":
|
||||
- "[darkgreen]Update van AreaShop V%0% naar AreaShop V%1% beschikbaar, download de laatste versie op "
|
||||
- "[bold]Spigot[/bold]"
|
||||
- " hover: %lang:action|Ga naar de Spigot AreaShop pagina|%"
|
||||
- " link: https://www.spigotmc.org/resources/areashop.2991/"
|
||||
- " (en schrijf een review)."
|
||||
@@ -0,0 +1,474 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Norwegian language file, plugin version 2.5.0, 365/428 messages are translated (85%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Bruk %1%|%"
|
||||
- " kommando: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Bruk %0%|%"
|
||||
- " kommando: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Region %0%"
|
||||
- " hover: %lang:action|Region informasjon|%"
|
||||
- " kommando: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Spiller %0%"
|
||||
- " hover: %lang:action|Regioner til %0%|%"
|
||||
- " kommando: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Grunneier %landlord%"
|
||||
- " hover: %lang:action|Regioner til %landlord%|%"
|
||||
- " kommando: /areashop info player %landlord%"
|
||||
"total-maximum": "Du kan ikke leie og kjøpe mer enn %0% region(er) totalt (du har allerede %1% i gruppe '%2%')."
|
||||
"general-notReady": "AreaShop har ikke lastet ferdig ennå, vennligst vent."
|
||||
"general-noWorld": "Du kan ikke gjøre det, verdenen %lang:region% er for øyeblikket utilgjengelig (world '%world%')."
|
||||
"general-noRegion": "Du kan ikke gjøre det, WorldGuard regionen er for øyeblikket utilgjengelig. (region %lang:region%)."
|
||||
"general-noEconomy": "Det er ikke noen økonomi plugin installert eller satt opp riktig, si ifra til server eieren om dette."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Den kommandoen er ikke gyldig, bruk '/as help' for informasjon."
|
||||
"cmd-onlyByPlayer": "Denne kommandoen kan bare brukes av en spiller."
|
||||
"cmd-weOnlyByPlayer": "Du kan bare bruke en WorldEdit markering som en spiller, spesifiser region navnet som et ekstra argument."
|
||||
"cmd-noSelection": "Du har ikke laget en WorldEdit markering."
|
||||
"cmd-noRegionsFound": "Ingen regioner som er registrert i AreaShop er funnet i din markering."
|
||||
"cmd-noWERegionsFound": "Ingen WorldEdit regioner som overlapper din markering er funnet."
|
||||
"cmd-noRegionsAtLocation": "Ingen regioner er funnet på din plassering, spesifiser region navnet som et argument."
|
||||
"cmd-moreRegionsAtLocation": "Mer enn en region er funnet på din plassering, spesifiser region navnet som et argument."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Automatisk valg av region er bare mulig for spillere, spesifiser region navnet som som et argument."
|
||||
"help-header": "Informasjons side, kommandoer som du kan bruke."
|
||||
"help-noPermission": "Du har ikke rettigheter til å vise siden med hjelp."
|
||||
"help-alias": "Kommando aliaser: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Viser siden med hjelp."
|
||||
"help-info": "%lang:helpCommand|/as info|% Få informasjon om gjeldende regioner."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Lei en region eller utvid din gjeldende leie."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Kjøp en region."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Stopp leie av en region."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Selg en region."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Last inn filer på nytt og oppdater regionene."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Skru på gjenoppretting og velg en profil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Endre prisen på en region."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Endre leie tiden til en region."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teleporter til en kjøpe/leie region."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Sett teleporterings plass for en region."
|
||||
"help-find": "%lang:helpCommand|/as find|% Finn en ledig kjøp eller leie region."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Legg til en region til en gruppe."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Fjern en region fra en gruppe."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Vis alle grupper som er registrert."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Vis informasjon om en gruppe."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Aktiver et schematic event for en region."
|
||||
"help-add": "%lang:helpCommand|/as add|% Registrer en region som leie eller kjøpe."
|
||||
"help-del": "%lang:helpCommand|/as del|% Fjern en registrert region fra AreaShop."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Legg til et skilt for en eksisterende region."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Fjern skiltet du ser på."
|
||||
"help-me": "%lang:helpCommand|/as me|% Sjekk hvilke regioner du har (+utløpstid)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Sett noen som eier av regionen eller utvid leietiden."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Sett en region i videresalgs modus."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Sett en region tilbake i solgt modus."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Legg til en venn i en region."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Fjern en venn fra en region."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Use bulk sign linking mode."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Lag flere regioner og legg dem til."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Sett grunneier av en region."
|
||||
"rent-help": "/as rent [region], regionen du står i vil bli brukt hvis ikke spesifisert."
|
||||
"rent-noPermission": "Du har ikke rettigheter til å leie en region."
|
||||
"rent-maximum": "Du kan ikke leie mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
|
||||
"rent-maximumExtend": "Du kan ikke utvide denne leien fordi du har mer enn %0% region(er) (Du har allerede %1% i gruppe '%2%')."
|
||||
"rent-payError": "Noe gikk galt med din betaling, prøv igjen senere."
|
||||
"rent-rented": "Du leide %lang:region% frem til %until%, du kan utvide din leie ved å høyreklikke på skiltet igjen eller bruke /as rent."
|
||||
"rent-extended": "Du utvidet din leie av %lang:region% frem til %until%."
|
||||
"rent-extendedToMax": "Du har utvidet din leie av %lang:region% frem til %until% (som er den maksimale leietiden av %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "Du har ikke nok penger til å utvide leien (du har %0% og du trenger %price%)."
|
||||
"rent-lowMoneyRent": "Du har ikke nok penger til å leie (du har %0% og du trenger %price%)."
|
||||
"rent-someoneElse": "Noen har allerede leid %lang:region%."
|
||||
"rent-maxExtends": "Du kan ikke utvide leien mer (maksimum er %maxextends% ganger) men, når leien er over kan du leie %lang:region% igjen."
|
||||
"rent-maxRentTime": "Du kan ikke øke leietid av %lang:region% mer tid fremover, den maksimale tiden er %maxrenttime% og du har leid den for %timeleft%."
|
||||
"rent-restrictedToWorld": "Du må være i '%world%' verden for å leie %lang:region% (du er i '%0%')."
|
||||
"rent-restrictedToRegion": "Du må være på innsiden av %lang:region% for å leie den."
|
||||
"rent-expireWarning": "Din region %lang:region% har %timeleft% igjen, husk å utvide leien om du vil beholde den."
|
||||
"rent-alreadyAtFull": "%lang:region% er allerede ved eller over den maksimale leietiden, du kan ikke utvide mer ennå."
|
||||
"buy-help": "/as buy [region], regionen du står i vil bli brukt hvis ikke spesifisert."
|
||||
"buy-noPermission": "Du har ikke rettigheter til å kjøpe en region."
|
||||
"buy-noPermissionResell": "Du har ikke rettigheter til å kjøpe en region i videresalgs modus."
|
||||
"buy-noPermissionNoResell": "Du har ikke rettigheter til å kjøpe en region som ikke er i videresalgs modus."
|
||||
"buy-maximum": "Du kan ikke kjøpe mer enn %0% region(er) (du har allerede %1% i gruppe '%2%')."
|
||||
"buy-payError": "Noe gikk galt med din betaling, prøv igjen senere."
|
||||
"buy-succes": "Du var vellykket i ditt kjøp av %lang:region%."
|
||||
"buy-successResale": "Du var vellykket i ditt kjøp av %lang:region% fra %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Din region %lang:region% har blitt solgt til %lang:player% for %0%."
|
||||
"buy-lowMoney": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %price%)."
|
||||
"buy-lowMoneyResell": "Du har ikke nok penger til å kjøpe %lang:region% (du har %0% og du trenger %resellprice%)."
|
||||
"buy-yours": "Du eier allerede %lang:region%."
|
||||
"buy-someoneElse": "Noen andre har kjøpt %lang:region%."
|
||||
"buy-restrictedToWorld": "Du må være i '%world%' verden for å kjøpe %lang:region% (du er i '%0%')."
|
||||
"buy-restrictedToRegion": "Du må være på innsiden av %lang:region% for å kjøpe den."
|
||||
"unrent-help": "/as unrent [region], regionen du står i vil bli bruk om ikke spesifisert."
|
||||
"unrent-noPermission": "Du har ikke rettigheter til å stoppe leie på en region."
|
||||
"unrent-noPermissionOther": "Du har ikke rettigheter til å stoppe leie på en annen region."
|
||||
"unrent-notRegistered": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke registrert for leie."
|
||||
"unrent-notRented": "Denne regionen kan det ikke bli avsluttet leie på fordi den er ikke leid."
|
||||
"unrent-unrented": "%lang:region% sin leie av %lang:player% har blitt avsluttet."
|
||||
"unrent-expired": "Din leie av %lang:region% har gått ut."
|
||||
"sell-help": "/as sell [region], regionen du står i vil bli brukt hvis ikke spesifisert."
|
||||
"sell-notRegistered": "Denne regionen kan ikke bli solgt fordi den er ikke registrert for salg."
|
||||
"sell-notBought": "Denne regionen kan ikke bli solgt fordi den er ikke noen sin eiendom."
|
||||
"sell-sold": "%lang:region% til %lang:player% har blitt solgt."
|
||||
"sell-noPermission": "Du har ikke rettigheter til å selge en region."
|
||||
"sell-noPermissionOther": "Du har ikke rettigheter til å selge en annen region."
|
||||
"reload-noPermission": "Du har ikke rettigheter til å laste inn konfigurasjonen på nytt."
|
||||
"reload-updateCommandChanged": "'/as updaterents' og '/as updatebuys' har blitt fjernet, '/as reload' vil også oppdatere regioner så bruk den kommandoen fremover."
|
||||
"info-noPermission": "Du har ikke rettigheter til å få informasjon om regioner."
|
||||
"info-allHeader": "Alle regioner%0%:"
|
||||
"info-rentedHeader": "Leide regioner%0%:"
|
||||
"info-forrentHeader": "Regioner til leie%0%:"
|
||||
"info-forsaleHeader": "Regioner til salgs%0%:"
|
||||
"info-soldHeader": "Solgte regioner%0%:"
|
||||
"info-resellingHeader": "Regioner til videresalg%0%:"
|
||||
"info-nogroupHeader": "Regioner uten gruppe%0%:"
|
||||
"info-limitedToGroup": " (begrenset til gruppe %0%)"
|
||||
"info-nogroupNone": "Det er ingen regioner uten en gruppe."
|
||||
"info-noFiltergroup": "Gruppe '%0%' eksiterer ikke og kan derfor ikke bli brukt til å begrense resultatene."
|
||||
"info-noRegions": "Ingen regioner har blitt funnet."
|
||||
"info-wrongPage": "%0% er ikke et riktig side nummer."
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Forrige[/bold] "
|
||||
- " hover: Dette er første side"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Neste►[/bold]"
|
||||
- " hover: Dette er siste side"
|
||||
"info-playerHelp": "/as info player <navn>."
|
||||
"info-playerRents": "Regioner leid av %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% har ikke leid en region."
|
||||
"info-playerBuys": "Regioner kjøpt av %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% har ikke kjøpt en region."
|
||||
"info-regionHelp": "/as info region [navn], den regionen du står i vil bli bruk om ikke spesifisert."
|
||||
"info-regionHeaderRent": "[darkgreen]Informasjon om %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Informasjon om %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Utleid til %lang:player% frem til: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Kjøpt av %lang:player%, for øyeblikket videreselges."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Forleng for[/bold]"
|
||||
- " hover: Forleng leie av %region%"
|
||||
- " hover: med %duration% for %price%"
|
||||
- " hover: %lang:action|Extend rent of %region%|%"
|
||||
- " kommando: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Lei for[/bold]"
|
||||
- " hover: Lei %region% for %price% per %duration%"
|
||||
- " hover: %lang:action|Rent %region%|%"
|
||||
- " kommando: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Kjøp for[/bold]"
|
||||
- " hover: Kjøp %region% for %price%"
|
||||
- " hover: %lang:action|Buy %region%|%"
|
||||
- " kommando: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Videresalgs pris: [gray]%resellprice% (du kan kjøpe den fra %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Venner lagt til: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|Remove %0% as friend|%"
|
||||
- " kommando: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Penger tilbake for salg: [gray]%moneyback% (%moneybackpercent%% av prisen)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Penger tilbake etter salg[/bold]"
|
||||
- " hover: Selg %region% å få igjen %moneyback%"
|
||||
- " hover: %lang:action|Sell %region%|%"
|
||||
- " kommando: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% av prisen)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Penger tilbake fra leie: [gray]%moneyback% (%moneybackpercent%% fra gjenstående tid)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Penger tilbake fra leie[/bold]"
|
||||
- " hover: Stopp leie %region% å få tilbake %moneyback%"
|
||||
- " hover: %lang:action|Unrent %region%|%"
|
||||
- " kommando: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% av gjenstående tid)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maks antall utvidelser: [gray]%maxextends% gang(er)."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Leien kan ikke utvides."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Utvidelser igjen: [gray]%extendsleft% gang(er) av %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Leie på forhånd: [gray]%maxrenttime% på maks."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Gå til region[/bold]"
|
||||
- " hover: %lang:action|Teleporter to %region%|%"
|
||||
- " kommando: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]Sett teleporterings posisjon[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Sett teleporterings posisjon|%"
|
||||
- " kommando: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Koblete skilt: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Fordelte grupper: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Automatisk stopp leie etter: [gray]%inactivetime% av inaktivitet fra spiller."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Automatisk selg etter: [gray]%inactivetime% av inaktivitet fra spiller."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du må stå på innsiden av %lang:region% for å leie den."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Du må være i '%world%' for å leie %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Du må være på innsiden av %lang:region% for å kjøpe den."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Du må være i '%world%' for å kjøpe %lang:region%."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Grunneier: [gray]%lang:landlord% (mottar pengene)."
|
||||
"info-regionNotExisting": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
|
||||
"setrestore-noPermission": "Du har ikke rettigheter til å endre gjenopprettelses instillingene."
|
||||
"setrestore-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' er ikke gyldig uttrykk, skal være true, false eller general."
|
||||
"setrestore-success": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%'."
|
||||
"setrestore-successProfile": "Vellykket satt innstillingene for gjenoppretting for %lang:region% til '%0%' og profilen til '%1%'."
|
||||
"setprice-noPermission": "Du har ikke rettighetene til å endre prisen til en region."
|
||||
"setprice-help": "/as setprice <pris> [region], den regionen du står i vil bli valgt om ikke spesifisert."
|
||||
"setprice-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"setprice-wrongPrice": "'%0%' er ikke en gyldig pris."
|
||||
"setprice-successRent": "Prisen til region %lang:region% er endret til %price% per %duration%."
|
||||
"setprice-successBuy": "Prisen til region %lang:region% er endret til %price%."
|
||||
"setprice-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
|
||||
"setprice-noLandlord": "Du har ikke rettigheter til å endre prisen fordi du er ikke eieren av %lang:region%."
|
||||
"setduration-noPermission": "Du har ikke rettigheter til å endre tidsrommet for en leie."
|
||||
"setduration-help": "/as setduration <mengde> <identifisering> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"setduration-notRegistered": "%0% er ikke registrert for leie."
|
||||
"setduration-wrongAmount": "'%0%' er ikke gyldig, bruk hele nummer."
|
||||
"setduration-wrongFormat": "'%0%' er ikke et riktig tidsformat, sjekk dokumentasjonen på Bukkit."
|
||||
"setduration-success": "Tiden til region %lang:region% er endret til '%duration%'."
|
||||
"setduration-noLandlord": "Du har ikke rettigheter til å endre tiden fordi du er ikke eieren av %lang:region%."
|
||||
"setduration-successRemoved": "Prisen til %lang:region% har blitt fjernet, den vil nå bruke prisen fra en gruppe eller fra default.yml filen, ny pris: %price%."
|
||||
"setup-noRegion": "Du spesifiserte ikke en region på linje nummer to."
|
||||
"setup-alreadyRentSign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en leie region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
|
||||
"setup-alreadyBuySign": "Regionen du spesifiserte er allerede lagt til i AreaShop som en kjøp region, plasser et skilt med [as] på første linjen eller bruk '/as addsign'."
|
||||
"setup-noDuration": "Du spesifiserte ikke hvor lenge den regionen kan bli leid, gjør dette på den tredje linjen."
|
||||
"setup-wrongDuration": "Tiden du spesifiserte er ikke i korrekt format, eksempel: 1 dag."
|
||||
"setup-noPrice": "Du spesifiserte ikke prisen på den fjerde linjen."
|
||||
"setup-wrongPrice": "Du spesifiserte ikke prisen riktig, bare bruk nummer."
|
||||
"setup-rentSuccess": "leie av region %lang:region% er satt opp riktig."
|
||||
"setup-buySuccess": "Salg av region %lang:region% er satt opp riktig."
|
||||
"setup-noPermissionRent": "Du har ikke rettigheter til å sette opp leie regioner."
|
||||
"setup-noPermissionBuy": "Du har ikke rettigheter til å sette opp regioner til salgs."
|
||||
"setup-couldNotDetect": "Fant flere regioner med samme prioritet og/eller foreldre/barn kobling, spesifiser en på den andre linjen (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% er på svartelisten og kan ikke bli lagt til i AreaShop."
|
||||
"setup-noPermission": "Du kan ikke legge til regionen '%0%', du er ikke en eier/medlem eller har ikke rettigheter til det."
|
||||
"destroy-noPermissionRent": "Du har ikke rettigheter til å avregistrere en leie region."
|
||||
"destroy-noPermissionBuy": "Du har ikke rettigheter til å avregistrere en kjøpe region."
|
||||
"destroy-successRent": "%lang:region% vellykket i å avregistrere en leie region."
|
||||
"destroy-successBuy": "%lang:region% vellykket i å avregistrere en kjøpe region."
|
||||
"teleport-help": "/as tp <region> [skilt]"
|
||||
"teleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"teleport-noPermission": "Du har ikke rettigheter til å teleportere til din region."
|
||||
"teleport-noPermissionOther": "Du har ikke rettigheter til å teleportere til regioner du ikke eier."
|
||||
"teleport-noPermissionSign": "Du har ikke rettigheter til å teleportere til skiltet til din region."
|
||||
"teleport-noPermissionOtherSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du ikke eier."
|
||||
"teleport-noPermissionFriend": "Du har ikke rettigheter til å teleportere til regioner du er langt til som venn."
|
||||
"teleport-noPermissionFriendSign": "Du har ikke rettigheter til å teleportere til skiltet til regioner du er lagt til som venn."
|
||||
"teleport-success": "Du teleporterte til %lang:region%."
|
||||
"teleport-successSign": "Du teleporterte til skiltet til %lang:region%."
|
||||
"teleport-noSafe": "Ingen trygg posisjon funnet i %lang:region%, ingen plasser igjen i regionen eller maks forsøk overskredet (%0%/%1%)."
|
||||
"teleport-blocked": "Du kan ikke teleportere fordi posisjonen er på utsiden av regionen, og du er tvunget til å teleportere til innsiden."
|
||||
"teleport-changedToSign": "Du har bare rettigheter til å teleportere til skilt og ikke utsiden av regionen, teleporterer til skilt."
|
||||
"teleport-changedToNoSign": "Ingen skilt tilgjengelige å teleportere til, prøver å teleportere til innsiden av regionen."
|
||||
"setteleport-help": "/as settp [region] [reset], den regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"setteleport-noPermission": "Du har ikke rettigheter til å sette teleporterings punkt."
|
||||
"setteleport-noPermissionOther": "Du har ikke rettigheter til å sette teleporterings punktet for en region du ikke eier."
|
||||
"setteleport-noRentOrBuy": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"setteleport-success": "Teleporterings posisjon for %lang:region% satt."
|
||||
"setteleport-notInside": "Punktet må være på innsiden av regionen."
|
||||
"setteleport-reset": "Teleporterings posisjon for %lang:region% har blitt resatt."
|
||||
"find-help": "/as find <buy|rent> [maxpris] [gruppe]."
|
||||
"find-noPermission": "Du har ikke rettigheter til å søke etter regioner og teleportere til dem."
|
||||
"find-success": "Fant en %0% region: %lang:region%, under søket med en makspris av din balanse: %1%%2%."
|
||||
"find-successMax": "Fant en %0% region: %lang:region%, under søket med en makspris av: %1%%2%."
|
||||
"find-wrongMaxPrice": "Den spesifiserte maks prisen er ikke et korrekt nummer. %0%"
|
||||
"find-wrongGroup": "Den spesifiserte gruppen eksisterer ikke: %0%."
|
||||
"find-noneFound": "Ingen %0% region funnet under søket med en makspris av din balanse: %1%%2%."
|
||||
"find-noneFoundMax": "Ingen %0% region ble funnet under søket med en maks pris av %1%%2%."
|
||||
"find-onlyInGroup": ", bare søkt etter regioner i gruppe: %0%."
|
||||
"groupadd-help": "/as groupadd <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
|
||||
"groupadd-noPermission": "Du har ikke rettigheter til å legge til regioner i grupper."
|
||||
"groupadd-success": "Region %lang:region% har blitt lagt til i gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
|
||||
"groupadd-failed": "Region %lang:region% er allerede et medlem av gruppe '%0%'."
|
||||
"groupadd-weSuccess": "Lagt til i gruppe %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Var allerede i gruppe %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <gruppe> [region], hvis ingen region er spesifisert blir alle regioner fra din WorldEdit markering brukt."
|
||||
"groupdel-noPermission": "Du har ikke rettigheter til å fjerne regioner fra grupper."
|
||||
"groupdel-success": "Region %lang:region% har blitt fjernet fra gruppe '%0%', denne gruppen har nå %1% medlem(mer)."
|
||||
"groupdel-failed": "Region %lang:region% er ikke et medlem av gruppe '%0%'."
|
||||
"groupdel-weSuccess": "Fjernet fra gruppe %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Var ikke i gruppe %0% likevel: [gray]%1%."
|
||||
"grouplist-noPermission": "Du har ikke rettigheter til å vise de registrerte gruppene."
|
||||
"grouplist-noGroups": "Det er for øyeblikket ingen grupper registrert."
|
||||
"grouplist-success": "De følgende gruppene er registrert: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <group>."
|
||||
"groupinfo-noPermission": "Du har ikke rettigheter til å se informasjon om en gruppe."
|
||||
"groupinfo-noGroup": "Det er ingen grupper registrert med navnet '%0%'. bruk /as grouplist for å sjekke grupper."
|
||||
"groupinfo-members": "De følgende regionene er medlemmer av gruppe %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "Gruppe %0% har ingen medlemmer."
|
||||
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Det spesifiserte eventet '%0%' eksisterer ikke, bruk en av de følgende [gray]%1%."
|
||||
"schemevent-success": "Event '%0%' har blitt aktivert vellykket for region %lang:region%."
|
||||
"schemevent-noPermission": "Du har ikke rettigheter til å aktivere et schematic event."
|
||||
"add-help": "/as add <rent|buy> [region] [verden]."
|
||||
"add-noPermission": "Du har ikke rettigheter til å legge til en region i AreaShop."
|
||||
"add-success": "Lagt til som %0%: [gray]%1%."
|
||||
"add-failed": "Allerede registrert: [gray]%0%."
|
||||
"add-blacklisted": "På svartelisten: [gray]%0%."
|
||||
"add-specifyWorld": "Spesifiser verdenen til en region når du bruker konsoll."
|
||||
"add-incorrectWorld": "Verden '%0%' ikke funnet, prøv igjen (sensitiv for store og små bokstaver)."
|
||||
"add-noPermissionRegions": "Ingen rettigheter til å legge til: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Du er enten ikke et medlem/eier av disse regionene eller har ikke rettigheter til å legge til dine regioner."
|
||||
"del-noPermission": "Du har ikke rettigheter til å fjerne regioner."
|
||||
"del-success": "Fjernet regioner: [gray]%0%."
|
||||
"del-failed": "Du har ikke rettigheter til å fjerne eller ikke registrert: [gray]%0%."
|
||||
"addsign-help": "/as addsign [region] [profil]."
|
||||
"addsign-noSign": "Du ser ikke på et skilt."
|
||||
"addsign-noRegions": "Ingen region funnet rundt skiltet sin posisjon."
|
||||
"addsign-couldNotDetect": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Flere regioner ble funnet rundt skiltet, spesifiser region som ekstra argument (2 av regionene som ble funnet: %lang:tRegion|%0%|% og %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Den spesifiserte profilen finnes ikke, bruk en av de følgende (sjekk konfigurasjon): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Skiltprofil %0%"
|
||||
- " hover: %lang:action|Use this profile|%"
|
||||
- " kommando: /areashop linksigns %0%"
|
||||
"addsign-success": "Skiltet har blitt lagt til %lang:region%."
|
||||
"addsign-successProfile": "Skiltet har blitt lagt til %lang:region% med profil %0%."
|
||||
"addsign-alreadyRegistered": "Det skiltet er allerede registrert for region %lang:region%."
|
||||
"addsign-noPermission": "Du har ikke rettigheter til å legge til et skilt."
|
||||
"delsign-noSign": "Du ser ikke på et skilt."
|
||||
"delsign-noPermission": "Du har ikke rettigheter til å fjerne et skilt."
|
||||
"delsign-noRegion": "Det skiltet hører ikke til en AreaShop region."
|
||||
"delsign-success": "Skiltet har blitt fjernet fra region %land:region%."
|
||||
"me-noPermission": "Du har ikke rettigheter til å sjekke hvilken regioner du har."
|
||||
"me-header": "Regioner til %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Du er ikke en spiller så du kan ikke ha noen regioner."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% har ikke leid eller kjøpt regioner og er ikke lagt til som venn på noen."
|
||||
"me-noPlayer": "%0% kan ikke bli funnet, mest sannsynlig aldri vært på serveren."
|
||||
"setowner-help": "/as setowner <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"setowner-noPermission": "Du har ikke rettigheter til å sette eieren av en region."
|
||||
"setowner-noPermissionRent": "Du har ikke rettigheter til å sette eieren av en leie region."
|
||||
"setowner-noPermissionBuy": "Du har ikke rettigheter til å sette eieren av en kjøpe region."
|
||||
"setowner-notRegistered": "Den spesifiserte regionen er ikke registrert, eier kan ikke bli satt."
|
||||
"setowner-noPlayer": "Kunne ikke skaffe UUID til den spesifiserte spilleren: %0%."
|
||||
"setowner-succesRent": "Eier av %lang:region% vellykket endret til %lang:player%, leid frem til %until% (%timeleft% igjen)"
|
||||
"setowner-succesRentExtend": "Eier var allerede %lang:player%, leie utvidet med '%duration%', nå leid frem til %until% (%timeleft% igjen)."
|
||||
"setowner-succesBuy": "Eier av %lang:region% vellykket endret til %lang:player%."
|
||||
"resell-help": "/as resell <pris> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"resell-wrongPrice": "'%0%' er ikke en gyldig pris."
|
||||
"resell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"resell-notBought": "Du kan ikke videreselge %lang:region% fordi den er ikke solgt ennå."
|
||||
"resell-success": "%lang:region% er vellykket satt i videresalgsmodus for %resellprice%."
|
||||
"resell-noPermission": "Du har ikke rettigheter til å sette din region i videresalgs modus."
|
||||
"resell-noPermissionOther": "Du har ikke rettigheter til å sette en region i videresalgs modus."
|
||||
"stopresell-help": "/as stopresell [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"stopresell-notRegistered": "Den spesifiserte regionen er ikke registrert: %0%."
|
||||
"stopresell-notResell": "Du kan ikke stoppe videresalget av %lang:region% fordi den er ikke i videresalgs modus."
|
||||
"stopresell-success": "%lang:region% er vellykket satt tilbake i solgt modus."
|
||||
"stopresell-noPermission": "Du har ikke rettigheter til å sette din region tilbake i solgt modus."
|
||||
"stopresell-noPermissionOther": "Du har ikke rettigheter til å sette regioner tilbake i solgt modus."
|
||||
"addfriend-help": "/as addfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"addfriend-noPermissionOther": "Du har ikke rettigheter til å legge til venner i regioner som ikke er dine."
|
||||
"addfriend-noPermission": "Du har ikke rettigheter til å legge til venner i din region."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% har blitt lagt til som venn i region %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% har blitt lagt til som venn i din region %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% er allerede lagt til som venn i %lang:region%."
|
||||
"addfriend-self": "Å legge til eieren av regionen som venn vil være meningsløst."
|
||||
"addfriend-noOwner": "Du kan ikke legge til venner i en region uten eier."
|
||||
"addfriend-notVisited": "Du kan ikke legge til %0% fordi h*n har ikke vært på serveren ennå."
|
||||
"delfriend-help": "/as delfriend <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"delfriend-noPermissionOther": "Du har ikke rettigheter til å fjerne venner fra regioner som ikke er dine."
|
||||
"delfriend-noPermission": "Du har ikke rettigheter til å fjerne venner fra din region."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% har blitt fjernet som venn fra region %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% har blitt fjernet som venn fra din region %lang:region%."
|
||||
"delfriend-noOwner": "Du kan ikke fjerne venner fra en region uten eier."
|
||||
"linksigns-multipleRegions": "Fant flere regioner: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Klikk en gang til for å prøve igjen eller bruk '/as linksigns' for å stoppe."
|
||||
"linksigns-noRegions": "Ingen AreaShop regioner funnet i rettningen du peker, vær sikker på at regionen er lagt til i AreaShop [gray](maksimal avstand 100 blokker)."
|
||||
"linksigns-regionFound": "Region %lang:region% har blitt funnet, nå pek på et skilt og venstreklikk for å koble sammen."
|
||||
"linksigns-signFound": "Fant et skilt ved (%0%, %1%, %2%), nå pek mot en region og høyreklikk for å koble sammen."
|
||||
"linksigns-noSign": "Ingen skilt funnet i rettningen du peker, vær sikker på at du har en ublokkert vei mot et skilt og klikk igjen [gray](maksimal avstand 100 blokker)."
|
||||
"linksigns-alreadyRegistered": "Det skiltet er allerede registrert til region %lang:region%, klikk igjen for å velge et annet skilt."
|
||||
"linksigns-first": "Du har aktivert skilt koblings modus."
|
||||
"linksigns-next": "[gray]Ventstreklikk for å velge et skilt, høyreklikk for å velge en region, bruk /as linksigns for å stoppe."
|
||||
"linksigns-noPermission": "Du har ikke rettigheter til å aktivere masse-skilt koblings modus."
|
||||
"linksigns-stopped": "Gått ut av skilt koblings modus."
|
||||
"stack-help":
|
||||
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
|
||||
- " [gray]<amount> Antall regioner som vil bli laget.[break]"
|
||||
- " [gray]<gap> Antall blokker mellom regioner.[break]"
|
||||
- " [gray]<name> Navnet på regioner (nummer kommer bak).[break]"
|
||||
- " [gray]<rent|buy> Bestem om dem skal leies eller kjøpes.[break]"
|
||||
- " [gray][group] En gruppe du vil legge dem til i.[break]"
|
||||
- " [gray]Regionene vil bli laget i rettningen du ser."
|
||||
"stack-accepted": "Begynner å lage %0% %1% regioner med %2% blokker mellom dem, navnene starter med %3% og vil ha nummer bak seg.%4%"
|
||||
"stack-addToGroup": "Regioner laget vil bli lagt til i gruppen '%0%'."
|
||||
"stack-noPermission": "Du har ikke rettigheter til å lage og legge til regioner i AreaShop i store mengder."
|
||||
"stack-wrongAmount": "'%0%' er ikke en riktig mengde regioner."
|
||||
"stack-wrongGap": "'%0%' er ikke et riktig nummer for antall blokker mellom regioner."
|
||||
"stack-noSelection": "Du har ikke laget en markering som indikerer hvor den første regionen skal bli laget."
|
||||
"stack-addStart": "[gray]Legger til %0% regioner på %1% per sekund."
|
||||
"setlandlord-help": "/as setlandlord <spiller> [region], regionen du står i vil bli brukt om ikke spesifisert."
|
||||
"setlandlord-noPermission": "Du har ikke rettigheter til å sette grunneier for en region."
|
||||
"setlandlord-success": "%lang:landlord% har vellykket blitt satt som grunneier av %lang:region%."
|
||||
"message-help": "/as message <spiller> <melding...>"
|
||||
"message-noPermission": "Du har ikke rettigheter til å sende AreaShop meldinger."
|
||||
"message-notOnline": "%0% er ikke pålogget."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Er du sikker på at du vil leie %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å leie %0%|%"
|
||||
- " hover: %lang:action|Lei %0%|%"
|
||||
- " kommando: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Er du sikker du vil forlenge %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å utvide leie %0%|%"
|
||||
- " hover: %lang:action|Utvid leie %0%|%"
|
||||
- " kommando: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Er du sikker du vil stoppe leie "
|
||||
- "%lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å stoppe leie %0%|%"
|
||||
- " hover: %lang:action|Stopp leie %0%|%"
|
||||
- " kommando: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Er du sikker du vil kjøpe %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å kjøpe %0%|%"
|
||||
- " hover: %lang:action|Kjøp %0%|%"
|
||||
- " kommando: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Er du sikker du vil selge %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klikk for å selge %0%|%"
|
||||
- " hover: %lang:action|Selg %0%|%"
|
||||
- " kommando: /areashop sell %0%"
|
||||
"timeleft-years": "%0% år"
|
||||
"timeleft-months": "%0% måneder"
|
||||
"timeleft-days": "%0% dager"
|
||||
"timeleft-hours": "%0% timer"
|
||||
"timeleft-minutes": "%0% minutter"
|
||||
"timeleft-second": "%0% sekund"
|
||||
"timeleft-seconds": "%0% sekunder"
|
||||
"timeleft-ended": "Utløpt"
|
||||
"greeting-forrent": "%region% kan bli leid for %price% per %duration%."
|
||||
"greeting-rented": "%region% er leid av %player% til %until%."
|
||||
"greeting-forsale": "%region% kan bli kjøpt for %price%."
|
||||
"greeting-bought": "%region% er kjøpt av %player%."
|
||||
@@ -0,0 +1,564 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Polish language file, plugin version 2.5.0, 428/428 messages are translated (100%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Użyj komendy %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Użyj %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Działka %0%"
|
||||
- " hover: %lang:action|Informacje o działce|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Gracz %0%"
|
||||
- " hover: %lang:action|Działki gracza %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Zarządca %landlord%"
|
||||
- " hover: %lang:action|Działki zarządcy %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Nie możesz posiadać większej ilości działek niż %0% (aktualnie posiadasz %1% w grupie '%2%')."
|
||||
"confirm-yes": " [gray]Kliknij aby %lang:command|potwierdzić|%0%|%[gray] lub powtórz komendę."
|
||||
"general-notReady": "Plugin AreaShop jeszcze się nie załadował, proszę czekać."
|
||||
"general-noWorld": "Nie możesz tego zrobić, świat działki %lang:region% jest teraz niedostępny (świat '%world%')."
|
||||
"general-noRegion": "Nie możesz tego zrobić, region pluginu WorldGuard jest teraz niedostępny (region %lang:region%)."
|
||||
"general-noEconomy": "Plugin ekonomii nie jest zainstalowany lub nie jest poprawnie skonfigurowany, skontaktuj się z wlaścicielem serwera."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Ta komenda nie istnieje, wpisz komendę '/as help' aby wyświetlić menu pomocy."
|
||||
"cmd-onlyByPlayer": "Tej komendy może użyć tylko gracz."
|
||||
"cmd-weOnlyByPlayer": "Tylko gracz może użyć zaznaczenia terenu w WorldEdit, podaj nazwę działki jako dodatkowy argument."
|
||||
"cmd-noSelection": "Nie zaznaczono terenu w WorldEdit."
|
||||
"cmd-noRegionsFound": "W twoim zaznaczeniu terenu nie znaleziono żadnej działki."
|
||||
"cmd-noWERegionsFound": "W twoim zaznaczeniu terenu nie znaleziono żadnego regionu WorldGuard."
|
||||
"cmd-notRegistered": "Region '%0%' nie jest zarejestrowany jako działka AreaShop."
|
||||
"cmd-noRegion": "Region '%0%' nie istnieje."
|
||||
"cmd-noRegionsAtLocation": "W Twojej pozycji nie znaleziono żadnego regionu, podaj nazwę regionu jako dodatkowy argument."
|
||||
"cmd-moreRegionsAtLocation": "W Twojej pozycji znaleziono więcej niż jeden region, podaj nazwę regionu jako dodatkowy argument."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Tylko gracz może automatycznie określić region, podaj nazwę regionu jako dodatkowy argument."
|
||||
"help-header": "Menu pomocy, komendy dostępne dla Ciebie."
|
||||
"help-noPermission": "Nie masz uprawnień do przeglądania menu pomocy."
|
||||
"help-alias": "Aliasy komend: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Wyświetl menu pomocy."
|
||||
"help-info": "%lang:helpCommand|/as info|% Wyświetl informacje o działkach."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Wynajmij działkę lub przedłuż czas jej wynajmu."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Kup działkę."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Zwolnij wynajętą działkę."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Sprzedaj działkę."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Przeładuj wszystkie pliki i zaktualizuj działki."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Ustaw status przywracania oraz wybierz jego profil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Zmień cenę działki."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Zmień okres wynajmu działki."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teleportuj się na działkę."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Ustaw miejsce teleportacji na działkę."
|
||||
"help-find": "%lang:helpCommand|/as find|% Znajdź najbliższą wolną działkę."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Dodaj działkę do grupy."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Usuń działkę z grupy."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Wyświetl listę grup."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Wyświetl informacje o grupie."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Wywołaj szablonowe wydarzenie dla działki."
|
||||
"help-add": "%lang:helpCommand|/as add|% Określ region jako działkę do wynajęcia lub na sprzedaż."
|
||||
"help-del": "%lang:helpCommand|/as del|% Usuń działkę."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Dodaj tabliczkę do istniejącej działki."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Usuń tabliczkę w zasięgu wzroku z istniejącej działki."
|
||||
"help-me": "%lang:helpCommand|/as me|% Wyświetl listę posiadanych działek (oraz czasy wynajmu)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Wyznacz posiadacza działki lub przedłuż wynajem."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Wprowadź działkę w status odsprzedaży."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Zaprzestaj odsprzedaży działki."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Dodaj gracza do działki."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Usuń gracza z działki."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Przełącz tryb łączenia tabliczki z działką."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Utwórz wiele działek jednocześnie."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Ustaw zarządcę działki."
|
||||
"help-import": "%lang:helpCommand|/as import|% Importuj regiony z RegionForSale."
|
||||
"rent-help": "Użycie: /as rent [działka]. Jeśli nie podano nazwy działki, wynajęta/przedłużona zostanie działka na której stoisz."
|
||||
"rent-noPermission": "Nie masz uprawnień do wynajmowania działek."
|
||||
"rent-maximum": "Nie możesz wynajmować więcej działek niż %0% (aktualnie wynajmujesz %1% w grupie '%2%')."
|
||||
"rent-maximumExtend": "Nie możesz przedłużyć wynajmu, ponieważ wynajmujesz już więcej działek niż %0% (aktualnie wynajmujesz %1% w grupie '%2%')."
|
||||
"rent-payError": "Wystąpił błąd z płatnością, spróbuj ponownie później."
|
||||
"rent-rented": "Wynajęto działkę %lang:region% na okres do dnia %until%. Możesz przedłużyć wynajem działki klikając PPM na powiązaną tabliczkę lub używając komendy /as rent."
|
||||
"rent-extended": "Przedłużono wynajem działki %lang:region% na okres do dnia %until%."
|
||||
"rent-extendedToMax": "Przedłużono wynajem działki %lang:region% na okres do dnia %until% (%maxrenttime% to maksymalny możliwy czas wynajmu działki)."
|
||||
"rent-lowMoneyExtend": "Nie masz wystarczającej ilości pieniędzy aby przedłużyć wynajem działki (na koncie masz %0%, a potrzebujesz %price%)."
|
||||
"rent-lowMoneyRent": "Nie masz wystarczającej ilości pieniędzy aby wynająć działkę %lang:region% (na koncie masz %0%, a potrzebujesz %price%)."
|
||||
"rent-someoneElse": "Działka %lang:region% została już wynajęta przez innego gracza."
|
||||
"rent-notRentable": "Ta działka nie jest możliwa do wynajęcia."
|
||||
"rent-maxExtends": "Nie możesz przedłużyć wynajmu tej działki (maksymalnie możesz to zrobić %maxextends% razy), ale możesz wynająć działkę %lang:region% ponownie po zakończeniu obecnego wynajmu."
|
||||
"rent-maxRentTime": "Nie możesz wynająć działki %lang:region% na dłużej. Maksymalny czas to %maxrenttime%, działkę wynajmujesz już na %timeleft%."
|
||||
"rent-restrictedToWorld": "Musisz znajdować się w świecie '%world%' aby wynająć działkę %lang:region% (obecnie znajdujesz się w świecie '%0%')."
|
||||
"rent-restrictedToRegion": "Musisz znajdować się na działce %lang:region% aby ją wynająć."
|
||||
"rent-expireWarning": "Wynajem działki %lang:region% zakończy się za %timeleft%, przedłuż wynajem jeśli wciąż chcesz wynajmować tę działkę."
|
||||
"rent-expiringSoon": "Wynajem działki %lang:tRegion|%0%|% zakończy się za %1%, przedłuż wynajem jeśli wciąż chcesz wynajmować tę działkę."
|
||||
"rent-alreadyAtFull": "Działka %lang:region% jest już wynajęta na maksymalny czas, jeszcze nie możesz przedłużyć jej wynajmu."
|
||||
"buy-help": "Użycie: /as buy [działka]. Jeśli nie podano nazwy działki, kupiona zostanie działka na której stoisz."
|
||||
"buy-noPermission": "Nie masz uprawnień do kupowania działek."
|
||||
"buy-noPermissionResell": "Nie masz uprawnień do odkupowania działek."
|
||||
"buy-noPermissionNoResell": "Nie masz uprawnień do kupowania nieodsprzedawanych działek."
|
||||
"buy-notBuyable": "Działka '%0%' nie jest dostępna do kupienia."
|
||||
"buy-maximum": "Nie możesz posiadać więcej działek niż %0% (posiadasz już %1% w grupie '%2%')."
|
||||
"buy-payError": "Wystąpił błąd z płatnością, spróbuj ponownie później."
|
||||
"buy-succes": "Kupiono działkę %lang:region%."
|
||||
"buy-successResale": "Odkupiono działkę %lang:region% od gracza %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Twoja działka %lang:region% została odsprzedana graczowi %lang:player% za %0%."
|
||||
"buy-lowMoney": "Nie masz wystarczającej ilości pieniędzy aby kupić działkę %lang:region% (masz %0%, a potrzebujesz %price%)."
|
||||
"buy-lowMoneyResell": "Nie masz wystarczającej ilości pieniędzy aby odkupić działkę %lang:region% (masz %0%, a potrzebujesz %resellprice%)."
|
||||
"buy-yours": "Już posiadasz działkę %lang:region%."
|
||||
"buy-someoneElse": "Działka %lang:region% została już wykupiona przez innego gracza."
|
||||
"buy-restrictedToWorld": "Musisz znajdować się w świecie '%world%' aby kupić działkę %lang:region% (obecnie znajdujesz się w świecie '%0%')."
|
||||
"buy-restrictedToRegion": "Musisz znajdować się na działce %lang:region% aby ją kupić."
|
||||
"unrent-help": "Użycie: /as unrent [działka]. Jeśli nie podano nazwy działki, zwolniona zostanie działka na której stoisz."
|
||||
"unrent-noPermission": "Nie masz uprawnień do zwalniania działek."
|
||||
"unrent-noPermissionOther": "Nie masz uprawnień do zwalniania cudzych działek."
|
||||
"unrent-notRegistered": "Nie istnieje działka do wynajęcia o takiej nazwie."
|
||||
"unrent-notRented": "Nie możesz zwolnić tej działki, ponieważ nie jest ona wynajmowana."
|
||||
"unrent-unrented": "Działka %lang:region% gracza %lang:player% została zwolniona."
|
||||
"unrent-expired": "Wynajem działki %lang:region% wygasł."
|
||||
"sell-help": "Użycie: /as sell [działka]. Jeśli nie podano nazwy działki, na sprzedaż zostanie wystawiona działka na której stoisz."
|
||||
"sell-notRegistered": "Nie istnieje działka na sprzedaż o takiej nazwie."
|
||||
"sell-notBought": "Ta działka nie może zostać sprzedana, ponieważ nie jest niczyją własnością."
|
||||
"sell-sold": "Działka %lang:region% gracza %lang:player% została sprzedana."
|
||||
"sell-noPermission": "Nie masz uprawnień do sprzedawania działek serwerowi."
|
||||
"sell-noPermissionOther": "Nie masz uprawnień do sprzedawania cudzych działek serwerowi."
|
||||
"sell-disabled": "Możliwość sprzedaży została wyłączona dla tej działki."
|
||||
"reload-reloading": "Przeładowano konfigurację pluginu i rozpoczęto aktualizowanie działek."
|
||||
"reload-noPermission": "Nie masz uprawnień do przeładowania konfiguracji pluginu."
|
||||
"reload-updateCommandChanged": "'/as updaterents' i '/as updatebuys' zostaly usuniete, '/as reload' tez odswieza regiony, wiec uzywaj teraz tej komendy."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
"info-noPermission": "Nie masz uprawnień do uzyskania informacji o działkach."
|
||||
"info-allHeader": "Lista wszystkich działek%0%:"
|
||||
"info-rentedHeader": "Lista wynajmowanych działek%0%:"
|
||||
"info-forrentHeader": "Lista działek do wynajęcia%0%:"
|
||||
"info-forsaleHeader": "Lista działek na sprzedaż%0%:"
|
||||
"info-soldHeader": "Lista sprzedanych działek%0%:"
|
||||
"info-resellingHeader": "Lista odsprzedawanych działek%0%:"
|
||||
"info-nogroupHeader": "Lista działek nieprzydzielonych do grupy%0%:"
|
||||
"info-limitedToGroup": " (ograniczona do grupy %0%)"
|
||||
"info-nogroupNone": "Wszystkie działki należą do grup."
|
||||
"info-noFiltergroup": "Grupa '%0%' nie istnieje."
|
||||
"info-noRegions": "Nie znaleziono żadnej działki."
|
||||
"info-wrongPage": "'%0%' nie jest poprawnym numerem strony."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka do wynajęcia za %price% na %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka wynajęta przez gracza %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka na sprzedaż za %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka kupiona przez gracza %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Działka kupiona przez gracza %lang:player%, obecnie odsprzedawana."
|
||||
"info-pageStatus": "[gold]Strona %0%/%1%"
|
||||
"info-pagePrevious":
|
||||
- " [gold][bold]◄Poprzednia[/bold] "
|
||||
- " hover: %lang:action|Wyświetl poprzednią stronę|%"
|
||||
- " command: %0%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Poprzednia[/bold] "
|
||||
- " hover: Jesteś już na pierwszej stronie"
|
||||
"info-pageNext":
|
||||
- " [gold][bold]Następna►[/bold]"
|
||||
- " hover: %lang:action|Wyświetl następną stronę|%"
|
||||
- " command: %0%"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Nastepna►[/bold]"
|
||||
- " hover: Jesteś już na ostatniej stronie"
|
||||
"info-playerHelp": "Użycie: /as info player <nick>."
|
||||
"info-playerRents": "Działki wynajęte przez gracza %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "Gracz %lang:tPlayer|%0%|% nie wynajął żadnej działki."
|
||||
"info-playerBuys": "Dzialki kupione przez gracza %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "Gracz %lang:tPlayer|%0%|% nie kupił żadnej działki."
|
||||
"info-regionHelp": "Użycie: /as info region [działka]. Jeśli nie podano nazwy działki, zostaną wyświetlone informacje o działce na której stoisz."
|
||||
"info-regionHeaderRent": "[darkgreen]Informacje o działce %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Informacje o działce %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Działka wynajęta przez gracza %lang:player% na okres do dnia [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Działka kupiona przez gracza %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Działka kupiona przez gracza %lang:player%, obecnie odsprzedawana."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Przedłużenie wynajmu za[/bold]"
|
||||
- " hover: Przedłuż wynajem działki %region%"
|
||||
- " hover: o %duration% za %price%"
|
||||
- " hover: %lang:action|Przedłuż wynajem działki %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% o %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Wynajem działki za[/bold]"
|
||||
- " hover: Wynajmij działkę %region% za %price% na %duration%"
|
||||
- " hover: %lang:action|Wynajmij działkę %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% na %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Kupno działki za[/bold]"
|
||||
- " hover: Kup działkę %region% za %price%"
|
||||
- " hover: %lang:action|Kup działkę %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Cena odkupienia: [gray]%resellprice% (możesz odkupić tę działkę od gracza %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Dodani gracze: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Działka %region%"
|
||||
- " hover: %lang:action|Usuń gracza %0% z działki|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Zwrot przy sprzedaży: [gray]%moneyback% (%moneybackpercent%% ceny)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Zwrot przy sprzedaży[/bold]"
|
||||
- " hover: Sprzedaj działkę %region% i otrzymaj zwrot %moneyback%"
|
||||
- " hover: %lang:action|Sprzedaj działkę %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% ceny)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Zwrot przy zwolnieniu: [gray]%moneyback% (%moneybackpercent%% pozostałego czasu)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Zwrot przy zwolnieniu[/bold]"
|
||||
- " hover: Zwolnij działkę %region% i otrzymaj zwrot %moneyback%"
|
||||
- " hover: %lang:action|Zwolnij działkę %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% pozostałego czasu)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Wynajem działki możesz przedłużyć maksymalnie [gray]%maxextends% raz(y)."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Wynajem działki nie może zostać przedłużony."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Możesz przedłużyć wynajem jeszcze [gray]%extendsleft% raz(y) na %maxextends% możliwych."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Maksymalny czas wynajmu to [gray]%maxrenttime%."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Teleportuj na działkę[/bold]"
|
||||
- " hover: %lang:action|Teleportuj się na działkę %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]Ustaw miejsce teleportacji[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Ustaw miejsce teleportacji na działkę|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Powiązane tabliczki: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Przydzielone grupy: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Działka zostanie zwolniona automatycznie po okresie nieaktywności gracza równym [gray]%inactivetime%."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Działka automatycznie wejdzie w odsprzedaż po okresie nieaktywności gracza równym [gray]%inactivetime%."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Musisz znajdować się na działce %lang:region% aby ją wynająć."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Musisz znajdować się w świecie '%world%' aby wynająć działkę %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Musisz znajdować się na działce %lang:region% aby ją kupić."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Musisz znajdować się w świecie '%world%' aby kupić działkę %lang:region%."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Przywracanie aktywne [gray](działka zostanie zresetowana przy zwolnieniu)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Przywracanie aktywne [gray](działka zostanie zresetowana przy sprzedaży)."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Zarządca: [gray]%lang:landlord% (otrzymuje pieniądze)."
|
||||
"info-regionNotExisting": "Działka %0% nie istnieje."
|
||||
"setrestore-help": "Użycie: /as setrestore <działka> <true|false|general> [profil]."
|
||||
"setrestore-noPermission": "Nie masz uprawnień do zmiany ustawień przywracania."
|
||||
"setrestore-notRegistered": "Działka %0% nie istnieje."
|
||||
"setrestore-invalidSetting": "'%0%' nie jest poprawnym argumentem. Użyj jednego z argumentów: true/false/general."
|
||||
"setrestore-success": "Pomyślnie ustawiono status przywracania działki %lang:region% do wartości '%0%'."
|
||||
"setrestore-successProfile": "Pomyślnie ustawiono status przywracania działki %lang:region% do wartości '%0%' oraz profil '%1%'."
|
||||
"setprice-noPermission": "Nie masz uprawnień do zmiany ceny działki."
|
||||
"setprice-help": "Użycie: /as setprice <cena> [działka]. Jeśli nie podano nazwy działki, zostanie zmieniona cena działki na której stoisz."
|
||||
"setprice-notRegistered": "Działka %0% nie istnieje."
|
||||
"setprice-wrongPrice": "'%0%' nie jest poprawną ceną."
|
||||
"setprice-successRent": "Cena działki %lang:region% została zmieniona na: %price% na %duration%."
|
||||
"setprice-successBuy": "Cena działki %lang:region% została zmieniona na %price%."
|
||||
"setprice-successRemoved": "Cena działki %lang:region% została usunięta. Ustawiono domyślną cenę: %price%."
|
||||
"setprice-noLandlord": "Nie masz uprawnień do zmiany ceny działki %lang:region%, ponieważ nie jesteś jej zarządcą."
|
||||
"setduration-noPermission": "Nie masz uprawnień do zmiany długości okresu wynajmu działki."
|
||||
"setduration-help": "Użycie: /as setduration <ilość> <jednostka> [działka]. Jeśli nie podano nazwy działki, zostanie zmieniona długość okresu wynajmu działki na której stoisz."
|
||||
"setduration-notRegistered": "Działka %0% nie jest działką do wynajęcia."
|
||||
"setduration-wrongAmount": "'%0%' nie jest liczbą całkowitą."
|
||||
"setduration-wrongFormat": "'%0%' nie jest poprawną jednostką czasu."
|
||||
"setduration-success": "Okres wynajmu działki %lang:region% został zmieniony na '%duration%'."
|
||||
"setduration-noLandlord": "Nie masz uprawnień do zmiany długości okresu wynajmu działki %lang:region%, ponieważ nie jesteś jej zarządcą."
|
||||
"setduration-successRemoved": "Okres wynajmu działki %lang:region% został usunięty. Ustawiono domyślny okres wynajmu: %duration%."
|
||||
"setup-noRegion": "W 2. linijce wymagana jest nazwa działki."
|
||||
"setup-alreadyRentSign": "Działka jest już określona jako do wynajęcia. Aby dodać tabliczkę, utwórz nową z tekstem '[as]' w 1. linijce lub użyj komendy '/as addsign'."
|
||||
"setup-alreadyOtherWorld": "Region który wybrałeś jest już dodany do AreaShop w innym świecie, regiony z innych światów potrzebują innych nazw."
|
||||
"setup-alreadyBuySign": "Działka jest już określona jako na sprzedaż. Aby dodać tabliczkę, utwórz nową z tekstem '[as]' w 1. linijce lub użyj komendy '/as addsign'."
|
||||
"setup-noDuration": "W 3. linijce jest wymagany okres wynajmu."
|
||||
"setup-wrongDuration": "Podano niepoprawny okres wynajmu. Przykład: 1 d."
|
||||
"setup-noPrice": "W 4. linijce wymagana jest cena wynajmu."
|
||||
"setup-wrongPrice": "Podano niepoprawną cenę, użyj tylko cyfr."
|
||||
"setup-rentSuccess": "Działka %lang:region% została poprawnie ustawiona jako do wynajęcia."
|
||||
"setup-buySuccess": "Działka %lang:region% została poprawnie ustawiona jako na sprzedaż."
|
||||
"setup-noPermissionRent": "Nie masz uprawnień do ustawiania działek do wynajęcia."
|
||||
"setup-noPermissionBuy": "Nie masz uprawnień do ustawiania działek na sprzedaż."
|
||||
"setup-couldNotDetect": "Znaleziono więcej niż jeden region o tym samym priorytecie bądź relacji parent-child. Podaj nazwę odpowiedniego regionu w 2. linijce (2 znalezione regiony: %lang:tRegion|%0%|% i %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "Region %0% znajduje się na czarnej liście, dlatego nie może zostać ustawiony jako działka."
|
||||
"setup-noPermission": "Nie masz uprawnień aby ustawić działkę o regionie '%0%' bądź nie jesteś jego memberem/ownerem."
|
||||
"destroy-noPermissionRent": "Nie masz uprawnień do usuwania działek do wynajęcia."
|
||||
"destroy-noPermissionBuy": "Nie masz uprawnień do usuwania działek na sprzedaż."
|
||||
"destroy-successRent": "Działka %lang:region% została usunięta."
|
||||
"destroy-successBuy": "Działka %lang:region% została usunięta."
|
||||
"teleport-help": "Użycie: /as tp <działka> [tabliczka]."
|
||||
"teleport-noRentOrBuy": "Działka %0% nie istnieje."
|
||||
"teleport-noPermission": "Nie masz uprawnień do teleportowania się do swoich działek."
|
||||
"teleport-noPermissionOther": "Nie masz uprawnień do teleportowania się do cudzych działek."
|
||||
"teleport-noPermissionSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do swoich działek."
|
||||
"teleport-noPermissionOtherSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do cudzych działek."
|
||||
"teleport-noPermissionFriend": "Nie masz uprawnień do teleportowania się do działek, do których Cię dodano."
|
||||
"teleport-noPermissionFriendSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do działek, do których Cię dodano."
|
||||
"teleport-noPermissionAvailable": "Nie masz uprawnień do teleportowania się do dostępnych działek."
|
||||
"teleport-noPermissionAvailableSign": "Nie masz uprawnień do teleportowania się do tabliczek należących do dostępnych działek."
|
||||
"teleport-success": "Teleportowano do działki %lang:region%."
|
||||
"teleport-successSign": "Teleportowano do tabliczki należącej do działki %lang:region%."
|
||||
"teleport-noSafe": "Nie znaleziono bezpiecznego miejsca do teleportacji na działce %lang:region% bądź przekroczono ilość prób teleportacji (%0%/%1%)."
|
||||
"teleport-blocked": "Nie możesz się teleportować ponieważ cel jest poza działką, a musisz teleportować się wewnątrz działki."
|
||||
"teleport-changedToSign": "Nie masz uprawnień do teleportacji na działkę. Teleportowano do tabliczki."
|
||||
"teleport-changedToNoSign": "Nie znaleziono żadnej dostępnej tabliczki, nastąpiła próba teleportacji na działkę"
|
||||
"teleport-wrongWorld": "Musisz znajdować się w świecie '%world%' aby teleportować się na działkę %lang:region%, a znajdujesz się obecnie w świecie '%0%'."
|
||||
"setteleport-help": "Użycie: /as settp [działka] [reset]. Jeśli nie podano nazwy działki, zostanie ustawione miejsce teleportacji na działkę na której stoisz."
|
||||
"setteleport-noPermission": "Nie masz uprawnień do ustawiania miejsc teleportacji na działki."
|
||||
"setteleport-noPermissionOther": "Nie masz uprawnień do ustawiania miejsc teleportacji na cudze działki."
|
||||
"setteleport-noRentOrBuy": "Działka %0% nie istnieje."
|
||||
"setteleport-success": "Pomyślnie ustawiono miejsce teleportacji na działkę %lang:region%."
|
||||
"setteleport-notInside": "Miejsce teleportacji musi zostać ustalone w obrębie działki."
|
||||
"setteleport-reset": "Miejsce teleportacji na działkę %lang:region% zostało zresetowane."
|
||||
"find-help": "Użycie: /as find <buy|rent> [maksymalnaCena] [grupa]."
|
||||
"find-noPermission": "Nie masz uprawnień do wyszukiwania działek."
|
||||
"find-success": "Znaleziono działkę typu '%0%': %lang:region% przy uwzględnieniu maksymalnej ceny równej Twojemu stanowi konta: %1%%2%."
|
||||
"find-successMax": "Znaleziono działkę typu '%0%': %lang:region% przy uwzględnieniu podanej maksymalnej ceny równej %1%%2%."
|
||||
"find-wrongMaxPrice": "Wpisana maksymalna cena '%0%' nie jest poprawną ceną."
|
||||
"find-wrongGroup": "Grupa %0% nie istnieje."
|
||||
"find-noneFound": "Nie znaleziono żadnej działki typu '%0%' przy uwzględnieniu maksymalnej ceny równej Twojemu stanowi konta: %1%%2%."
|
||||
"find-noneFoundMax": "Nie znaleziono żadnej działki typu '%0%' przy uwzględnieniu podanej maksymalnej ceny równej %1%%2%."
|
||||
"find-onlyInGroup": ", szukano tylko działek należących do grupy %0%."
|
||||
"groupadd-help": "Użycie: /as groupadd <grupa> [działka]. Jeśli nie podano nazwy działki, do grupy zostaną dodane wszystkie działki zawarte w Twoim zaznaczeniu terenu."
|
||||
"groupadd-noPermission": "Nie masz uprawnień do dodawania działek do grup."
|
||||
"groupadd-success": "Działka %lang:region% została pomyślnie dodana do grupy '%0%', do grupy należą teraz działki w liczbie %1%."
|
||||
"groupadd-failed": "Działka %lang:region% należy już do grupy '%0%'."
|
||||
"groupadd-weSuccess": "Działki dodane do grupy %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Działki, które były już w grupie %0%: [gray]%1%."
|
||||
"groupdel-help": "Użycie: /as groupdel <grupa> [działka]. Jeśli nie podano nazwy działki, z grupy zostaną usunięte wszystkie działki zawarte w Twoim zaznaczeniu terenu."
|
||||
"groupdel-noPermission": "Nie masz uprawnień do usuwania działek z grup."
|
||||
"groupdel-wrongGroup": "Grupa %0% nie istnieje, wpisz komendę '/as grouplist' aby wyświetlić listę grup."
|
||||
"groupdel-success": "Działka %lang:region% została pomyślnie usunięta z grupy '%0%', do grupy należą teraz działki w liczbie %1%."
|
||||
"groupdel-failed": "Działka %lang:region% nie należy do grupy '%0%'."
|
||||
"groupdel-weSuccess": "Działki usunięte z grupy %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Działki, które nie były w grupie %0%: [gray]%1%."
|
||||
"grouplist-noPermission": "Nie masz uprawnień do wyświetlania listy istniejących grup."
|
||||
"grouplist-noGroups": "Nie istnieje żadna grupa."
|
||||
"grouplist-success": "Istnieją następujące grupy: [gray]%0%."
|
||||
"groupinfo-help": "Użycie: /as groupinfo <grupa>."
|
||||
"groupinfo-noPermission": "Nie masz uprawnień do wyświetlania informacji o grupach."
|
||||
"groupinfo-noGroup": "Grupa '%0%' nie istnieje, użyj komendy /as grouplist aby wyświetlić listę istniejących grup."
|
||||
"groupinfo-members": "Do grupy %0% należą następujące działki: [gray]%1%."
|
||||
"groupinfo-noMembers": "Do grupy %0% nie należy żadna działka."
|
||||
"schemevent-help": "Użycie: /as schemevent <działka> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Wydarzenie '%0%' nie istnieje, wywołaj jedno z następujących wydarzeń: [gray]%1%."
|
||||
"schemevent-success": "Wydarzenie '%0%' zostało pomyślnie wywołane dla działki %lang:region%."
|
||||
"schemevent-noPermission": "Nie masz uprawnień do wywoływania wydarzeń."
|
||||
"add-help": "Użycie: /as add <rent|buy> [działka] [świat]."
|
||||
"add-noPermission": "Nie masz uprawnień do ustawiania działek."
|
||||
"add-success": "Pomyślnie ustawiono jako działka '%0%' regiony: [gray]%1%."
|
||||
"add-failed": "Regiony wcześniej zarejestrowane jako działki: [gray]%0%."
|
||||
"add-failedOtherWorld": "Region zarejestrowany w innym świecie: [gray] %0%."
|
||||
"add-blacklisted": "Na czarnej liście: [gray]%0%."
|
||||
"add-specifyWorld": "Używając konsoli musisz sprecyzować świat regionu."
|
||||
"add-incorrectWorld": "Świat '%0%' nie istnieje, zwróć uwagę na wielkość liter."
|
||||
"add-noPermissionRegions": "Brak uprawnień do rejestracji tych regionów: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Nie masz uprawnień do ustawiania cudzych regionów jako działek."
|
||||
"del-noPermission": "Nie masz uprawnień do usuwania działek."
|
||||
"del-success": "Usunięto działki: [gray]%0%."
|
||||
"del-failed": "Brak uprawnień do odrejestrowania działek (lub działki nie istnieją): [gray]%0%."
|
||||
"addsign-help": "Użycie: /as addsign [działka] [profil]."
|
||||
"addsign-noSign": "Nie patrzysz na żadną tabliczkę."
|
||||
"addsign-noRegions": "Nie znaleziono żadnej działki w pozycji tabliczki."
|
||||
"addSign-notRegistered": "Regiony, które nie są zarejestrowane jako działki: %0% (regiony najpierw muszą zostać dodane, zanim będzie możliwe dodanie tabliczki)."
|
||||
"addsign-couldNotDetect": "Znaleziono więcej niż jedną działkę w obrębie tabliczki, podaj nazwę działki jako dodatkowy argument (2 znalezione działki: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Znaleziono więcej niż jedną działkę w obrębie tabliczki, podaj nazwę odpowiedniej działki w 2. linijce (2 znalezione działki: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Podany profil nie istnieje, użyj jednego z następujących: [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Profil %0%"
|
||||
- " hover: %lang:action|Użyj tego profilu|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "Tabliczka została pomyślnie dodana do działki %lang:region%."
|
||||
"addsign-successProfile": "Tabliczka została pomyślnie dodana do działki %lang:region% o profilu %0%."
|
||||
"addsign-alreadyRegistered": "Ta tabliczka jest już dodana do działki %lang:region%."
|
||||
"addsign-noPermission": "Nie masz uprawnień do dodawania tabliczek do działek."
|
||||
"delsign-noSign": "Nie patrzysz na żadną tabliczkę."
|
||||
"delsign-noPermission": "Nie masz uprawnień do usuwania tabliczek z działek."
|
||||
"delsign-noRegion": "Ta tabliczka nie należy do żadnej działki."
|
||||
"delsign-success": "Tabliczka została pomyślnie usunięta z działki %lang:region%."
|
||||
"me-noPermission": "Nie masz uprawnień do sprawdzenia stanu swoich działek."
|
||||
"me-header": "Działki gracza %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Tylko gracze mogą mieć działki."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "Wygasa za %timeleft%"
|
||||
- " hover: do %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "należy do gracza %lang:player%"
|
||||
- " hover: Dodano Cię do tej działki"
|
||||
- ")."
|
||||
"me-nothing": "Gracz %lang:tPlayer|%0%|% nie posiada żadnej działki ani nie jest do żadnej dodany."
|
||||
"me-noPlayer": "Nie znaleziono gracza %0%, zwróć uwagę na wielkość liter."
|
||||
"me-clickHint": "[gray][italic]Kliknij na nazwę działki, aby wyświetlić informacje o niej."
|
||||
"setowner-help": "Użycie: /as setowner <nick> [działka]. Jeśli nie podano nazwy działki, zostanie ustawiony właściciel/najemca działki na której stoisz."
|
||||
"setowner-noPermission": "Nie masz uprawnień do ustawiania właścicieli/najemców działek."
|
||||
"setowner-noPermissionRent": "Nie masz uprawnień do ustawiania najemców działek."
|
||||
"setowner-noPermissionBuy": "Nie masz uprawnień do ustawiania właścicieli działek."
|
||||
"setowner-notRegistered": "Podana działka nie istnieje."
|
||||
"setowner-noPlayer": "Nie udało się uzyskać UUID podanego gracza: %0%."
|
||||
"setowner-succesRent": "Pomyślnie ustawiono gracza %lang:player% jako najemcę działki %lang:region%, czas wynajmu kończy się %until% (pozostały czas to %timeleft%)."
|
||||
"setowner-succesRentExtend": "Gracz %lang:player% jest już najemcą tej działki, więc przedłużono czas wynajmu o %duration%, obecny czas wynajmu kończy się %until% (pozostały czas to %timeleft%)."
|
||||
"setowner-succesBuy": "Pomyślnie ustawiono gracza %lang:player% jako właściciela działki %lang:region%."
|
||||
"resell-help": "Użycie: /as resell <cena> [działka]. Jeśli nie podano nazwy działki, w status odsprzedaży wejdzie działka na której stoisz."
|
||||
"resell-wrongPrice": "'%0%' nie jest poprawną ceną."
|
||||
"resell-notRegistered": "Działka %0% nie istnieje."
|
||||
"resell-notBought": "Działka %lang:region% nie może wejść w status odsprzedaży, ponieważ nie została jeszcze kupiona."
|
||||
"resell-success": "Działka %lang:region% pomyślnie weszła w status odsprzedaży. Cena odkupienia: %resellprice%."
|
||||
"resell-noPermission": "Nie masz uprawnień do odsprzedawania swoich działek."
|
||||
"resell-noPermissionOther": "Nie masz uprawnień do odsprzedawania cudzych działek."
|
||||
"resell-disabled": "Możliwość odsprzedaży została wyłączona dla tej działki."
|
||||
"stopresell-help": "Użycie: /as stopresell [działka]. Jeśli nie podano nazwy działki, zostanie zaprzestana odsprzedaż działki na której stoisz."
|
||||
"stopresell-notRegistered": "Działka %0% nie istnieje."
|
||||
"stopresell-notResell": "Nie możesz zaprzestać odsprzedaży działki %lang:region%, ponieważ nie jest ona odsprzedawana."
|
||||
"stopresell-success": "Pomyślnie zaprzestano odsprzedaży działki %lang:region%."
|
||||
"stopresell-noPermission": "Nie masz uprawnień do zaprzestawania odsprzedaży swoich działek."
|
||||
"stopresell-noPermissionOther": "Nie masz uprawnień do zaprzestawania odsprzedaży cudzych działek."
|
||||
"addfriend-help": "Użycie: /as addfriend <nick> [działka]. Jeśli nie podano nazwy działki, podany gracz zostanie dodany do działki na której stoisz."
|
||||
"addfriend-noPermissionOther": "Nie masz uprawnień do dodawania graczy do cudzych działek."
|
||||
"addfriend-noPermission": "Nie masz uprawnień do dodawania graczy do swoich działek."
|
||||
"addfriend-successOther": "Gracz %lang:tPlayer|%0%|% został pomyślnie dodany do działki %lang:region%."
|
||||
"addfriend-success": "Dodano gracza %lang:tPlayer|%0%|% do działki %lang:region%."
|
||||
"addfriend-alreadyAdded": "Gracz %lang:tPlayer|%0%|% jest już dodany do działki %lang:region%."
|
||||
"addfriend-self": "Niemożliwe jest dodanie do działki jej właściciela/najemcy."
|
||||
"addfriend-noOwner": "Niemożliwe jest dodanie gracza do niczyjej działki."
|
||||
"addfriend-notVisited": "Nie możesz dodać gracza %0%, ponieważ nigdy nie pojawił się na serwerze."
|
||||
"delfriend-help": "Użycie: /as delfriend <nick> [działka]. Jeśli nie podano nazwy działki, podany gracz zostanie usunięty z działki na której stoisz."
|
||||
"delfriend-noPermissionOther": "Nie masz uprawnień do usuwania graczy z cudzych działek."
|
||||
"delfriend-noPermission": "Nie masz uprawnień do usuwania graczy ze swoich działek."
|
||||
"delfriend-successOther": "Gracz %lang:tPlayer|%0%|% został pomyślnie usunięty z działki %lang:region%."
|
||||
"delfriend-success": "Usunięto gracza %lang:tPlayer|%0%|% z działki %lang:region%."
|
||||
"delfriend-notAdded": "Gracz %lang:tPlayer|%0%|% nie jest dodany do działki %lang:region%."
|
||||
"delfriend-noOwner": "Niemożliwe jest usunięcie gracza z niczyjej działki."
|
||||
"linksigns-multipleRegions": "Znaleziono następujące działki: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Kliknij LPM ponownie lub użyj komendy '/as linksigns' aby wyłączyć tryb wiązania tabliczki z działką."
|
||||
"linksigns-noRegions": "Nie znaleziono żadnej działki w kierunku, na który patrzysz, upewnij się, że region został ustawiony jako działka [gray](maksymalny zasięg to 100 bloków)."
|
||||
"linksigns-regionFound": "Zaznaczono działkę %lang:region, teraz zaznacz tabliczkę klikając na nią LPM aby ją połączyć z działką."
|
||||
"linksigns-signFound": "Zaznaczono tabliczkę na pozycji (%0%, %1%, %2%), teraz zaznacz działkę klikając PPM w kierunku jej obszaru."
|
||||
"linksigns-noSign": "Nie znaleziono żadnej tabliczki w kierunku, na który patrzysz, upewnij się, że patrzysz prosto na tabliczkę [gray](maksymalny zasięg to 100 bloków)."
|
||||
"linksigns-alreadyRegistered": "Znaleziona tabliczka jest już dodana do działki %lang:region%, kliknij jeszcze raz aby dodać inną tabliczkę."
|
||||
"linksigns-first": "Włączono tryb wiązania tabliczki z działką."
|
||||
"linksigns-next": "Kliknij LPM aby zaznaczyć tabliczkę, kliknij PPM aby zaznaczyć działkę, użyj komendy /as linksigns aby wyjść z trybu."
|
||||
"linksigns-noPermission": "Nie masz uprawnień do wejścia w trym wiązania tabliczki z działką."
|
||||
"linksigns-stopped": "Wyłączono tryb wiązania tabliczki z działką."
|
||||
"stack-help":
|
||||
- "Użycie: /as stack <ilość> <X> <nazwa> <rent|buy> [grupa].[break]"
|
||||
- " [gray]<ilosć> Ilość działek do ustawienia.[break]"
|
||||
- " [gray]<X> Dystans X bloków pomiędzy działkami.[break]"
|
||||
- " [gray]<nazwa> Nazwa działki (jej numer nastąpi po nazwie).[break]"
|
||||
- " [gray]<rent|buy> Określ działki jako do wynajęcia lub na sprzedaż.[break]"
|
||||
- " [gray][group] Grupa, do której zostaną przydzielone działki.[break]"
|
||||
- " [gray]Działki będą tworzone w kierunku, na który patrzysz."
|
||||
"stack-accepted": "Rozpoczęto ustawianie %0% działek typu '%1%' w odstępie %2% bloków od siebie, nazwy działek będą zaczynały się od %3% oraz kończyły odpowiednią liczbą w kolejności.%4%"
|
||||
"stack-addToGroup": "Działki zostaną przydzielone do grupy '%0%'."
|
||||
"stack-noPermission": "Nie masz uprawnień do masowego ustawiania działek."
|
||||
"stack-wrongAmount": "'%0%' nie jest poprawną ilością działek."
|
||||
"stack-wrongGap": "'%0%' nie jest poprawną liczbą bloków odstępu pomiędzy działkami."
|
||||
"stack-noSelection": "Nie został zaznaczony pierwszy region, od którego ma zostać rozpoczęte ustawianie działek."
|
||||
"stack-addStart": "[gray]Ustawianie %0% działek w tempie %1% na sekundę."
|
||||
"stack-addComplete": "[gray]Ustawiono działki w liczbie %0% o typie '%1%'."
|
||||
"stack-tooHigh": ", %0% działek zostało pominiętych z powodu ich wysokości większej niż Y=256."
|
||||
"stack-tooLow": ", %0% działek zostało pominiętych z powodu ich wysokości mniejszej niż Y=0."
|
||||
"stack-unclearDirection": "Patrz dokładnie na jeden z 6 kierunków: północ, południe, wschód, zachód, góra, dół; obecnie wykryto kierunek '%0%'."
|
||||
"setlandlord-help": "Użycie: /as setlandlord <nick> [działka]. Jeśli nie podano nazwy działki, zostanie ustawiony zarządca działki na której stoisz."
|
||||
"setlandlord-noPermission": "Nie masz uprawnień do ustawiania zarządców działek."
|
||||
"setlandlord-success": "Gracz %lang:landlord% został pomyślnie ustalony zarządcą działki %lang:region%."
|
||||
"message-help": "Użycie: /as message <nick> <treść>."
|
||||
"message-noPermission": "Nie masz uprawnień do wysyłania wiadomości AreaShop."
|
||||
"message-notOnline": "Gracz %0% jest nieobecny."
|
||||
"import-help": "Użycie: /as import RegionForSale."
|
||||
"import-wrongSource": "Sprezycuj skąd chcesz zaimportować dane, opcje: RegionForSale."
|
||||
"import-noPluginFolder": "Nie znaleziono folderu %0%, upewnij się, że importujesz dane z poprawnego źródła."
|
||||
"import-noWorldsFolder": "Nie istnieje folder 'plugins/RegionForSale/worlds', więc nic nie mogło zostać zaimportowane."
|
||||
"import-confirm": "Jesteś pewny/a, że chcesz zaimportować wszystkie regiony z RegionForSale?"
|
||||
"import-start": "Rozpoczęto import danych z RegionForSale:"
|
||||
"import-doWorld": "[darkgreen][bold]► Świat %0%:"
|
||||
"import-noBukkitWorld": "[red]Nie znaleziono świata w Bukkicie."
|
||||
"import-noRegionManager": "[red]Nie znaleziono RegionManagera z pluginu WorldGuard, czy regiony są włączone w tym świecie?"
|
||||
"import-noRegions": "[red]Nie znaleziono pliku regions.yml."
|
||||
"import-loadRegionsFailed": "[red]Nie udało się załadować pliku regions.yml w: %0%"
|
||||
"import-invalidRegionSection": "[red]Niepoprawna sekcja w pliku regions.yml: %0%."
|
||||
"import-noWorldGuardRegion": "[red]Nie znaleziono regionu WorldGuard: %0%."
|
||||
"import-noWorldGuardRegionParent": "[red]Nie znaleziono regionu WorldGuard podpiętego pod inny region: %0%."
|
||||
"import-buyAndRent": "[gold]Działka %0% może zostać kupiona oraz wynajęta, ustawianie działki jako do kupienia (nie może mieć dwóch typów jednocześnie)."
|
||||
"import-noBuyAndNoRent": "[red]Działka %0% nie może zostać ani kupiona, ani wynajęta, pomijanie importu."
|
||||
"import-imported": "[green]Działka %lang:tRegion|%0%|% zaimportowana."
|
||||
"import-loadWorldConfigFailed": "[red]Wystąpił błąd podczas ładowania pliku świata config.yml: %0%."
|
||||
"import-improperParentRegion": "[red]Parametry regionu %0% nie mogą zostać odczytane."
|
||||
"import-alreadyAdded": "[red]Region '%0%' już został dodany."
|
||||
"import-alreadyAddedOtherWorld": "[red]Region '%0%' został już ustawiony jako działka w świecie %1%, działki w różnych światach nie mogą mieć tej samej nazwy."
|
||||
"import-invalidSignLocation": "[red]Nie udało się zaimportować tabliczki działki '%0%', błędna pozycja: '%1%'."
|
||||
"import-signAlreadyAdded": "[red]Pominięto dodanie tabliczki w pozycji '%1%' do działki '%0%', jest ona już dodana do działki '%2%'."
|
||||
"import-moneyBackFailed": "[red]Nie udało się załadować ceny kupna '%0%' oraz ceny sprzedaży '%1%' aby ustawić procent zwrotu przy sprzedaży."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Czy na pewno chcesz wynająć działkę %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby wynająć %0%|%"
|
||||
- " hover: %lang:action|Wynajmij działkę %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Czy na pewno chcesz przedłużyć wynajem działki %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby przedłużyć wynajem działki %0%|%"
|
||||
- " hover: %lang:action|Przedłuż wynajem działki %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Czy na pewno chcesz zwolnić działkę %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby zwolnić działkę %0%|%"
|
||||
- " hover: %lang:action|Zwolnij działkę %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Czy na pewno chcesz kupić działkę %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby kupić działkę %0%|%"
|
||||
- " hover: %lang:action|Kup działkę%0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Czy na pewno chcesz sprzedać działkę %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Kliknij aby sprzedać działkę %0%|%"
|
||||
- " hover: %lang:action|Sprzedaj działkę %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% lat"
|
||||
"timeleft-months": "%0% miesięcy"
|
||||
"timeleft-days": "%0% dni"
|
||||
"timeleft-hours": "%0% godzin"
|
||||
"timeleft-minutes": "%0% minut"
|
||||
"timeleft-second": "%0% sekunda"
|
||||
"timeleft-seconds": "%0% sekund"
|
||||
"timeleft-ended": "Upłynął"
|
||||
"greeting-forrent": "Wynajmij działkę %region% za %price% na %duration%."
|
||||
"greeting-rented": "Działka %region% wynajęta przez gracza %player% do %until%."
|
||||
"greeting-forsale": "Kup działkę %region% za %price%."
|
||||
"greeting-bought": "Działka %region% kupiona przez gracza %player%."
|
||||
"greeting-resale": "Odkup działkę %region% za %resellprice% od gracza %player%."
|
||||
"update-playerNotify":
|
||||
- "[darkgreen]Dostępna jest aktualizacja pluginu AreaShop z wersji V%0% na wersję V%1%. Pobierz najnowszą wersję ze strony "
|
||||
- "[bold]Spigota[/bold]"
|
||||
- " hover: %lang:action|Przejdź do strony pluginu na Spigocie|%"
|
||||
- " link: https://www.spigotmc.org/resources/areashop.2991/"
|
||||
- " (i pozostaw recenzję pluginu)."
|
||||
@@ -0,0 +1,525 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Russian language file, plugin version 2.5.0, 395/428 messages are translated (92%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Используй %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Используй %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Регион %0%"
|
||||
- " hover: %lang:action|Информация о регионе|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Игрок %0%"
|
||||
- " hover: %lang:action|Регионы %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Владелец %landlord%"
|
||||
- " hover: %lang:action|Регионы %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Вы не можете арендовать или купить больше, чем %0% регион(ов) (у вас уже имеется %1% в группе '%2%')."
|
||||
"general-notReady": "Плагин AreaShop еще не полностью загружен. Пожалуйста, подождите..."
|
||||
"general-noWorld": "Вы не можете сделать это, мир для %lang:region% не доступен (мир '%world%')."
|
||||
"general-noRegion": "Вы не можете сделать это, WorldGuard регион не доступен (регион %lang:region%)."
|
||||
"general-noEconomy": "На сервере нету плагина Экономии, либо он установлен некорректно. Оповестите администратора сервера об этом."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Ошибка в команде, используй '/as help' для получения дополнительной информации."
|
||||
"cmd-onlyByPlayer": "Эта команда может быть применена только игроком. "
|
||||
"cmd-weOnlyByPlayer": "Использование выделения доступно только для игроков, укажите название региона в качестве дополнительного аргумента."
|
||||
"cmd-noSelection": "Вы не имеете WorldEdit выделения."
|
||||
"cmd-noRegionsFound": "В выбранной области не найдено регионов, зарегистрированных в AreaShop."
|
||||
"cmd-noWERegionsFound": "Внутри вашего выделения не обнаружено регионов."
|
||||
"cmd-notRegistered": "Регион '%0%' недоступен в AreaShop."
|
||||
"cmd-noRegion": "'%0%' не является допустимым регионом WorldGuard."
|
||||
"cmd-noRegionsAtLocation": "В вашем местоположении не найдено регионов, укажите регион в качестве аргумента."
|
||||
"cmd-moreRegionsAtLocation": "В вашем местоположении найдено несколько регионов, укажите название региона для уточнения."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Автоматическое определение региона доступно только для игроков, укажите регион в качестве аргумента."
|
||||
"help-header": "Страница помощи. Команды которые Вам доступны."
|
||||
"help-noPermission": "У вас нет разрешения для просмотра страницы помощи."
|
||||
"help-alias": "Альтернативные команды: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Показать эту страницу помощи."
|
||||
"help-info": "%lang:helpCommand|/as info|% Получить информацию о текущих регионах."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Арендовать регион или расширить свою текущую аренду."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Купить регион."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Отказаться от аренды региона."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% Продать регион."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Перезагрузить все файлы и обновить регионы."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Включить/выключить восстановление и выбрать профиль."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Изменить стоимость региона."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Изменить длительность аренды."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Телепортироваться к вашему купленному/арендованному региону."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Установить точку телепортации для региона."
|
||||
"help-find": "%lang:helpCommand|/as find|% Найти свободный регион для покупки или аренды."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Добавить регион в группу."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Удалить регион из группы."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Показать все доступные группы."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Показать информацию о группе."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Вызвать схематическое событие для региона."
|
||||
"help-add": "%lang:helpCommand|/as add|% Зарегистрировать регион для аренды или покупки."
|
||||
"help-del": "%lang:helpCommand|/as del|% Удалить зарегистрированный регион из AreaShop."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Добавить табличку для региона."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Удалить табличку на которую вы смотрите."
|
||||
"help-me": "%lang:helpCommand|/as me|% Проверить список своих регионов(+истечение аренды)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Установить владельца региона или расширить аренду."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Установить один из Ваших регионов в режим перепродажи."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Установить Ваш регион обратно в режим продано."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Добавить друга в ваш регион."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Удалить друга из вашего региона."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Используй, чтобы включить режим привязки табличек."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Создать несколько регионов и добавить их."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Установить землевладельца в регион."
|
||||
"rent-help": "/as rent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"rent-noPermission": "У вас не прав для аренды данного региона."
|
||||
"rent-maximum": "Вы не можете арендовать более %0% региона(ов) (у вас уже есть %1% в группе '%2%')."
|
||||
"rent-maximumExtend": "Вы не можете продлить эту аренду, потому что у вас есть более чем %0% регион(ов) (у вас имеется %1% в группе '%2%')."
|
||||
"rent-payError": "Что-то пошло не так с оплатой, повторите попытку позже."
|
||||
"rent-rented": "Вы арендовали %lang:region% до %until%, вы можете увеличить срок аренды еще раз нажав на табличку или использовать команду /as rent."
|
||||
"rent-extended": "Вы продлили свою аренду %lang:region% до %until%."
|
||||
"rent-extendedToMax": "Вы не можете арендовать регион %lang:region% до %until% (максимальное время аренды %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "У вас не достаточно денег для продления аренды (у вас %0%, а необходимо %price%)."
|
||||
"rent-lowMoneyRent": "У вас не хватает денег для аренды %lang:region% (у вас %0%, а необходимо %price%)."
|
||||
"rent-someoneElse": "Кто-то уже арендует регион %lang:region%."
|
||||
"rent-notRentable": "Регион '%0%' недоступен для аренды (не зарегистрирован в AreaShop или регион можно только купить)."
|
||||
"rent-maxExtends": "Вы не можете продлить аренду на столько (максимум %maxextends%), однако после того как закончится срок аренды вы можете арендовать %lang:region% снова."
|
||||
"rent-maxRentTime": "Вы не можете арендовать %lang:region% на такой период, максимальное время аренды %maxrenttime%, вы пытаетесь арендовать на %timeleft%."
|
||||
"rent-restrictedToWorld": "Вы должны быть в мире '%world%', чтобы арендовать %lang:region% (вы находитесь в '%0%')."
|
||||
"rent-restrictedToRegion": "Вы должны находиться внутри %lang:region% для его аренды."
|
||||
"rent-expireWarning": "В вашем регионе %lang:region% закончится арендный срок %timeleft%, вы должны продлить аренду для его сохранения."
|
||||
"rent-expiringSoon": "Ваш регион %lang:tRegion|%0%|% осталось %1% , не забудьте продлить аренду, если хотите его сохранить."
|
||||
"rent-alreadyAtFull": "%lang:region% уже на уровне или выше максимального времени аренды, вы не можете продлить его еще.."
|
||||
"buy-help": "/as buy [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"buy-noPermission": "У Вас нет прав для покупки региона."
|
||||
"buy-noPermissionResell": "У Вас нет прав для покупки региона в режиме перепродажи."
|
||||
"buy-noPermissionNoResell": "У Вас нет прав для покупки региона, который не находится в режиме перепродажи."
|
||||
"buy-notBuyable": "Регион '%0%' недоступен для покупки (не зарегистрирован в AreaShop или регион только для аренды)."
|
||||
"buy-maximum": "Вы не можете купить более %0% региона(ов) (у Вас уже имеется %1% в группе '%2%')"
|
||||
"buy-payError": "Что-то пошло не так с оплатой, повторите попытку позже."
|
||||
"buy-succes": "Вы успешно купили %lang:region%."
|
||||
"buy-successResale": "Вы успешно купили %lang:region% в %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Ваш регион %lang:region% был продан %lang:player% за %0%."
|
||||
"buy-lowMoney": "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %price%)."
|
||||
"buy-lowMoneyResell": "У вас недостаточно денег чтобы купить %lang:region% (у вас %0%, а необходимо %resellprice%)."
|
||||
"buy-yours": "Вы уже владелец %lang:region%."
|
||||
"buy-someoneElse": "Кто-то уже купил %lang:region%."
|
||||
"buy-restrictedToWorld": "Вы должны быть в мире '%world%', чтобы купить %lang:region% (вы находитесь в '%0%')."
|
||||
"buy-restrictedToRegion": "Вы должны находиться внутри %lang:region% для его покупки."
|
||||
"unrent-help": "/as unrent [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"unrent-noPermission": "У вас нет разрешения на снятие аренды в регионе."
|
||||
"unrent-noPermissionOther": "У вас нет разрешения на снятие аренды в другом регионе."
|
||||
"unrent-notRegistered": "В регионе недоступно снятие аренды, потому что он не зарегистрирован для сдачи в аренду."
|
||||
"unrent-notRented": "В регионе нельзя снять аренду, потому что он не арендован."
|
||||
"unrent-unrented": "%lang:region% теперь не арендует %lang:player%."
|
||||
"unrent-expired": "Ваша аренда %lang:region% уже истекла."
|
||||
"sell-help": "/as sell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"sell-notRegistered": "Этот регион не может быть продан, так как он не зарегистрирован на продажу."
|
||||
"sell-notBought": "Этот регион не может продан, так как не находится в чьей-либо собственности."
|
||||
"sell-sold": "%lang:region% был продан %lang:player%."
|
||||
"sell-noPermission": "У Вас нет прав для продажи региона."
|
||||
"sell-noPermissionOther": "У Вас нет прав для продажи другого региона."
|
||||
"reload-reloading": "Перезагружены все конфигурации и файлы регионов."
|
||||
"reload-noPermission": "Недостаточно полномочий для того, чтобы перезагрузить конфиги плагина."
|
||||
"reload-updateCommandChanged": "'/as updaterents' и '/as updatebuys' были удалены, '/as reload' теперь будет также обновлять регионы, используйте взамен эту команду."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|all|/as info all|%[break]"
|
||||
- " %lang:command|rented|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|forrent|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|sold|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|forsale|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|reselling|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|nogroup|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|region|/as info region|% [region]"
|
||||
"info-noPermission": "У Вас нет прав для получения информации о регионах."
|
||||
"info-allHeader": "Все регионы%0%:"
|
||||
"info-rentedHeader": "Арендовано регионов%0%:"
|
||||
"info-forrentHeader": "Регионы для аренды%0%:"
|
||||
"info-forsaleHeader": "Регионы для продажи%0%:"
|
||||
"info-soldHeader": "Продано регионов%0%:"
|
||||
"info-resellingHeader": "Перепродано регионов%0%:"
|
||||
"info-nogroupHeader": "Регионы без групп%0%:"
|
||||
"info-limitedToGroup": "(ограничение в группе %0%)"
|
||||
"info-nogroupNone": "Здесь нет регионов без групп."
|
||||
"info-noFiltergroup": "Группа '%0%' не существует, потому не может быть использована для ограничения результатов."
|
||||
"info-noRegions": "Нет найденных регионов."
|
||||
"info-wrongPage": "%0% неверный номер страницы."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно арендовать за %price% на %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Арендован %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Можно продать за %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Продан %lang:player% (перепродажа)."
|
||||
"info-pageStatus": "[gold]Страница %0%/%1%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Предыдущая[/bold] "
|
||||
- " hover: Это первая страница"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Следующая►[/bold]"
|
||||
- " hover: Это последняя страница"
|
||||
"info-playerHelp": "/as info player <имяигрока>."
|
||||
"info-playerRents": "Регионы арендованные %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% не арендовал регион."
|
||||
"info-playerBuys": "Регионы купленые %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% не покупал регион."
|
||||
"info-regionHelp": "/as info region [имярегиона], если не указано имя, будет выбран регион в котором вы стоите."
|
||||
"info-regionHeaderRent": "[darkgreen]Информация о %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Информация о %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Арендован игроком %lang:player% до: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Куплено %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Купленный %lang:player%, сейчас продаётся."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Продление за[/bold]"
|
||||
- " hover: Продлить аренду %region%"
|
||||
- " hover: длительностью %duration% за %price%"
|
||||
- " hover: %lang:action|Продлить аренду %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% на %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Аренда за[/bold]"
|
||||
- " hover: Арендовать %region% за %price% на %duration%"
|
||||
- " hover: %lang:action|Аренда %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% на %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Купить за[/bold]"
|
||||
- " hover: Купить %region% за %price%"
|
||||
- " hover: %lang:action|Купить %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Стоимость перепродажи: [gray]%resellprice% (вы можете купить его у %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Добавленные друзья: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Регион %region%"
|
||||
- " hover: %lang:action|Удалить %0% из друзей|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Окупаемость продажи: [gray]%moneyback% (%moneybackpercent%% от стоимости)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Окупаемость продажи[/bold]"
|
||||
- " hover: Продать %region% и получить обратно %moneyback%"
|
||||
- " hover: %lang:action|Продать %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% от стоимости)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Окупаемость снятия аренды: [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Окупаемость снятия аренды[/bold]"
|
||||
- " hover: Снять аренду %region% и вернуть деньги %moneyback%"
|
||||
- " hover: %lang:action|Снять аренду %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% от оставшиеся времени)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Максимальное количество продления: [gray]%maxextends% раз(а)."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Аренду нельзя продлить."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Продленный осталось: [gray]%extendsleft% времени(раз) из %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] пред заказ аренды: [gray]%maxrenttime% максимальный."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Переместится к региону[/bold]"
|
||||
- " hover: %lang:action|Телепортация на %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]установить точку телепортации[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Установить точку телепорта|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Связанные таблички: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Назначенные группы: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Авто снятие аренды после: [gray]%inactivetime% бездействия игрока."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Авто продажа после: [gray]%inactivetime% бездействия игрока."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его аренды."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для аренды %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Ты должен быть внутри %lang:region% для его покупки."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Ты должен быть в мире '%world%' для покупки %lang:region%."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после завершения аренды)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] Восстановление включено [gray](регион будет сброшен после продажи)."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Землевладелец: [gray]%lang:landlord% (Получит деньги)."
|
||||
"info-regionNotExisting": "Указанный регион не зарегистрирован: %0%."
|
||||
"setrestore-help": "/as setrestore <регион> <true|false|general> [профиль]."
|
||||
"setrestore-noPermission": "У вас нет разрешения на изменение параметров восстановления."
|
||||
"setrestore-notRegistered": "Указанный регион не зарегистрирован: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' не является допустимым значением, должно быть true, false или general."
|
||||
"setrestore-success": "Успешно установлен параметр восстановления %lang:region% до '%0%'."
|
||||
"setrestore-successProfile": "Успешно установлен параметр восстановления %lang:region% до '%0%' и профиль до '%1%'."
|
||||
"setprice-noPermission": "У вас нет разрешения на изменение стоимости региона"
|
||||
"setprice-help": "/as setprice <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"setprice-notRegistered": "Указанный регион не зарегистрирован: %0%."
|
||||
"setprice-wrongPrice": "'%0%' не допустимая цена."
|
||||
"setprice-successRent": "Цену региона %lang:region% изменено на %price% до %duration%."
|
||||
"setprice-successBuy": "Цену региона %lang:region% изменено на %price%."
|
||||
"setprice-successRemoved": "Цена в %lang:region% была удалена, использование новой цены из группы или файла default.yml, новая цена: %price%."
|
||||
"setprice-noLandlord": "У вас нет разрешения на изменение цены, потому что вы не землевладелец в %lang:region%."
|
||||
"setduration-noPermission": "У вас нет разрешения на изменение длительности аренды."
|
||||
"setduration-help": "/as setduration <amount> <identifier> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"setduration-notRegistered": "%0% не зарегистрирован для сдачи в аренду."
|
||||
"setduration-wrongAmount": "'%0%' не является допустимым количеством, используйте целое число."
|
||||
"setduration-wrongFormat": "'%0%' не правильный формат времени, проверьте документацию на Bukkit."
|
||||
"setduration-success": "Длительность аренды в регионе %lang:region% изменена до '%duration%'."
|
||||
"setduration-noLandlord": "У вас нет разрешения на изменение длительности аренды, потому что вы не землевладелец в %lang:region%."
|
||||
"setduration-successRemoved": "Длительность аренды в %lang:region% было удалено, использование новой длительности аренды из группы или файла default.yml, новая длительность: %duration%."
|
||||
"setup-noRegion": "Вы не указали регион на второй строке."
|
||||
"setup-alreadyRentSign": "Регион уже добавлен в AreaShop в виде аренды региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
|
||||
"setup-alreadyBuySign": "Регион уже добавлен в AreaShop в виде покупного региона, добавьте табличку с [as] на первой строке, или '/as addsign'."
|
||||
"setup-noDuration": "Вы не указали, на сколько времени этот регион можно арендовать, сделайте это на третьей строчке."
|
||||
"setup-wrongDuration": "Время указано не в правильном формате, например: 1 day."
|
||||
"setup-noPrice": "Вы не указали цену на четвертой строке."
|
||||
"setup-wrongPrice": "Вы не указали цену правильно, используйте только цифры ."
|
||||
"setup-rentSuccess": "Сдача аренды в регионе %lang:region% настроена правильно."
|
||||
"setup-buySuccess": "Покупка региона %lang:region% настроена правильно."
|
||||
"setup-noPermissionRent": "У вас нет разрешения на создание арендных регионов."
|
||||
"setup-noPermissionBuy": "У вас нет разрешения на создание продаваемых регионов."
|
||||
"setup-couldNotDetect": "Найдено несколько областей с одинаковым приоритетом это/или родительский/дочерна связь, указать одно на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% находится в черном списке и не могут быть добавлены к AreaShop"
|
||||
"setup-noPermission": "Вы не можете добавить регион '%0%', вы не являетесь владельцем/участником или не имеете прав для этого."
|
||||
"destroy-noPermissionRent": "У вас нет разрешения на создание регионов для аренды."
|
||||
"destroy-noPermissionBuy": "У вас нет разрешения на создание регионов для продажи."
|
||||
"destroy-successRent": "%lang:region% успешно зарегистрирован в качестве региона для аренды."
|
||||
"destroy-successBuy": "%lang:region% успешно зарегистрирован в качестве региона для продажи."
|
||||
"teleport-help": "/as tp <region> [табличка]."
|
||||
"teleport-noRentOrBuy": "Указанный регион не зарегистрирован: %0%."
|
||||
"teleport-noPermission": "У вас нет разрешения для телепортации на ваш регион."
|
||||
"teleport-noPermissionOther": "У вас нет разрешения для телепортации на регионы которыми вы не владеете."
|
||||
"teleport-noPermissionSign": "У вас нет разрешения для телепортации к таблички вашего региона."
|
||||
"teleport-noPermissionOtherSign": "У вас нет разрешения для телепортации к табличек регионов которыми вы не владеете."
|
||||
"teleport-noPermissionFriend": "У вас нет разрешения для телепортации на регионы в которых вы добавлены как друг."
|
||||
"teleport-noPermissionFriendSign": "У вас нет разрешения для телепортации к табличкам регионов в которых вы добавлены как друг."
|
||||
"teleport-noPermissionAvailable": "У вас нет разрешения на телепорт в имеющийся регионы."
|
||||
"teleport-noPermissionAvailableSign": "У вас нет разрешения на телепорт к табличкам имеющийся регионов."
|
||||
"teleport-success": "Вы телепортированы к %lang:region%."
|
||||
"teleport-successSign": "Вы телепортированы к табличке возле %lang:region%."
|
||||
"teleport-noSafe": "Сохранение позиции не найдено в %lang:region%, нет места в регионе или превышен максимальный лимит (%0%/%1%)."
|
||||
"teleport-blocked": "Вы не можете телепортироваться, потому что положение находится за пределами региона, и вы вынуждены телепортироваться во внутрь."
|
||||
"teleport-changedToSign": "У вас есть только разрешение на телепортироваться к табличке, а не во внутрь региона, телепортация к табличке."
|
||||
"teleport-changedToNoSign": "Ни одна табличка не доступна что бы телепортироваться, попытка телепортироваться во внутрь региона вместо этого."
|
||||
"teleport-wrongWorld": "Вы должны быть в мире '%world%' чтобы телепортироватся на %lang:region%, только вы находитесь в мире '%0%'."
|
||||
"setteleport-help": "/as settp [регион] [сброс], если не указать параметры, будет выбран регион в котором вы находитесь."
|
||||
"setteleport-noPermission": "У вас нет прав, чтобы установить точку телепорта."
|
||||
"setteleport-noPermissionOther": "У вас нет прав, чтобы установить точку телепорта для региона, который вам не принадлежит."
|
||||
"setteleport-noRentOrBuy": "Указанный регион не зарегистрирован: %0%."
|
||||
"setteleport-success": "Точка телепорта для %lang:region% установлена."
|
||||
"setteleport-notInside": "Точка должно быть внутри региона."
|
||||
"setteleport-reset": "Точка телепорта для %lang:region% была сброшена."
|
||||
"find-help": "/as find <buy|rent> [макс.цена] [группа]."
|
||||
"find-noPermission": "У вас нет разрешения на поиск регионов и телепорт к ним."
|
||||
"find-success": "Найден %0% регион: %lang:region%, при поиске с максимальной ценой в вашем балансе: %1%%2%."
|
||||
"find-successMax": "Найдено %0% регионов: %lang:region%, при поиске с максимальной ценой %1%%2%."
|
||||
"find-wrongMaxPrice": "Указанная максимальная цена имеет не правильный номер: %0%."
|
||||
"find-wrongGroup": "Указанная группа не существует: %0%."
|
||||
"find-noneFound": "Ни один %0% регион не найден при поиске с максимальной ценой в вашем балансе: %1%%2%."
|
||||
"find-noneFoundMax": "Ни один %0% регион не найден при поиске с максимальной ценой %1%%2%."
|
||||
"find-onlyInGroup": ", искать регионы только в группах: %0%."
|
||||
"groupadd-help": "/as groupadd <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
|
||||
"groupadd-noPermission": "У вас нет разрешения на добавление регионов к группам."
|
||||
"groupadd-success": "Регион %lang:region% был добавлен к группе '%0%', эта группа теперь имеет %1% участника(-ов)."
|
||||
"groupadd-failed": "Регион %lang:region% уже является участником группы '%0%'."
|
||||
"groupadd-weSuccess": "Добавлен к группе %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Уже были в группе %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <group> [имярегиона], если не указать имя, будут выбраны все регионы в вашем WorldEdit выделении."
|
||||
"groupdel-noPermission": "У вас нет разрешения на удаление регионов из групп."
|
||||
"groupdel-wrongGroup": "Группа %0% не найдена, используй '/as grouplist' для просмотра зарегистрированных групп."
|
||||
"groupdel-success": "Регион %lang:region% был удален из группы '%0%', эта группа теперь имеет %1% участника(-ов)."
|
||||
"groupdel-failed": "Регион %lang:region% не является участником группы '%0%'."
|
||||
"groupdel-weSuccess": "Удален из группы %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Не были в группе %0% во всяком случае: [gray]%1%."
|
||||
"grouplist-noPermission": "У вас нет разрешения на отображение зарегистрированных групп."
|
||||
"grouplist-noGroups": "Нет доступных зарегистрированных груп."
|
||||
"grouplist-success": "Следующие группы были зарегистрированы: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <группа>."
|
||||
"groupinfo-noPermission": "У вас нет разрешения на отображение информации о группе."
|
||||
"groupinfo-noGroup": "Нет доступной зарегистрированной группы с именем '%0%', используй /as grouplist для вывода списка групп."
|
||||
"groupinfo-members": "Следующие регионы являются членами группы %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "Группа %0% не имеет участников."
|
||||
"schemevent-help": "/as schemevent <регион> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Событие '%0%' не существует, используйте одно из следующих действий: [gray]%1%."
|
||||
"schemevent-success": "Событие '%0%' успешно сработало для региона %lang:region%."
|
||||
"schemevent-noPermission": "У вас нет разрешения на инициацию схематических событий"
|
||||
"add-help": "/as add <rent|buy> [rрегион] [мир]."
|
||||
"add-noPermission": "У вас нет разрешения добавлять регионы в AreaShop."
|
||||
"add-success": "Добавлен в %0%: [gray]%1%."
|
||||
"add-failed": "Уже зарегистрирован: [gray]%0%."
|
||||
"add-blacklisted": "Включен в черный список : [gray]%0%."
|
||||
"add-specifyWorld": "Укажите мир региона при использовании из консоли."
|
||||
"add-incorrectWorld": "Мир '%0%' не найден, попробуйте еще раз (с учетом регистра)."
|
||||
"add-noPermissionRegions": "Нет разрешения, чтобы добавить: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Вы либо не являетесь участником/владельцем этих регионов, либо не имеете разрешения добавлять свои регионы."
|
||||
"del-noPermission": "У вас нет разрешения на удаление регионов."
|
||||
"del-success": "Удалено регионов: [gray]%0%."
|
||||
"del-failed": "Нет разрешения на удаление или не зарегистрирован: [gray]%0%."
|
||||
"addsign-help": "/as addsign [регион] [профиль]."
|
||||
"addsign-noSign": "Вы не смотрите на табличку."
|
||||
"addsign-noRegions": "Не найдено регионов вокруг таблички."
|
||||
"addsign-couldNotDetect": "Найдено несколько регионов вокруг таблички, укажите регион в качестве дополнительного аргумента (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Найдено несколько регионов вокруг таблички, укажите регион на второй строке (2 из регионов, которые были найдены: %lang:tRegion|%0%|% и %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Указанный профиль не существует, используйте одно из следующих действий (проверьте конфиг.): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Табличка профиль %0%"
|
||||
- " hover: %lang:action|Используйте этот профиль|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "Табличка была добавлена для %lang:region%."
|
||||
"addsign-successProfile": "Табличка была добавлена для %lang:region% вместе с профилем %0%."
|
||||
"addsign-alreadyRegistered": "Эта табличка уже зарегистрирована в регионе %lang:region%."
|
||||
"addsign-noPermission": "У вас нет разрешения на добавление таблички."
|
||||
"delsign-noSign": "Вы не смотрите на табличку."
|
||||
"delsign-noPermission": "У вас нет разрешения на удаление таблички."
|
||||
"delsign-noRegion": "Эта табличка не принадлежит к регионам в AreaShop."
|
||||
"delsign-success": "Табличка была удалена из региона %lang:region%."
|
||||
"me-noPermission": "У вас нет прав, чтобы проверить, какие регионы вы имеете."
|
||||
"me-header": "Регионы %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Вы не являетесь игроком, которому доступны какие-либо регионы."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% истек"
|
||||
- " hover: until %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "принадлежит %lang:player%"
|
||||
- " hover: Вы добавили друга"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% не арендовали или покупали регионы и не добавлялись в друзья."
|
||||
"me-noPlayer": "%0% не может быть найден, вероятно, никогда не присоединился к серверу."
|
||||
"me-clickHint": "[gray][italic]Нажмите на имя региона , чтобы увидеть детали"
|
||||
"setowner-help": "/as setowner <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"setowner-noPermission": "У вас нет прав, чтобы установить владельца региона."
|
||||
"setowner-noPermissionRent": "У вас нет прав, чтобы установить владельца для аренды регионов."
|
||||
"setowner-noPermissionBuy": "У вас нет прав, чтобы установить владельца для покупки регионов."
|
||||
"setowner-notRegistered": "Указанный регион не зарегистрирован, владелец не может быть установлен."
|
||||
"setowner-noPlayer": "Не удалось получить UUID указанного игрока: %0%."
|
||||
"setowner-succesRent": "Владелец в %lang:region% успешно изменен на %lang:player%, орендований до %until% (%timeleft% истечет)."
|
||||
"setowner-succesRentExtend": "Владелец %lang:player%, аренда расширена на '%duration%', сейчас арендован до %until% (%timeleft% истечет)."
|
||||
"setowner-succesBuy": "Владелец в %lang:region% успешно изменен на %lang:player%."
|
||||
"resell-help": "/as resell <price> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"resell-wrongPrice": "'%0%' не является допустимой ценой."
|
||||
"resell-notRegistered": "Указанный регион не зарегистрирован: %0%."
|
||||
"resell-notBought": "Вы не можете перепродать %lang:region%, так как он еще не продан."
|
||||
"resell-success": "%lang:region% был успешно выставлен в режим перепродажи за %resellprice%."
|
||||
"resell-noPermission": "У Вас нет прав что бы установить ваш регион в режим перепродажи."
|
||||
"resell-noPermissionOther": "У Вас нет прав что бы установить регион в режим перепродажи."
|
||||
"stopresell-help": "/as stopresell [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"stopresell-notRegistered": "Указанный регион не зарегистрирован: %0%."
|
||||
"stopresell-notResell": "Вы не можете остановить перепродажу %lang:region% потому что регион не в режиме перепродажи."
|
||||
"stopresell-success": "%lang:region% был успешно выставлен в режим продажи."
|
||||
"stopresell-noPermission": "У вас нет прав, чтобы установить свой регион обратно в режим продажи."
|
||||
"stopresell-noPermissionOther": "У вас нет разрешения устанавливать регионы обратно в режим продажи."
|
||||
"addfriend-help": "/as addfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"addfriend-noPermissionOther": "У вас нет разрешения на добавление друзей в регионы, которые не являются вашими."
|
||||
"addfriend-noPermission": "У вас нет разрешения на добавление друзей в вашем регионе."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% был добавлен до друзей в %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% был добавлен до друзей в вашем регионе %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% уже добавлен до друзей в %lang:region%."
|
||||
"addfriend-self": "Добавление владельца региона как друга было бы бессмысленно."
|
||||
"addfriend-noOwner": "Вы не можете добавлять друзей в регионе без владельца."
|
||||
"addfriend-notVisited": "Вы не можете добавить %0% потому что он еще не посещал этот сервер."
|
||||
"delfriend-help": "/as delfriend <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"delfriend-noPermissionOther": "У вас нет разрешения на удаление друзей из регионов, которые не являются вашими."
|
||||
"delfriend-noPermission": "У вас нет разрешения на удаление друзей из вашего региона."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% был удален из друзей в регионе %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% был удален из друзей в вашем регионе %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% не добавлен до друзей в %lang:region%."
|
||||
"delfriend-noOwner": "Вы не можете удалять друзей из региона без владельца."
|
||||
"linksigns-multipleRegions": "Найдено несколько регионов: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Нажмите в другое время, чтобы попробовать еще раз или используйте '/as linksigns' чтобы остановить."
|
||||
"linksigns-noRegions": "Не найдено регионов AreaShop в направлении взгляда, убедитесь что регион добавлен в AreaShop [gray](максимум расстояние в 100 блоков)."
|
||||
"linksigns-regionFound": "Регион %lang:region% был выбран, теперь укажите табличку кликнув левой кнопкой мыши для его привязки."
|
||||
"linksigns-signFound": "Обнаружена табличка в (%0%, %1%, %2%), теперь укажите регион кликнув правой кнопкой мыши для ее привязки"
|
||||
"linksigns-noSign": "Никаких табличек не обнаружено в направлении взгляда, убедитесь, что у вас есть прямой взгляд на табличку и нажмите снова [gray](максимум расстояние в 100 блоков)."
|
||||
"linksigns-alreadyRegistered": "Эта табличка уже зарегистрирована в регионе %lang:region%, кликни еще раз, чтобы выбрать другую табличку."
|
||||
"linksigns-first": "Включен режим привязки табличек."
|
||||
"linksigns-next": "[gray]Клик лкм. выбрать табличку, клик пкм. выбрать регион, использовать /as linksigns для отключения режима."
|
||||
"linksigns-noPermission": "У вас нет разрешения для пользования режима привязки табличек."
|
||||
"linksigns-stopped": "Отключен режим привязки табличек."
|
||||
"stack-help":
|
||||
- "/as stack <amount> <gap> <name> <rent|buy> [group].[break]"
|
||||
- " [gray]<amount> Количество создаваемых регионов.[break]"
|
||||
- " [gray]<gap> Дистанция в блоках между регионами.[break]"
|
||||
- " [gray]<name> Имя региона (с числом за ним).[break]"
|
||||
- " [gray]<rent|buy> сделать аренду или продажу.[break]"
|
||||
- " [gray][group] Добавляет регионы в группу.[break]"
|
||||
- " [gray]Регионы будут созданы в направлении взгляда."
|
||||
"stack-accepted": "Началось создание %0% %1% регионов с растоянием в %2% блок(ов), имена которых начинаются с %3% и имеют номера за ними.%4%"
|
||||
"stack-addToGroup": "Созданные регионы будут добавлены к группе '%0%'."
|
||||
"stack-noPermission": "У вас нет разрешения создавать и добавлять регионы AreaShop в большом количестве."
|
||||
"stack-wrongAmount": "'%0%' не правильное количество регионов."
|
||||
"stack-wrongGap": "'%0%' не правильное число блоков для отступа между регионами."
|
||||
"stack-noSelection": "У вас нет выделения, которое указывает, где должен быть создан первый регион."
|
||||
"stack-addStart": "[gray]Добавлено %0% регионов около %1% в секунду."
|
||||
"stack-addComplete": "[gray]Добавлено %0% регионов%1%."
|
||||
"stack-tooHigh": ", %0% регионов пропущены, потому что они были выше Y=256"
|
||||
"stack-tooLow": ", %0% регионов пропущены, потому что они были ниже Y=0"
|
||||
"stack-unclearDirection": "Пожалуйста, посмотрите четко на север, восток, юг, запад, вверх или вниз, в настоящее время обнаружено %0%."
|
||||
"setlandlord-help": "/as setlandlord <player> [имярегиона], если не указано имя, будет выбран регион в котором вы находитесь."
|
||||
"setlandlord-noPermission": "У вас не разрешения чтобы назначить землевладельца в регион."
|
||||
"setlandlord-success": "%lang:landlord% был успешно установлен как землевладелец в %lang:region%."
|
||||
"message-help": "/as message <игрок> <сообщение...>"
|
||||
"message-noPermission": "У вас нет разрешения на отправку AreaShop сообщений."
|
||||
"message-notOnline": "%0% не в сети."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Вы уверены, что вы хотите арендовать %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы арендовать %0%|%"
|
||||
- " hover: %lang:action|Аренда %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Вы уверены, что вы хотите продлить %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продлить %0%|%"
|
||||
- " hover: %lang:action|Продлить %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Вы уверены, что хотите остановить аренду %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы остановить аренду %0%|%"
|
||||
- " hover: %lang:action|Остановка аренды %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Вы уверены, что хотите купить %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы купить %0%|%"
|
||||
- " hover: %lang:action|Купить %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Вы уверены, что хотите продать %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Нажмите, чтобы продать %0%|%"
|
||||
- " hover: %lang:action|Продать %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% лет"
|
||||
"timeleft-months": "%0% месяцев"
|
||||
"timeleft-days": "%0% дней"
|
||||
"timeleft-hours": "%0% часов"
|
||||
"timeleft-minutes": "%0% минут"
|
||||
"timeleft-second": "%0% секунд"
|
||||
"timeleft-seconds": "%0% секунд"
|
||||
"timeleft-ended": "Истек"
|
||||
"greeting-forrent": "%region% может быть арендован за %price% на %duration%"
|
||||
"greeting-rented": "%region% арендован игроком %player% до %until%."
|
||||
"greeting-forsale": "%region% может быть куплен за %price%."
|
||||
"greeting-bought": "%region% куплен игроком %player%."
|
||||
"greeting-resale": "%region% может быть куплен за %resellprice% в %player%."
|
||||
"update-playerNotify":
|
||||
- "[darkgreen]Обновление для AreaShop V%0% до AreaShop V%1% доступно, получить последнюю версию на "
|
||||
- "[bold]Spigot[/bold]"
|
||||
- " hover: %lang:action|Перейти к странице AreaShop на Spigot|%"
|
||||
- " link: https://www.spigotmc.org/resources/areashop.2991/"
|
||||
- " (И оставить отзыв)."
|
||||
@@ -0,0 +1,492 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Swedish language file, plugin version 2.5.0, 376/428 messages are translated (88%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|Använd %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|Använd %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Område %0%"
|
||||
- " hover: %lang:action|Regions information|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Spelare %0%"
|
||||
- " hover: %lang:action|Regioner av %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Hyresvärd %landlord%"
|
||||
- " hover: %lang:action|Regioner av %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "Du kan inte hyra/köpa mer än %0% region(er) totalt (Du har redan %1% inom grupp '%2%')."
|
||||
"general-notReady": "AreaShop har inte laddat klart, vänligen vänta."
|
||||
"general-noWorld": "Du kan inte göra detta. Världen: %lang:region% är inte tillgänglig (värld '%world%')"
|
||||
"general-noRegion": "Du kan inte göra så, WorldGuard regionen är inte tillgänglig (region %lang:region%)"
|
||||
"general-noEconomy": "Det finns inget tillägg för ekonomisystem installerat eller så är det inte inställt korrekt. Meddela serverns ägare om detta."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "Kommandot är inte tillgängligt, använd '/as help' för mer information."
|
||||
"cmd-onlyByPlayer": "Detta kommando kan enbart köras av en spelare."
|
||||
"cmd-weOnlyByPlayer": "Användning av WorldEdit är enbart tillgängligt för en spelare, specifiera regionens namn som extra argument."
|
||||
"cmd-noSelection": "Du har ingen WorldEdit område valt."
|
||||
"cmd-noRegionsFound": "Inga regioner registrerade i AreaShop finns i ditt val."
|
||||
"cmd-noWERegionsFound": "Inga WorldEdit regioner som korsar ditt val finns."
|
||||
"cmd-noRegionsAtLocation": "Inga regioner finns på din plats, ange en region som argument."
|
||||
"cmd-moreRegionsAtLocation": "Mer än en region har hittats på din plats, ange en region som argument."
|
||||
"cmd-automaticRegionOnlyByPlayer": "Att automatiskt avgöra regionen är enbart möjligt för spelare, ange en region som argument."
|
||||
"help-header": "Hjälpsidan, kommandon som du kan utföra."
|
||||
"help-noPermission": "Du har inte behörighet för att visa hjälpsidan."
|
||||
"help-alias": "Kommando alias: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% Visar denna hjälpsida."
|
||||
"help-info": "%lang:helpCommand|/as info|% Få information om aktuella regioner."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% Hyr en region eller förlänga din nuvarande hyra."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% Köp en region."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% Sluta hyra en region."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% sälj en region."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% Ladda om alla filer och uppdatera regionerna."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% Ställ in återställning på/av och välj profil."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% Ändra priset av en region."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% Ändra varaktigheten för en hyraregion."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% Teleportera till en hyr-/köpregion."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% Sätt ut teleporteringsposition för en region."
|
||||
"help-find": "%lang:helpCommand|/as find|% Hitta en ledig köpa eller hyra."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% Lägg till en region till en grupp."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% Radera en region från en grupp."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% Visa alla grupper som för närvarande är registrerade."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% Visa information om en grupp."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% Utlös en schematisk händelse för en region."
|
||||
"help-add": "%lang:helpCommand|/as add|% Registrera en region som hyra eller köpa."
|
||||
"help-del": "%lang:helpCommand|/as del|% Radera en registrerad region från AreaShop."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% Lägg till en skylt till en existerande region."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% Radera skylten du ser på."
|
||||
"help-me": "%lang:helpCommand|/as me|% Se vilka områden du har (+expiration)."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% Bestäm regionens ägare eller förläng hyran."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% Sätt en region i återförsäljarläge."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% Sätt tillbaka en region i sålt läge."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% Lägg till en vän till en region."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% Ta bort en vän från en region."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% Använd länkningsläge med gruppskylt."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% Skapa flera regioner och lägg till dem."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% Ange hyresvärden för en region."
|
||||
"rent-help": "/as rent [region], regionen du står i kommer användas om inget är angivet."
|
||||
"rent-noPermission": "Du har inte behörighet att hyra en region."
|
||||
"rent-maximum": "Du kan inte hyra mer än %0% region(er) (du har redan %1% i grupp '%2%')."
|
||||
"rent-maximumExtend": "Du kan inte förlänga den här hyran för du har redan fler än %0% region(er) (du har redan %1% i grupp '%2%')."
|
||||
"rent-payError": "Något gick fel med betalningen, försök igen senare."
|
||||
"rent-rented": "Du hyrde %lang:region% fram till %until%, du kan förlänga din hyrtid genom att högerklicka skylten igen eller genom att använda /as rent."
|
||||
"rent-extended": "Du kan förlänga ditt hyrande av %lang:region% fram till %until%."
|
||||
"rent-extendedToMax": "Du förlängde ditt hyrande av %lang:region% fram till %until% (vilket är den maximala hyrtiden på %maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "Du har inte tillräckligt med pengar för att förlänga hyran (du har %0% och du behöver %price%)."
|
||||
"rent-lowMoneyRent": "Du har inte tillräckligt med pengar för att hyra %lang:region% (du har %0% och du behöver %price%)."
|
||||
"rent-someoneElse": "Någon annan har redan hyrt %lang:region%."
|
||||
"rent-maxExtends": "Du kan inte förlänga den här hyran mer (maximalt är %maxextends% times), men efter att hyran är över kan du hyra %lang:region% igen."
|
||||
"rent-maxRentTime": "Du kan inte hyra %lang:region% mer tid i förväg, maximal tid är %maxrenttime% och du har för tillfället hyrt den i %timeleft%."
|
||||
"rent-restrictedToWorld": "Du måste vara i världen '%world%' för att hyra %lang:region% (du är i '%0%')."
|
||||
"rent-restrictedToRegion": "Du måste vara innanför %lang:region% för att hyra den."
|
||||
"rent-expireWarning": "Din region %lang:region% har %timeleft% kvar, se till att föränga den om du vill ha kvar den."
|
||||
"rent-alreadyAtFull": "%lang:region% Är redan på eller över den maximala tiden du får hyra, du kan inte förlänga den än."
|
||||
"buy-help": "/as buy [region], regionen du står i kommer användas om ingen annan specifieras."
|
||||
"buy-noPermission": "Du har inte rättigheterna att köpa en region."
|
||||
"buy-noPermissionResell": "Du har inte rättigheterna att köpa en region i återsäljnings läge."
|
||||
"buy-noPermissionNoResell": "Du har inte rättigheterna att köpa en region som inte är i återsäljnings läge."
|
||||
"buy-maximum": "Du kan inte köpa fler än %0% region(er) (du har redan %1% i grupp '%2%')."
|
||||
"buy-payError": "Något gick fel med betalningen, försök igen senare."
|
||||
"buy-succes": "Du köpte %lang:region%."
|
||||
"buy-successResale": "Du köpte %lang:region% från %lang:tPlayer|%0%|%."
|
||||
"buy-successSeller": "Din region %lang:region% har blivit såld till %lang:player% för %0%."
|
||||
"buy-lowMoney": "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %price%)."
|
||||
"buy-lowMoneyResell": "Du har inte tillräckligt med pengar för att köpa %lang:region% (du har %0% och du behöver %resellprice%)."
|
||||
"buy-yours": "Du äger redan %lang:region%."
|
||||
"buy-someoneElse": "Någon annan har redan köpt %lang:region%."
|
||||
"buy-restrictedToWorld": "Du måste befinna dig i världen '%world%' för att köpa %lang:region% (du befinner dig i '%0%')."
|
||||
"buy-restrictedToRegion": "Du måste vara innanför %lang:region% för att köpa den."
|
||||
"unrent-help": "/as unrent [region], regionen du står i kommer användas om inget är angivet."
|
||||
"unrent-noPermission": "Du har inte rättigheterna för att säga upp hyran av en region."
|
||||
"unrent-noPermissionOther": "Du har inte rättigheterna för att säga upp hyran av en annan region."
|
||||
"unrent-notRegistered": "Hyran för den här regionen kan inte tas bort då den inte är registrerad för uthyrning."
|
||||
"unrent-notRented": "Hyran för den här regionen kan inte tas bort då den inte är hyrd."
|
||||
"unrent-unrented": "%lang:region% för %lang:player% har fått sin hyrning borttagen."
|
||||
"unrent-expired": "Din hyrning av %lang:region% har löpt ut."
|
||||
"sell-help": "/as sell [region], regionen du står i kommer användas om ingen annan specifieras."
|
||||
"sell-notRegistered": "Den här regionen kan inte säljas då den inte är registrerad för att köpas."
|
||||
"sell-notBought": "Regionen kan inte säljas för det är ingens egendom."
|
||||
"sell-sold": "%lang:region% för %lang:player% har sålts."
|
||||
"sell-noPermission": "Du har inte rättigheterna att sälja den här regionen."
|
||||
"sell-noPermissionOther": "Du har inte rättigheterna att sälja en annan region."
|
||||
"reload-noPermission": "Du har inte rättigheterna för att ladda om konfigureringsfiler."
|
||||
"reload-updateCommandChanged": "'/as updaterents' och '/as updatebuys' har tagits bort, '/as reload' uppdaterar även regioner nu så använd det kommandot istället."
|
||||
"info-noPermission": "Du har inte rättigheterna för att få information om regionerna."
|
||||
"info-allHeader": "Alla regioner%0%:"
|
||||
"info-rentedHeader": "Hyrda regioner%0%:"
|
||||
"info-forrentHeader": "Regioner för uthyrning%0%:"
|
||||
"info-forsaleHeader": "Regioner till salu%0%:"
|
||||
"info-soldHeader": "Sålda regioner%0%:"
|
||||
"info-resellingHeader": "Regioner för återsäljning%0%:"
|
||||
"info-nogroupHeader": "Regioner utan grupp%0%:"
|
||||
"info-limitedToGroup": " (begränsade till grupp %0%)"
|
||||
"info-nogroupNone": "Det finns inga regioner utan grupp."
|
||||
"info-noFiltergroup": "Grupp '%0%' finns inte och kan därför inte användas för att begränsa reslutaten."
|
||||
"info-noRegions": "Inga regioner kunde hittas."
|
||||
"info-wrongPage": "%0% är inte ett korrekt sidonummer."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyres för %price% per %duration%."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]Uthyrd till %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]Till salu för %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]Såld till %lang:player% (återsäljer)."
|
||||
"info-pageStatus": "[gold]Sida %0%/%1%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄Föregående[/bold] "
|
||||
- " hover: Detta är redan första sidan"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]Nästa►[/bold]"
|
||||
- " hover: Detta är redan sista sidan"
|
||||
"info-playerHelp": "/as info player <namn>."
|
||||
"info-playerRents": "Regioner hyrda av %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% har inte hyrt någon region."
|
||||
"info-playerBuys": "Regioner köpta av %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% har inte köpt någon region."
|
||||
"info-regionHelp": "/as info region [namn], regionen du står i kommer användas om ingen annan specifieras."
|
||||
"info-regionHeaderRent": "[darkgreen]Information om %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]Information om %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] Hyrd av %lang:player% tills: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] Köpt av %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] Köpt av %lang:player%, ute till återförsäljning."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Förläng för[/bold]"
|
||||
- " hover: Förläng hyrning av %region%"
|
||||
- " hover: med %duration% för %price%"
|
||||
- " hover: %lang:action|Förläng hyrning av %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Hyra för[/bold]"
|
||||
- " hover: Hyr %region% för %price% per %duration%"
|
||||
- " hover: %lang:action|Hyr %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]%price% per %duration%."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Köp för[/bold]"
|
||||
- " hover: Köp %region% för %price%"
|
||||
- " hover: %lang:action|Köp %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] Återsäljningspris: [gray]%resellprice% (du kan köpa den från %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] Tillagda vänner: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|Ta bort%0% som vän|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] Försäljning återbetalning: [gray]%moneyback% (%moneybackpercent%% av priset)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Försäljning återbetalning[/bold]"
|
||||
- " hover: Sälj %region% och få tillbaka %moneyback%"
|
||||
- " hover: %lang:action|Sälj%region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% av priset)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] Avbruten hyras återbetalning: [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Avbruten hyras återbetalning[/bold]"
|
||||
- " hover: Avbryt hyra %region% och få tillbaka %moneyback%"
|
||||
- " hover: %lang:action|Avbryt hyra %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% av återstående tid)."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] Maximalt antal expansioner: [gray]%maxextends% time(s)."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] Hyran kan inte förlängas."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] Expansioner kvar: [gray]%extendsleft% time(s) utav %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] Hyra i förväg: [gray]%maxrenttime% max."
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]Gå till regionen[/bold]"
|
||||
- " hover: %lang:action|Teleportera till %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]sätt ut teleporteringsplats[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|Sätt ut teleporteringsplats|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] Connected signs: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] Tilldelade grupper: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] Avsluta hyrning automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] Sälj automatiskt efter: [gray]%inactivetime% av inaktivetet från spelaren."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att hyra den."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] Du måste befinna dig i världen '%world%' för att hyra %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] Du måste befinna dig innanför %lang:region% för att köpa den."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] Du måste vara i världen '%world%' för att köpa %lang:region%."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] Hyresvärd: [gray]%lang:landlord% (mottager pengarna)."
|
||||
"info-regionNotExisting": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
|
||||
"setrestore-noPermission": "Du har inte rättigheterna att ändra återställnings inställningarna."
|
||||
"setrestore-notRegistered": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' är inte ett giltigt tillstånd, bör vara true, false eller general."
|
||||
"setrestore-success": "Återställningsläget för %lang:region% inställt till '%0%'."
|
||||
"setrestore-successProfile": "Återställningsläget för %lang:region% inställt till '%0%' och profilen till '%1%'."
|
||||
"setprice-noPermission": "Du har inte rättigheterna för att ställa in priset på en region."
|
||||
"setprice-help": "/as setprice <price> [region], regionen du står i kommer användas om ingen annan specifieras."
|
||||
"setprice-notRegistered": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"setprice-wrongPrice": "'%0%' är inte ett giltigt pris."
|
||||
"setprice-successRent": "Priset på regionen %lang:region% ändrad till %price% per %duration%."
|
||||
"setprice-successBuy": "Priset på regionen %lang:region% ändrad till %price%."
|
||||
"setprice-successRemoved": "Priset på %lang:region% har tagits bort, Den kommer nu använda priset från en grupp i filen default.yml, nytt pris: %price%."
|
||||
"setprice-noLandlord": "Du har inte rättigheterna att ändra priset för du inte är hyresvärd av %lang:region%."
|
||||
"setduration-noPermission": "Du har inte rättigheterna att ändra tiden för en hyra."
|
||||
"setduration-help": "/as setduration <amount> <identifier> [region], regionen du står i kommer användas om inget annat specifieras."
|
||||
"setduration-notRegistered": "%0% är inte registrerad för uthyrning."
|
||||
"setduration-wrongAmount": "'%0%' är inte ett giltigt nummer, använd ett helt nummer."
|
||||
"setduration-wrongFormat": "'%0%' är inte ett giltigt tidsformat, kolla dokumentationen på bukkit."
|
||||
"setduration-success": "Varaktigheten av region %lang:region% ändrad till '%duration%'."
|
||||
"setduration-noLandlord": "Du har inte rättigheterna att ändra varaktigheten för du är inte hyresvärd av %lang:region%."
|
||||
"setduration-successRemoved": "Varaktigheten av %lang:region% har tagits bort, det kommer nu använda den varaktighet som finns i filen default.yml, ny varaktighet: %duration%."
|
||||
"setup-noRegion": "Du specifierade inte någon region på andra raden."
|
||||
"setup-alreadyRentSign": "Regionen du specifierade är redan tillagd till AreaShop som en hyr region, lägg till skyltat med [as] på första raden eller '/as addsign'."
|
||||
"setup-alreadyBuySign": "Regionen du specifierade är redan tillagd till AreaShop som en köp region, lägg till skyltat med [as] på första raden eller '/as addsign'."
|
||||
"setup-noDuration": "Du specifierade inte hur länge regionen kan hyras, gör detta på den tredje raden."
|
||||
"setup-wrongDuration": "Tiden som specifieras är inte i rätt format, exempel: 1 day."
|
||||
"setup-noPrice": "Du specifierade inte priset på fjärde raden."
|
||||
"setup-wrongPrice": "Du specifierade inte priset korrekt, använd bara siffror."
|
||||
"setup-rentSuccess": "Hyrning av region %lang:region% är inställt korrekt."
|
||||
"setup-buySuccess": "Köp av region %lang:region% är inställt korrekt."
|
||||
"setup-noPermissionRent": "Du har inte rättigheterna för att ställa in regioner att hyra."
|
||||
"setup-noPermissionBuy": "Du har inte rättigheterna för att ställa in regioner att köpa."
|
||||
"setup-couldNotDetect": "Hittade flera regioner med samma prioritet och/eller förälder/barn-relation, specifiera en på den andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% är svartlistad och kan inte läggas till i AreaShop."
|
||||
"setup-noPermission": "Du kan inte lägga till regionen '%0%', du är inte ägare/medlem i den eller så saknar du rättigheterna för det."
|
||||
"destroy-noPermissionRent": "Du har inte rättigheterna för att avregistrera en hyrbar region."
|
||||
"destroy-noPermissionBuy": "Du har inte rättigheterna för att avregistrera en köpbar region."
|
||||
"destroy-successRent": "%lang:region% avregistrerades som hyrbar region."
|
||||
"destroy-successBuy": "%lang:region% avregistrerades som köpbar region."
|
||||
"teleport-help": "/as tp <region> [skylt]."
|
||||
"teleport-noRentOrBuy": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"teleport-noPermission": "Du har inte rättigheterna för att teleportera dig till din region."
|
||||
"teleport-noPermissionOther": "Du har inte rättigheterna för att teleportera dig till regioner du inte äger."
|
||||
"teleport-noPermissionSign": "Du har inte rättigheterna för att teleportera dig till skylten i din region."
|
||||
"teleport-noPermissionOtherSign": "Du har inte rättigheterna för att teleportera dig till skylten i regioner du inte äger."
|
||||
"teleport-noPermissionFriend": "Du har inte rättigheterna för att teleportera dig till regioner du är tillagd i som vän."
|
||||
"teleport-noPermissionFriendSign": "Du har inte rättigheterna för att teleportera dig till skylten i regioner du är tillagd i som vän."
|
||||
"teleport-success": "Du teleporterade till %lang:region%."
|
||||
"teleport-successSign": "Du teleporterade till skylten i %lang:region%."
|
||||
"teleport-noSafe": "Ingen säker plats hittades %lang:region%, inga platser i regionen kvar eller maximalt försök överskreds (%0%/%1%)."
|
||||
"teleport-blocked": "Du kan inte teleportera dig då den positionen befinner sig utanför regionen och du måste teleportera dig innanför."
|
||||
"teleport-changedToSign": "Du har bara rättigheterna för att teleportera till skylten och inte innanför regionen, teleporterar till skylt."
|
||||
"teleport-changedToNoSign": "Ingen skylt tillgänglig att teleportera till, försöker teleportera innanför regionen istället."
|
||||
"setteleport-help": "/as settp [region] [reset], regionen du står i kommer andvändas om inget specifieras."
|
||||
"setteleport-noPermission": "Du har inte rättigheterna att sätta ut teleporteringsplatsen."
|
||||
"setteleport-noPermissionOther": "Du har inte rättigheterna för att sätta ut teleporteringsplatsen för en region du inte äger."
|
||||
"setteleport-noRentOrBuy": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"setteleport-success": "Teleporteringsplats för %lang:region% utsatt."
|
||||
"setteleport-notInside": "Platsen måste vara innanför regionen."
|
||||
"setteleport-reset": "Teleporteringsplats för %lang:region% har återställts."
|
||||
"find-help": "/as find <buy|rent> [maxpris] [grupp]."
|
||||
"find-noPermission": "Du har inte rättigheterna för att söka på regioner och teleportera till dem."
|
||||
"find-success": "Hittade en %0% region: %lang:region%, när sökande med maxpris av ditt konto: %1%%2%."
|
||||
"find-successMax": "Hittade en %0% region: %lang:region%, när sökande med maxpris på %1%%2%."
|
||||
"find-wrongMaxPrice": "Det specifierade maxpriset är inte ett korrekt nummer: %0%."
|
||||
"find-wrongGroup": "Den specifierade gruppen finns inte: %0%."
|
||||
"find-noneFound": "Ingen %0% region hittades när sökande med maxpris av ditt konto: %1%%2%."
|
||||
"find-noneFoundMax": "Ingen %0% region hittades när sökande med maxpris på %1%%2%."
|
||||
"find-onlyInGroup": ", sökte endast efter regioner i gruppen: %0%."
|
||||
"groupadd-help": "/as groupadd <group> [region], om ingen region är specifierad används alla regioner från din WorldEdit markering."
|
||||
"groupadd-noPermission": "Du har inte rättigheterna för att lägga till regioner i grupper."
|
||||
"groupadd-success": "Region %lang:region% har lagts till i grupp '%0%', den här gruppen har nu %1% medlem(mar)."
|
||||
"groupadd-failed": "Region %lang:region% är redan medlem i gruppen '%0%'."
|
||||
"groupadd-weSuccess": "Tillagd i grupp %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "Var redan i grupp %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <group> [region], Om inget område är specifierat används alla områden från ditt WorldEdit val."
|
||||
"groupdel-noPermission": "Du har inte rättigheterna att ta bort regioner från grupper."
|
||||
"groupdel-success": "Regionen %lang:region% har tagits bort från gruppen '%0%', den här gruppen har nu %1% medlem(mar)."
|
||||
"groupdel-failed": "Regionen %lang:region% är inte medlem i någon grupp '%0%'."
|
||||
"groupdel-weSuccess": "Borttagen från gruppen %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "Var inte i någon grupp %0% ändå: [gray]%1%."
|
||||
"grouplist-noPermission": "Du har inte rättigheterna att visa registrerade grupper."
|
||||
"grouplist-noGroups": "Det finns för närvarande inga grupper registrerade."
|
||||
"grouplist-success": "Följande grupper är registrerade: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <grupp>."
|
||||
"groupinfo-noPermission": "Du har inte rättigheterna att visa information om en grupp."
|
||||
"groupinfo-noGroup": "Det finns ingen grupp registrerad med namnet '%0%', använd /as grouplist för att kolla grupper."
|
||||
"groupinfo-members": "Följande regioner är medlemmar i gruppen %0%: [gray]%1%."
|
||||
"groupinfo-noMembers": "Gruppen %0% har inga medlemmar."
|
||||
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>."
|
||||
"schemevent-wrongEvent": "Det specifierade eventet '%0%' existerar inte, använd ett av följande: [gray]%1%."
|
||||
"schemevent-success": "Eventet '%0%' har blivit triggat för regionen %lang:region%."
|
||||
"schemevent-noPermission": "Du har inte rättigheterna för att trigga ett schematiskt event."
|
||||
"add-help": "/as add <rent|buy> [region] [värld]."
|
||||
"add-noPermission": "Du har inte rättigheterna att lägga till regioner i AreaShop."
|
||||
"add-success": "Tillagd som %0%: [gray]%1%."
|
||||
"add-failed": "Redan registrerad: [gray]%0%."
|
||||
"add-blacklisted": "På svartlistan: [gray]%0%."
|
||||
"add-specifyWorld": "Specifiera världen för regionen när consolen används."
|
||||
"add-incorrectWorld": "Värld '%0%' hittades inte, Försök igen (skiftlägeskänsligt)."
|
||||
"add-noPermissionRegions": "Saknar rättighet att lägga till: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]Du är antingen inte medlem/ägare av dessa regioner eller så saknar du rättigheterna att lägga till dina regioner."
|
||||
"del-noPermission": "Du har inte rättigheterna att ta bort regioner."
|
||||
"del-success": "Borttagna regioner: [gray]%0%."
|
||||
"del-failed": "Ingen rättighet att ta bort eller inte registrerad: [gray]%0%."
|
||||
"addsign-help": "/as addsign [region] [profil]."
|
||||
"addsign-noSign": "Du tittar inte på en skylt."
|
||||
"addsign-noRegions": "Ingen region hittades runt skyltens position."
|
||||
"addsign-couldNotDetect": "Hittade flera regioner runt skylten, specifiera regionen med et extra argument (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "Hittade flera regioner runt skylten, specifiera regionen på andra raden (2 av regionerna som hittades: %lang:tRegion|%0%|% och %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "Den specifierade profilen existerar inte, använd ett av följande (kolla konfig): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Skyltprofil %0%"
|
||||
- " hover: %lang:action|Använd denna profil|%"
|
||||
- " Kommando: /areashop linksigns %0%"
|
||||
"addsign-success": "Skylten har lagts till i %lang:region%."
|
||||
"addsign-successProfile": "Skylten har lagts till i %lang:region% med profil %0%."
|
||||
"addsign-alreadyRegistered": "Den skylten är redan registrerad för %lang:region%."
|
||||
"addsign-noPermission": "Du har inte rättigheterna för att lägga till en skylt."
|
||||
"delsign-noSign": "Du tittar inte på en skylt."
|
||||
"delsign-noPermission": "Du har inte rättigheterna att ta bort en skylt."
|
||||
"delsign-noRegion": "Den skylten tillhör inte en AreaShop region."
|
||||
"delsign-success": "Skylten har tagits bort från regionen %lang:region%."
|
||||
"me-noPermission": "Du har inte rättigheterna att kolla vilka regioner du har."
|
||||
"me-header": "Regioner för %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "Du är inte en spelare så du kan inte ha någon region."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
|
||||
- "%timeleft% kvar"
|
||||
- " hover: tills %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[nollställ] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[nollställ] %lang:region% [gray]("
|
||||
- "ägd av %lang:player%"
|
||||
- " hover: Du är tillagd som vän"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% har inte hyrt eller köpt någon region och är inte tillagd som vän i någon."
|
||||
"me-noPlayer": "%0% hittades inte, antagligen aldrig varit på servern."
|
||||
"me-clickHint": "[gray][italic]Klicka en regions namn för att se detaljer."
|
||||
"setowner-help": "/as setowner <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
|
||||
"setowner-noPermission": "Du har inte rättigheterna att bestämma ägare av en region."
|
||||
"setowner-noPermissionRent": "Du har inte rättigheterna att bestämma ägare av hyrda regioner."
|
||||
"setowner-noPermissionBuy": "Du har inte rättigheterna att bestämma ägare av köpta regioner."
|
||||
"setowner-notRegistered": "Den specifierade regionen är inte registrerad, ägare kan inte bestämmas."
|
||||
"setowner-noPlayer": "Kunde inte få fram UUID ab specifierad spelare: %0%."
|
||||
"setowner-succesRent": "Ägare av %lang:region% har ändrats till %lang:player%, hyrd till %until% (%timeleft% kvar)."
|
||||
"setowner-succesRentExtend": "Ägaren var redan %lang:player%, hyrtid utökad med '%duration%', hyrs nu till %until% (%timeleft% kvar)."
|
||||
"setowner-succesBuy": "Ägare av %lang:region% ändrad till %lang:player%."
|
||||
"resell-help": "/as resell <pris> [region], regionen du står i kommer användas om inte annan specifieras."
|
||||
"resell-wrongPrice": "'%0%' är inte ett giltigt pris."
|
||||
"resell-notRegistered": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"resell-notBought": "Du kan inte återsälja %lang:region% för den är inte såld än."
|
||||
"resell-success": "%lang:region% är satt till återsäljning för %resellprice%."
|
||||
"resell-noPermission": "Du har inte rättigheterna att sätta ut din region i återsäljningsläge."
|
||||
"resell-noPermissionOther": "Du har inte rättigheterna att sätta ut regioner i återsäljningsläge."
|
||||
"stopresell-help": "/as stopresell [region], regionen du står i kommer användas om inget annat specifieras."
|
||||
"stopresell-notRegistered": "Den specifierade regionen är inte registrerad: %0%."
|
||||
"stopresell-notResell": "Du kan inte avsluta en återsäljning av %lang:region% för den är inte i återsäljningsläge."
|
||||
"stopresell-success": "%lang:region% är återsatt i sålt läge."
|
||||
"stopresell-noPermission": "Du har inte rättigheterna att ändra tillbaka din region till sålt läge."
|
||||
"stopresell-noPermissionOther": "Du har inte rättigheterna att ändra tillbaka regioner till sålt läge."
|
||||
"addfriend-help": "/as addfriend <spelare> [region], regionen du står i kommer användas om ingen annan specifieras."
|
||||
"addfriend-noPermissionOther": "Du har inte rättigheterna att lägga till vänner i regioner som inte tillhör dig."
|
||||
"addfriend-noPermission": "Du har inte rättigheterna att lägga till vänner i dina regioner."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% har lagts till som vän i region %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% har lagts till som vän i din region %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% är redan tillagd som vän i %lang:region%."
|
||||
"addfriend-self": "Att lägga till en ägare av en region som vän vore meningslöst."
|
||||
"addfriend-noOwner": "Du kan inte lägga till vänner till en region som saknar ägare."
|
||||
"addfriend-notVisited": "Du kan inte lägga till %0% för han har inte besökt servern ännu."
|
||||
"delfriend-help": "/as delfriend <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
|
||||
"delfriend-noPermissionOther": "Du har inte rättigheterna att ta bort vänner från regioner som inte tillhör dig."
|
||||
"delfriend-noPermission": "Du har inte rättigheterna att ta bort vänner från din region."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% har tagits bort som vän från region %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% har tagits bort som vän från din region %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% är inte tillagd som vän i %lang:region%."
|
||||
"delfriend-noOwner": "Du kan inte ta bort en vän från en region som saknar ägare."
|
||||
"linksigns-multipleRegions": "Hittade flera regioner: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "Klicka en annan gång för att försöka igen eller använd '/as linksigns' för att sluta."
|
||||
"linksigns-noRegions": "Hittade ingen AreaShop region åt det hållet din markör pekar, försäkra att regionen är tillagd i AreaShop [gray](maximalt avstånd 100 block)."
|
||||
"linksigns-regionFound": "Region %lang:region% har hittats, sikta mot en skylt och vänsterklicka för att länka den."
|
||||
"linksigns-signFound": "Hittade en skylt vid (%0%, %1%, %2%), sikta mot en region nu och högerklicka för att länka den."
|
||||
"linksigns-noSign": "Ingen skylt hittades åt det hållet din markering är vänd, försäkra dig att du har fri sikt mot en skylt och klicka igen [gray](maximalt avstånd 100 block)."
|
||||
"linksigns-alreadyRegistered": "Den skylten är redan registrerad för region %lang:region%, klicka igen för att välja en annan skylt."
|
||||
"linksigns-first": "Du har gått in i skylt-länknings läge."
|
||||
"linksigns-next": "[gray]Vänsterklicka för att välja en skylt, högerklicka för att välja en region, använd /as linksigns för att avsluta."
|
||||
"linksigns-noPermission": "Du har inte rättigheterna för att gå in i mass-länknings läge."
|
||||
"linksigns-stopped": "Avslutade skylt-länknings läge."
|
||||
"stack-help":
|
||||
- "/as stack <mängd> <mellanrum> <namn> <rent|buy> [grupp].[break]"
|
||||
- " [gray]<mängd> Antal regioner som kommer skapas.[break]"
|
||||
- " [gray]<mellanrum> Avstånd i antal block mellan regionerna.[break]"
|
||||
- " [gray]<namn> Namnet på regionerna (numrering kommer hamna efter det).[break]"
|
||||
- " [gray]<rent|buy> Skapa hyr- eller köpregioner.[break]"
|
||||
- " [gray][group] En grupp att lägga till de skapade regionerna i.[break]"
|
||||
- " [gray]Regionerna kommer skapas åt det håll du är vänd åt."
|
||||
"stack-accepted": "Börjar skapa %0% %1% regioner med %2% block iemellan, namnen startar med %3% och har ett nummer efter sig.%4%"
|
||||
"stack-addToGroup": " Skapade regioner kommer läggas till i gruppen '%0%'."
|
||||
"stack-noPermission": "Du har inte rättigheterna att skapa och lägga till regioner i AreaShop i massläge."
|
||||
"stack-wrongAmount": "'%0%' är inte ett correct antal regioner."
|
||||
"stack-wrongGap": "'%0%' är inte ett correct nummer för antalet blocks mellanrum mellan regioner."
|
||||
"stack-noSelection": "Du har ingenting valt som visar var första regionen ska skapas."
|
||||
"stack-addStart": "[gray]Lägger till %0% regioner vid %1% per sekund."
|
||||
"setlandlord-help": "/as setlandlord <spelare> [region], regionen du står i kommer användas om inget annat specifieras."
|
||||
"setlandlord-noPermission": "Du har inte rättigheterna att bestämma en hyresvärd för en region."
|
||||
"setlandlord-success": "%lang:landlord% har satts in som hyresvärd för %lang:region%."
|
||||
"message-help": "/as message <spelare> <meddelande...>"
|
||||
"message-noPermission": "Du har inte rättigheterna för att skicka AreaShop meddelanden."
|
||||
"message-notOnline": "%0% är inte online."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%Är du säker på att du vill hyra %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att hyra %0%|%"
|
||||
- " hover: %lang:action|Rent %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%Är du säker på att du vill förlänga %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att förlänga %0%|%"
|
||||
- " hover: %lang:action|Extend %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%Är du säker på att du vill sluta hyra %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sluta hyra %0%|%"
|
||||
- " hover: %lang:action|Stop renting %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%Är du säker på att du vill köpa %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att köpa %0%|%"
|
||||
- " hover: %lang:action|Buy %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%Är du säker på att du vill sälja %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|Klicka för att sälja %0%|%"
|
||||
- " hover: %lang:action|Sell %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% år"
|
||||
"timeleft-months": "%0% månader"
|
||||
"timeleft-days": "%0% dagar"
|
||||
"timeleft-hours": "%0% timmar"
|
||||
"timeleft-minutes": "%0% minuter"
|
||||
"timeleft-second": "%0% sekund"
|
||||
"timeleft-seconds": "%0% sekunder"
|
||||
"timeleft-ended": "Utgånget"
|
||||
"greeting-forrent": "%region% kan hyras för %price% per %duration%."
|
||||
"greeting-rented": "%region% hyrs av %player% fram till %until%."
|
||||
"greeting-forsale": "%region% kan köpas för %price%."
|
||||
"greeting-bought": "%region% är köpt av %player%."
|
||||
@@ -0,0 +1,518 @@
|
||||
# ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
# ║ Language file of the AreaShop plugin created by NLThijs48, Github can be found at https://github.com/NLthijs48/AreaShop
|
||||
# ║ Chinese language file, plugin version 2.5.0, 393/428 messages are translated (92%)
|
||||
# ║
|
||||
# ║ This file will be overwritten at each startup/reload of the plugin, if you want to change anything then do the following:
|
||||
# ║ 1: Make a copy of this file
|
||||
# ║ 2: Rename it to `servername.yml`
|
||||
# ║ 3: Change the `language` setting in config.yml to `servername`, do not include `.yml`
|
||||
# ║ 4: Change the messages in the new file to your liking
|
||||
# ║ 5: Use `/as reload`or reload/restart your server to see the changes
|
||||
# ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
|
||||
|
||||
"action": "[gold][bold]<%0%>[/bold]"
|
||||
"button": "[bold]<%0%>[/bold]"
|
||||
"command":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: %lang:action|点击自动使用 %1%|%"
|
||||
- " command: %1%"
|
||||
"helpCommand":
|
||||
- "[gold]%0% [gray]-[reset]"
|
||||
- " hover: %lang:action|点击自动使用 %0%|%"
|
||||
- " command: %0%"
|
||||
"region": "%lang:tRegion|%region%|%"
|
||||
"tRegion":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Region %0%"
|
||||
- " hover: %lang:action|区域信息|%"
|
||||
- " command: /areashop info region %0%"
|
||||
"player": "%lang:tPlayer|%player%|%"
|
||||
"tPlayer":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Player %0%"
|
||||
- " hover: %lang:action|区域 %0%|%"
|
||||
- " command: /areashop info player %0%"
|
||||
"landlord":
|
||||
- "[bold]%landlord%[/bold]"
|
||||
- " hover: Landlord %landlord%"
|
||||
- " hover: %lang:action|区域 %landlord%|%"
|
||||
- " command: /areashop info player %landlord%"
|
||||
"total-maximum": "你不能租用和购买超过总共的 %0% 区域 (你在区域 '%2%'已经拥有了 %1% 区域商店)."
|
||||
"general-notReady": "区域商店还没有加载成功,请稍候..."
|
||||
"general-noWorld": "你无法这样做, 在这个世界 %lang:region% 无法使用 (当前世界:'%world%')."
|
||||
"general-noRegion": "你无法这样做, 这块区域商店无法使用 (区域: %lang:region%)."
|
||||
"general-noEconomy": "没有安装经济插件或者安装有误,请通知服务器管理员..."
|
||||
"general-cancelled": "%0%"
|
||||
"cmd-notValid": "你输入的命令不正确, 用法 '/as help' 获取更多信息."
|
||||
"cmd-onlyByPlayer": "这个命令只能给玩家使用."
|
||||
"cmd-weOnlyByPlayer": "请使用 创世神 选择区域,指定区域后再使用指令."
|
||||
"cmd-noSelection": "你不能使用 创世神 的选择功能."
|
||||
"cmd-noRegionsFound": "你选择的区域没有区域商店."
|
||||
"cmd-noWERegionsFound": "没有找到与你的选择相交的WorldEdit区域."
|
||||
"cmd-notRegistered": "区域 '%0%' 再区域商店中不可用."
|
||||
"cmd-noRegion": "'%0%' 不是一个有效的WorldGuard区域."
|
||||
"cmd-noRegionsAtLocation": "在你的位置找不到你想要的区域类型,请指定区域再使用指令."
|
||||
"cmd-moreRegionsAtLocation": "在你的位置找到多个区域,请指定区域再使用指令."
|
||||
"cmd-automaticRegionOnlyByPlayer": "自动确定区域只适用于玩家,请指定区域再使用指令."
|
||||
"help-header": "&f帮助信息,可以点击彩色字体使用命令————&2由 BenLi豪 翻译&f."
|
||||
"help-noPermission": "你没有权限去查看所有命令."
|
||||
"help-alias": "缩写命令: /areashop, /as."
|
||||
"help-help": "%lang:helpCommand|/as help|% 显示所有命令."
|
||||
"help-info": "%lang:helpCommand|/as info|% 获取有关当前区域商店的信息."
|
||||
"help-rent": "%lang:helpCommand|/as rent|% 租用或续费区域商店."
|
||||
"help-buy": "%lang:helpCommand|/as buy|% 购买一块区域商店."
|
||||
"help-unrent": "%lang:helpCommand|/as unrent|% 取消租用并返还一定的金币."
|
||||
"help-sell": "%lang:helpCommand|/as sell|% 出售自己的区域商店."
|
||||
"help-reload": "%lang:helpCommand|/as reload|% 重新加载所有配置文件并刷新区域信息."
|
||||
"help-setrestore": "%lang:helpCommand|/as setrestore|% 设置恢复 开/关 或选择配置文件."
|
||||
"help-setprice": "%lang:helpCommand|/as setprice|% 改变区域商店的价格."
|
||||
"help-setduration": "%lang:helpCommand|/as setduration|% 改变租用区域的租用时间."
|
||||
"help-teleport": "%lang:helpCommand|/as tp|% 传送到指定的区域商店."
|
||||
"help-setteleport": "%lang:helpCommand|/as settp|% 设置一个区域商店的传送位置"
|
||||
"help-find": "%lang:helpCommand|/as find|% 寻找一块无主人的区域商店并且传送到那里."
|
||||
"help-groupadd": "%lang:helpCommand|/as groupadd|% 向某组添加区域商店."
|
||||
"help-groupdel": "%lang:helpCommand|/as groupdel|% 从某组删除区域商店."
|
||||
"help-grouplist": "%lang:helpCommand|/as grouplist|% 显示当前注册的所有组."
|
||||
"help-groupinfo": "%lang:helpCommand|/as groupinfo|% 显示有关组的信息."
|
||||
"help-schemevent": "%lang:helpCommand|/as schemevent|% 触发一个区域的事件."
|
||||
"help-add": "%lang:helpCommand|/as add|% 添加一个区域作为租用或购买"
|
||||
"help-del": "%lang:helpCommand|/as del|% 移除已注册的区域商店."
|
||||
"help-addsign": "%lang:helpCommand|/as addsign|% 在所在的区域复制木牌信息(对准新建好的木牌使用)."
|
||||
"help-delsign": "%lang:helpCommand|/as delsign|% 删除你准心位置的木牌."
|
||||
"help-me": "%lang:helpCommand|/as me|% 检查这块区域商店信息."
|
||||
"help-setowner": "%lang:helpCommand|/as setowner|% 设置/更改区域商店的主人."
|
||||
"help-resell": "%lang:helpCommand|/as resell|% 转售自己已购买的区域."
|
||||
"help-stopResell": "%lang:helpCommand|/as stopresell|% 停止自己正在转售的区域."
|
||||
"help-addFriend": "%lang:helpCommand|/as addfriend|% 添加玩家使用区域的权限."
|
||||
"help-delFriend": "%lang:helpCommand|/as delfriend|% 移除玩家使用区域的权限."
|
||||
"help-linksigns": "%lang:helpCommand|/as linksigns|% 创建关联区域商店牌子."
|
||||
"help-stack": "%lang:helpCommand|/as stack|% 创建多个区域并添加它们到某权限组."
|
||||
"help-setlandlord": "%lang:helpCommand|/as setlandlord|% 设置一个区域的主人."
|
||||
"rent-help": "/as rent [区域名称], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"rent-noPermission": "你没有租用区域的权限."
|
||||
"rent-maximum": "你不能租用超过%0%个区域商店 (你所在的'%2%'权限组只能租用%1%个商店)."
|
||||
"rent-maximumExtend": "你不能再续费,因为你超过 %0% 的区域 (你所在的'%2%'权限组只能租用%1%个商店)."
|
||||
"rent-payError": "付款后出现问题,请稍后再试."
|
||||
"rent-rented": "你成功租用了 %lang:region% 区域,租期结束时间为:%until%, 想要续费就右键牌子 或 使用 /as rent."
|
||||
"rent-extended": "你成功续租了 %lang:region%区域,租期结束时间为: %until%."
|
||||
"rent-extendedToMax": "你成功续费了 %lang:region% 区域,租期结束时间为 %until% (这是最高的租用时间:%maxrenttime%)."
|
||||
"rent-lowMoneyExtend": "你没有足够的金币续租了 (你现在拥有 %0% 金币,但是你还需要 %price% 金币)."
|
||||
"rent-lowMoneyRent": "你没有足够的金币租用 %lang:region% (你现在拥有 %0% 金币,但是你还需要 %price% 金币)."
|
||||
"rent-someoneElse": "已经有人租用了 %lang:region% 区域."
|
||||
"rent-notRentable": "这块区域不能租用."
|
||||
"rent-maxExtends": "你不能再续费了 (最高租用期限 %maxextends%), 等租期到期后,你可以重新租用 %lang:region% 区域."
|
||||
"rent-maxRentTime": "你不能提前租用 %lang:region% , 最高期限为 %maxrenttime% 还有你目前剩余的租期时间为: %timeleft%."
|
||||
"rent-restrictedToWorld": "你需要在:'%world%' 世界里,租用区域: %lang:region% (你目前在 '%0%')."
|
||||
"rent-restrictedToRegion": "你需要在区域 %lang:region% 里出租它."
|
||||
"rent-expireWarning": "你的区域商店 %lang:region% 剩下时间为 %timeleft% , 如果你想保留请续费吧(如果不续费请提前清理你租用区域的物品)."
|
||||
"rent-expiringSoon": "你的区域 %lang:tRegion|%0%|% 剩下 %1%,如果你想保留就续费(如果不续费请提前清理你租用区域的物品)."
|
||||
"rent-alreadyAtFull": "%lang:region% 已经是最长的租金时间了,你不能再延长了."
|
||||
"buy-help": "/as buy [region], 你所在的区域将被选定使用,如果没有你没有明确的选择自己要的区域."
|
||||
"buy-noPermission": "你没有购买区域的权限.."
|
||||
"buy-noPermissionResell": "你无权在转售模式下购买区域."
|
||||
"buy-noPermissionNoResell": "你没有权限购买不在转售模式的区域."
|
||||
"buy-notBuyable": "区域 %lang:region% 不能购买."
|
||||
"buy-maximum": "你不能为购买该区域,因为你超过%0%区域 (你目前在 %1% 组已经拥有 '%2%')."
|
||||
"buy-payError": "付款后出现问题,请稍后再试."
|
||||
"buy-succes": "祝贺你成功购买了该区域: %lang:region%."
|
||||
"buy-successResale": "你在玩家 %lang:tPlayer|%0%|%那里成功购买了区域: %lang:region% ."
|
||||
"buy-successSeller": "你的区域 %lang:region% 已经转售给了 %lang:player% 来自 %0%."
|
||||
"buy-lowMoney": "你没有足够的金币购买该区域%lang:region% (目前拥有 %0% 金币,你需要 %price% 金币)."
|
||||
"buy-lowMoneyResell": "你没有足够的金币购买该区域 %lang:region% (你需要 %0% ,你需要 %resellprice%)."
|
||||
"buy-yours": "你已经是%lang:region%区域的主人了."
|
||||
"buy-someoneElse": "这块区域 %lang:region% 已被玩家购买了."
|
||||
"buy-restrictedToWorld": "你需要在 '%world%' 中购买 %lang:region% (你所在位置:'%0%')."
|
||||
"buy-restrictedToRegion": "你需要在 %lang:region% 内购买."
|
||||
"unrent-help": "/as unrent [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"unrent-noPermission": "你没有租用地区的权限."
|
||||
"unrent-noPermissionOther": "你没有权限出租另一个地区."
|
||||
"unrent-notRegistered": "该地区由于没有注册出租功能而无法租用."
|
||||
"unrent-notRented": "该区域不可以放弃出租,因为它还没有被玩家租用."
|
||||
"unrent-unrented": "%lang:player% 的 %lang:region% 已过期."
|
||||
"unrent-expired": "你的区域商店 %lang:region% 已过期."
|
||||
"sell-help": "/as sell [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"sell-notRegistered": "该地区由于没有注册购买而无法出售."
|
||||
"sell-notBought": "该地区不能出售,因为它不属于你."
|
||||
"sell-sold": "%lang:player% 的 %lang:region% 已售出."
|
||||
"sell-noPermission": "你没有出售地区商店的权限."
|
||||
"sell-noPermissionOther": "你没有权限出售该区域。"
|
||||
"reload-reloading": "重新加载所有文件,并检查租金和更新区域."
|
||||
"reload-noPermission": "你没有权限重新加载配置文件."
|
||||
"reload-updateCommandChanged": "'/as updaterents' 和 '/as updatebuys' 已被移除, '/as reload' 也会更新现在的区域,所以使用该命令."
|
||||
"info-help":
|
||||
- "/as info[break]"
|
||||
- " %lang:command|所有相关|/as info all|%[break]"
|
||||
- " %lang:command|已被租用|/as info rented|% [group] [page][break]"
|
||||
- " %lang:command|等待被租用的商店|/as info forrent|% [group] [page][break]"
|
||||
- " %lang:command|已被购买|/as info sold|% [group] [page][break]"
|
||||
- " %lang:command|等待被购买的商店|/as info forsale|% [group] [page][break]"
|
||||
- " %lang:command|转售中的商店|/as info reselling|% [group] [page][break]"
|
||||
- " %lang:command|组里面能使用的区域商店|/as info nogroup [page]|%[break]"
|
||||
- " %lang:command|当前区域商店信息|/as info region|% [region]"
|
||||
"info-noPermission": "你没有权限获取有关区域商店的信息."
|
||||
"info-allHeader": "所有区域商店%0%:"
|
||||
"info-rentedHeader": "出租区域商店%0%:"
|
||||
"info-forrentHeader": "出租区域商店%0%:"
|
||||
"info-forsaleHeader": "出售区域商店%0%:"
|
||||
"info-soldHeader": "出售区域商店%0%:"
|
||||
"info-resellingHeader": "转售区域商店%0%:"
|
||||
"info-nogroupHeader": "没有组的区域商店%0%:"
|
||||
"info-limitedToGroup": " (限制的权限组 %0%)"
|
||||
"info-nogroupNone": "所有权限组都没有添加区域商店."
|
||||
"info-noFiltergroup": "权限组 '%0%' 不存在,因此不能用于限制结果."
|
||||
"info-noRegions": "没有找到任何区域商店."
|
||||
"info-wrongPage": "%0% 错误的页码."
|
||||
"info-entryForrent": "[darkgreen][bold]►[reset] %lang:region%: [gray]出租每 %duration%需要 %price% 金币."
|
||||
"info-entryRented": "[darkgreen][bold]►[reset] %lang:region%: [gray]租给 %lang:player%."
|
||||
"info-entryForsale": "[darkgreen][bold]►[reset] %lang:region%: [gray]出售 %price%."
|
||||
"info-entrySold": "[darkgreen][bold]►[reset] %lang:region%: [gray]卖给 %lang:player%."
|
||||
"info-entryReselling": "[darkgreen][bold]►[reset] %lang:region%: [gray]卖给 %lang:player% (转售)."
|
||||
"info-pageStatus": "[gold]页数 %0%/%1%"
|
||||
"info-pageNoPrevious":
|
||||
- " [darkgray][bold]◄前一页[/bold] "
|
||||
- " hover: 前一页"
|
||||
"info-pageNoNext":
|
||||
- " [darkgray][bold]下一页►[/bold]"
|
||||
- " hover: 这已经是最后一页了"
|
||||
"info-playerHelp": "/as info player <name>."
|
||||
"info-playerRents": "该区域已被租用,拥有者是: %lang:tPlayer|%0%|%: [gray]%1%"
|
||||
"info-playerNoRents": "%lang:tPlayer|%0%|% 没有出租区域商店."
|
||||
"info-playerBuys": "该区域已被购买,拥有者是: %lang:tPlayer|%0%|%: [gray]%1%."
|
||||
"info-playerNoBuys": "%lang:tPlayer|%0%|% 没有买过区域商店."
|
||||
"info-regionHelp": "/as info region [name], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"info-regionHeaderRent": "[darkgreen]信息 %lang:region%:"
|
||||
"info-regionHeaderBuy": "[darkgreen]信息 %lang:region%:"
|
||||
"info-regionRented": "[darkgreen][bold]►[reset] 区域主人 %lang:player% 租约期限: [gray]%until%."
|
||||
"info-regionBought": "[darkgreen][bold]►[reset] 区域主人 %lang:player%."
|
||||
"info-regionReselling": "[darkgreen][bold]►[reset] 区域主人 %lang:player%, 目前正在转售."
|
||||
"info-regionExtending":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]点击续费租期[/bold]"
|
||||
- " hover: 点击续费租期: %region%"
|
||||
- " hover: %duration% 花费 %price%"
|
||||
- " hover: %lang:action|租期续费 %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]每 %duration%需要%price%金币."
|
||||
"info-regionCanBeRented":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]出租信息[/bold]"
|
||||
- " hover: 出租 %region% 每 %duration% 需要 %price% 金币"
|
||||
- " hover: %lang:action|出租 %region%|%"
|
||||
- " command: /areashop rent %region%"
|
||||
- ": [gray]每 %duration%需要%price%金币."
|
||||
"info-regionCanBeBought":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]Buy for[/bold]"
|
||||
- " hover: Buy %region% for %price%"
|
||||
- " hover: %lang:action|Buy %region%|%"
|
||||
- " command: /areashop buy %region%"
|
||||
- ": [gray]%price%."
|
||||
"info-regionReselPrice": "[darkgreen][bold]►[reset] 转售价格: [gray]%resellprice% (你可以购买 %lang:player%)."
|
||||
"info-regionFriends": "[darkgreen][bold]►[reset] 添加好友: [gray]%0%."
|
||||
"info-friend": "%lang:tPlayer|%0%|%"
|
||||
"info-friendRemove":
|
||||
- "%lang:info-friend|%0%|%"
|
||||
- "[red]✕[gray]"
|
||||
- " hover: Region %region%"
|
||||
- " hover: %lang:action|移除 %0% 好友|%"
|
||||
- " command: /areashop delfriend %0% %region%"
|
||||
"info-regionMoneyBackBuy": "[darkgreen][bold]►[reset] 出售返还金: [gray]%moneyback% (%moneybackpercent%% 的价格)."
|
||||
"info-regionMoneyBackBuyClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]点击执行出售和获得一部分金币[/bold]"
|
||||
- " hover: 出售 %region% 可以收到:%moneyback% 金币"
|
||||
- " hover: %lang:action|出售 %region%|%"
|
||||
- " command: /areashop sell %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% 的价格)."
|
||||
"info-regionMoneyBackRent": "[darkgreen][bold]►[reset] 放弃租用: [gray]%moneyback% (%moneybackpercent%% 剩余时间)."
|
||||
"info-regionMoneyBackRentClick":
|
||||
- "[darkgreen][bold]►[reset] "
|
||||
- "[bold]点击放弃租用&获得一部分金币[/bold]"
|
||||
- " hover: 放弃租用 %region% 可以取回:%moneyback% 金币"
|
||||
- " hover: %lang:action|放弃租用 %region%|%"
|
||||
- " command: /areashop unrent %region%"
|
||||
- ": [gray]%moneyback% (%moneybackpercent%% 剩余时间."
|
||||
"info-regionMaxExtends": "[darkgreen][bold]►[reset] 最大续费次数: [gray]%maxextends% ."
|
||||
"info-regionNoExtending": "[darkgreen][bold]►[reset] 不能再续费了."
|
||||
"info-regionExtendsLeft": "[darkgreen][bold]►[reset] 续费剩余次数: [gray]%extendsleft% 超过 %maxextends%."
|
||||
"info-regionMaxRentTime": "[darkgreen][bold]►[reset] 提前出租: [gray]%maxrenttime% 最大值"
|
||||
"info-prefix": "[darkgreen][bold]►[reset] "
|
||||
"info-regionTeleport":
|
||||
- "[bold]点击传送到指定区域[/bold]"
|
||||
- " hover: %lang:action|传送到 %region%|%"
|
||||
- " command: /areashop tp %region%"
|
||||
"info-setRegionTeleport":
|
||||
- "[bold]点击设置脚下为传送点[/bold]"
|
||||
- " hover: %region%"
|
||||
- " hover: %lang:action|设置脚下为传送点|%"
|
||||
- " command: /areashop settp %region%"
|
||||
"info-regionSigns": "[darkgreen][bold]►[reset] 关联木牌的所在坐标: [gray]%0%."
|
||||
"info-regionSignLocation": "[gray](%0%, %1%, %2%, %3%)[reset]"
|
||||
"info-regionGroups": "[darkgreen][bold]►[reset] 分配组: [gray]%0%."
|
||||
"info-regionInactiveUnrent": "[darkgreen][bold]►[reset] 自动取消出租: [gray]%inactivetime% 如果玩家不活跃."
|
||||
"info-regionInactiveSell": "[darkgreen][bold]►[reset] 自动出售: [gray]%inactivetime% 如果玩家不活跃后区域自动出售."
|
||||
"info-regionRestrictedRegionRent": "[darkgreen][bold]►[reset] 你需要在 %lang:region% 内出售."
|
||||
"info-regionRestrictedWorldRent": "[darkgreen][bold]►[reset] 你需要在世界 '%world%' 出租 %lang:region%."
|
||||
"info-regionRestrictedRegionBuy": "[darkgreen][bold]►[reset] 你需要在 %lang:region% 内购买."
|
||||
"info-regionRestrictedWorldBuy": "[darkgreen][bold]►[reset] 你需要在世界里面 '%world%' 去购买 %lang:region%."
|
||||
"info-regionRestoringRent": "[darkgreen][bold]►[reset] 恢复启用 [gray](区域将重置)."
|
||||
"info-regionRestoringBuy": "[darkgreen][bold]►[reset] 恢复启用 [gray](区域将重新出售)."
|
||||
"info-regionLandlord": "[darkgreen][bold]►[reset] 区域主人: [gray]%lang:landlord% (收到金币)."
|
||||
"info-regionNotExisting": "指定区域未注册: %0%."
|
||||
"setrestore-help": "/as setrestore <region> <true|false|general> [profile]."
|
||||
"setrestore-noPermission": "你没有恢复设置的权限."
|
||||
"setrestore-notRegistered": "指定区域未注册: %0%."
|
||||
"setrestore-invalidSetting": "'%0%' 不是有效的状态, 应该是 true, false 或者 general."
|
||||
"setrestore-success": "成功将 %lang:region% 的恢复设置设置为 '%0%'."
|
||||
"setrestore-successProfile": "成功将%lang:region%的恢复设置为'%0%',并将配置文件设置为'%1%'."
|
||||
"setprice-noPermission": "你没有权限更改区域的价格."
|
||||
"setprice-help": "/as setprice <price> [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"setprice-notRegistered": "指定区域未注册: %0%."
|
||||
"setprice-wrongPrice": "'%0%' 不是有效的价格."
|
||||
"setprice-successRent": "区域价格%lang:region% 改为 每 %duration%需要%price%金币."
|
||||
"setprice-successBuy": "区域价格 %lang:region% 改为 %price%."
|
||||
"setprice-successRemoved": " %lang:region% 的租期价格已被删除, 现在将使用一个组或default.yml文件中的租期价格, 新的租期价格: %price%."
|
||||
"setprice-noLandlord": "你没有权限更改价格,因为你不是 %lang:region% 的主人."
|
||||
"setduration-noPermission": "你没有权限更改出租期限."
|
||||
"setduration-help": "/as setduration <amount> <identifier> [region], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"setduration-notRegistered": "%0% 区域还没有注册出租."
|
||||
"setduration-wrongAmount": "'%0%'不是有效的数量,请使用一个整数."
|
||||
"setduration-wrongFormat": "'%0%' 不正确的时间格式,请检查清楚."
|
||||
"setduration-success": "租期时间为:%lang:region% 现在已改为:'%duration%'."
|
||||
"setduration-noLandlord": "你没有更改租期时间的权限,因为你不是 %lang:region% 的主人."
|
||||
"setduration-successRemoved": " %lang:region% 的租期时间已被删除, 现在将使用一个组或default.yml文件中的默认租期时间, 新的租期时间: %duration%."
|
||||
"setup-noRegion": "你没有在第二行指定区域."
|
||||
"setup-alreadyRentSign": "你指定的区域已经添加到区域商店作为出售区域, 给木牌第一行添加 [as] 或者使用指令 '/as addsign'."
|
||||
"setup-alreadyBuySign": "你指定的区域已经添加到区域商店作为购买区域, 给木牌第一行添加 [as] 或者使用指令 '/as addsign'."
|
||||
"setup-noDuration": "你没有指定该区域可以租多长时间,请在第三行执行此操作。"
|
||||
"setup-wrongDuration": "指定的时间不是正确的格式,例如:1 day."
|
||||
"setup-noPrice": "你没有在第四行指定价格."
|
||||
"setup-wrongPrice": "你没有正确设置价格,仅使用数字."
|
||||
"setup-rentSuccess": "成功设置出售区域 %lang:region% ."
|
||||
"setup-buySuccess": "成功设置购买区域 %lang:region% ."
|
||||
"setup-noPermissionRent": "你没有设置出售区域的权限."
|
||||
"setup-noPermissionBuy": "你没有设置购买区域的权限."
|
||||
"setup-couldNotDetect": "找到具有相同优先级和父/子关系的多个区域, 在第二行指定一个 (有2个被发现的区域: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"setup-blacklisted": "%0% 在黑名单上,不能添加到区域商店."
|
||||
"setup-noPermission": "你不能添加区域' '%0%', 你不是所有者/成员或没有权限."
|
||||
"destroy-noPermissionRent": "你没有注销租赁区域的权限."
|
||||
"destroy-noPermissionBuy": "你无权取消注册购买区域."
|
||||
"destroy-successRent": "%lang:region% 区域成功注销出租."
|
||||
"destroy-successBuy": "%lang:region% 区域成功注销购买."
|
||||
"teleport-help": "/as tp <region> [木牌ID]."
|
||||
"teleport-noRentOrBuy": "指定区域未注册: %0%."
|
||||
"teleport-noPermission": "你没有权限传送到你所在的区域."
|
||||
"teleport-noPermissionOther": "你没有权限传送到不属于你的区域."
|
||||
"teleport-noPermissionSign": "你没有权限传送到你所在区域的木牌位置."
|
||||
"teleport-noPermissionOtherSign": "你没有权限传送到你没拥有的区域的木牌位置."
|
||||
"teleport-noPermissionFriend": "你没有权限作为好友的身份传送到该区域."
|
||||
"teleport-noPermissionFriendSign": "你没有权限传送到你添加好友的区域木牌位置."
|
||||
"teleport-noPermissionAvailable": "你没有权限传送到可使用的区域."
|
||||
"teleport-noPermissionAvailableSign": "你没有权限传送到可使用区域的木牌位置."
|
||||
"teleport-success": "传送到 %lang:region%中..."
|
||||
"teleport-successSign": "你传送到 %lang:region% 的木牌位置附近."
|
||||
"teleport-noSafe": "在区域 %lang:region%中找不到安全位置, 区域内没有具体的点或超过最大尝试次数 (%0%/%1%)."
|
||||
"teleport-blocked": "你不能传送,因为位置在该区域以外,你被迫传送到里面."
|
||||
"teleport-changedToSign": "你只能传送到该区域的木牌地点,而不是在区域内传送."
|
||||
"teleport-changedToNoSign": "没有木牌可以传送,尝试在该区域内传送."
|
||||
"setteleport-help": "/as settp [region] [reset], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"setteleport-noPermission": "你没有设置传送位置的权限."
|
||||
"setteleport-noPermissionOther": "你没有权限给不属于你的区域设置传送点."
|
||||
"setteleport-noRentOrBuy": "指定区域未注册到区域商店: %0%."
|
||||
"setteleport-success": "区域%lang:region% 传送点已设置成功."
|
||||
"setteleport-notInside": "该地点必须在该区域内."
|
||||
"setteleport-reset": "%lang:region% 的传送位置已重置."
|
||||
"find-help": "/as find <buy|rent> [最高价格] [group]."
|
||||
"find-noPermission": "你没有权限搜索区域和传送到那里."
|
||||
"find-success": "发现 %0% 区域: %lang:region%, 以你的身上金币的最高价格进行搜索: %1%%2%."
|
||||
"find-successMax": "发现 %0% 区域,同时以最高价格%1%%2%进行搜索"
|
||||
"find-wrongMaxPrice": "指定的最高价格不是正确的数字: %0%."
|
||||
"find-wrongGroup": "指定的权限组不存在: %0%."
|
||||
"find-noneFound": "在你的余额最大价格搜索时找不到%0%的区域:%1%%2%."
|
||||
"find-noneFoundMax": "在最大价格为%1%%2%的情况下搜索时找不到要%0%的区域."
|
||||
"find-onlyInGroup": ", 只搜索权限组中的区域: %0%."
|
||||
"groupadd-help": "/as groupadd <group> [region], 如果没有指定区域,使用创世神选择区域."
|
||||
"groupadd-noPermission": "你没有将区域添加到权限组的权限。"
|
||||
"groupadd-success": "区域 %lang:region% 已经被添加到权限组 '%0%', 现在这个权限组有 %1% 个区域."
|
||||
"groupadd-failed": "区域 %lang:region% 已经是权限组的成员 '%0%'."
|
||||
"groupadd-weSuccess": "加入群组 %0%: [gray]%1%."
|
||||
"groupadd-weFailed": "已经在群组中 %0%: [gray]%1%."
|
||||
"groupdel-help": "/as groupdel <group> [region], 如果没有指定区域,使用创世神选择区域."
|
||||
"groupdel-noPermission": "你没有从权限组中删除区域的权限."
|
||||
"groupdel-success": "区域 %lang:region% 已经从权限组 '%0%' 中删除, 现在这个权限组拥有 %1% 个区域."
|
||||
"groupdel-failed": "区域 %lang:region% 不是权限组的成员 '%0%'."
|
||||
"groupdel-weSuccess": "从组中移除 %0%: [gray]%1%."
|
||||
"groupdel-weFailed": "无论如何都不在权限组 %0% 中: [gray]%1%."
|
||||
"grouplist-noPermission": "您没有显示注册组的权限."
|
||||
"grouplist-noGroups": "目前没有注册的权限组."
|
||||
"grouplist-success": "注册了权限组: [gray]%0%."
|
||||
"groupinfo-help": "/as groupinfo <group>."
|
||||
"groupinfo-noPermission": "你没有权限显示有关该权限组的信息."
|
||||
"groupinfo-noGroup": "没有任何权限组注册该名称 '%0%', 使用 /as grouplist 检查权限组."
|
||||
"groupinfo-members": "以下区域是权限权限组 %0% 的成员: [gray]%1%."
|
||||
"groupinfo-noMembers": "权限组 %0% 没有任何成员."
|
||||
"schemevent-help": "/as schemevent <region> <created|deleted|rented|unrented|bought|sold>...<创建|删除|租用|停租|购买|出售>."
|
||||
"schemevent-wrongEvent": "指定事件 '%0%' 不存在, 请使用以下内容: [gray]%1%."
|
||||
"schemevent-success": "%lang:region% 已成功触发事件'%0%'."
|
||||
"schemevent-noPermission": "你没有触发schematic事件的权限."
|
||||
"add-help": "/as add <rent|buy> [区域] [世界]."
|
||||
"add-noPermission": "你没有将区域添加到区域商店的权限."
|
||||
"add-success": "添加为 %0%: [gray]%1%."
|
||||
"add-failed": "已经注册: [gray]%0%."
|
||||
"add-blacklisted": "黑名单: [gray]%0%."
|
||||
"add-specifyWorld": "从控制台使用时指定该区域的世界."
|
||||
"add-incorrectWorld": "世界 '%0%' 没有发现, 再试一次 (区分大小写)."
|
||||
"add-noPermissionRegions": "没有权限添加: [gray]%0%."
|
||||
"add-noPermissionOwnerMember": "[gray]你不是这些区域的主人 或者 没有权限添加你的区域."
|
||||
"del-noPermission": "你没有删除区域的权限."
|
||||
"del-success": "移除区域: [gray]%0%."
|
||||
"del-failed": "无权移除或未注册的区域商店: [gray]%0%."
|
||||
"addsign-help": "/as addsign [region] [profile]."
|
||||
"addsign-noSign": "你没有对准木牌."
|
||||
"addsign-noRegions": "木牌周围没有发现区域."
|
||||
"addsign-couldNotDetect": "在木牌附近找到多个区域,请指定区域再使用指令 (2个被发现的区域: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-couldNotDetectSign": "在木牌附近找到多个区域, 指定第二行的区域(2个被发现的区域: %lang:tRegion|%0%|% and %lang:tRegion|%1%|%)."
|
||||
"addsign-wrongProfile": "指定的配置文件不存在,请使用以下其中一个(检查配置): [gray]%0%."
|
||||
"addsign-profile":
|
||||
- "[bold]%0%[/bold]"
|
||||
- " hover: Signprofile %0%"
|
||||
- " hover: %lang:action|点击自动使用指令配置文件|%"
|
||||
- " command: /areashop linksigns %0%"
|
||||
"addsign-success": "木牌已被添加到区域 %lang:region%."
|
||||
"addsign-successProfile": "木牌已被添加到区域 %lang:region% 配置文件为: %0%."
|
||||
"addsign-alreadyRegistered": "该木牌已经被绑定到 %lang:region% 区域了."
|
||||
"addsign-noPermission": "你没有权限添加木牌."
|
||||
"delsign-noSign": "你没有对准木牌."
|
||||
"delsign-noPermission": "你没有权限删除区域的木牌."
|
||||
"delsign-noRegion": "该木牌不属于区域商店."
|
||||
"delsign-success": "该木牌已从 %lang:region% 中删除."
|
||||
"me-noPermission": "你没有权限查看你拥有的区域."
|
||||
"me-header": "该区域的主人: %lang:tPlayer|%0%|%:"
|
||||
"me-notAPlayer": "你不是玩家,不能购买任何区域."
|
||||
"me-rentLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "%timeleft% "
|
||||
- " hover: until %until%"
|
||||
- ")."
|
||||
"me-buyLine": "[darkgreen][bold]►[reset] %lang:region%."
|
||||
"me-friendLine":
|
||||
- "[darkgreen][bold]►[reset] %lang:region% [gray]("
|
||||
- "主人: %lang:player%"
|
||||
- " hover: 你被添加为好友"
|
||||
- ")."
|
||||
"me-nothing": "%lang:tPlayer|%0%|% 还没有租用或购买区域也没有添加为好友."
|
||||
"me-noPlayer": "%0% 无法找到,可能从没注册."
|
||||
"me-clickHint": "[gray][italic]点击区域名称查看详细信息."
|
||||
"setowner-help": "/as setowner <玩家> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"setowner-noPermission": "你没有设置区域所有者的权限."
|
||||
"setowner-noPermissionRent": "你没有设置租用区域所有者的权限."
|
||||
"setowner-noPermissionBuy": "你没有设置购买区域所有者的权限."
|
||||
"setowner-notRegistered": "指定区域未注册到区域商店,区域的主人设置失败."
|
||||
"setowner-noPlayer": "无法获取该玩家的 UUID : %0%."
|
||||
"setowner-succesRent": " &2&l%lang:region%&r的主人成功更改为&2&l%lang:player%&r, 租用直到&2&l%until%%&r(&2&l%timeleft%&r)."
|
||||
"setowner-succesRentExtend": "该区域的主人已经是&2&l%lang:player%&r, 续费时间为&2&l'%duration%'&r, 租用期限为 &2&l%until%&r(&2&l%timeleft%&r)."
|
||||
"setowner-succesBuy": " &2&l%lang:region%&r的主人成功更改为&2&l%lang:player%&r."
|
||||
"resell-help": "/as resell <价格> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"resell-wrongPrice": "'%0%' 不是正确的价格."
|
||||
"resell-notRegistered": "指定区域%0%未被注册到区域商店."
|
||||
"resell-notBought": "你不能转售 %lang:region% 区域,因为它还没有被购买."
|
||||
"resell-success": "%lang:region% 区域已成功地设置为转售模式. %resellprice%."
|
||||
"resell-noPermission": "你没有权限将你的区域设置为转售模式."
|
||||
"resell-noPermissionOther": "你没有在转售模式下设置区域的权限."
|
||||
"stopresell-help": "/as stopresell [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"stopresell-notRegistered": "指定区域未注册: %0%."
|
||||
"stopresell-notResell": "你不能停止出售 %lang:region% 因为它不在出售模式."
|
||||
"stopresell-success": "%lang:region% 成功地设置为已购买模式."
|
||||
"stopresell-noPermission": "你没有权限将你的区域设置回出售模式."
|
||||
"stopresell-noPermissionOther": "你没有将区域设置回出售模式的权限."
|
||||
"addfriend-help": "/as addfriend <玩家> [区域],如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"addfriend-noPermissionOther": "你没有权限将好友添加到不属于你的区域."
|
||||
"addfriend-noPermission": "你没有权限给你的区域添加好友."
|
||||
"addfriend-successOther": "%lang:tPlayer|%0%|% 已为该区域添加新的好友 %lang:region%."
|
||||
"addfriend-success": "%lang:tPlayer|%0%|% 已作为好友添加到你的区域 %lang:region%."
|
||||
"addfriend-alreadyAdded": "%lang:tPlayer|%0%|% 已经作为区域好友添加到 %lang:region%."
|
||||
"addfriend-self": "把区域商店的主人添加为区域好友简直纯属胡闹..."
|
||||
"addfriend-noOwner": "你无法将好友添加到还没有主人的区域。"
|
||||
"addfriend-notVisited": "你无法添加 %0% ,该玩家还没注册."
|
||||
"delfriend-help": "/as delfriend <玩家> [区域], 如果你没有选定区域那么你所在的位置就是你将要使用的区域."
|
||||
"delfriend-noPermissionOther": "你没有权限删除不属于你的区域的好友."
|
||||
"delfriend-noPermission": "你没有权限删除你所在区域的好友."
|
||||
"delfriend-successOther": "%lang:tPlayer|%0%|% 已删除该区域的好友 %lang:region%."
|
||||
"delfriend-success": "%lang:tPlayer|%0%|% 已删除你所在区域的好友 %lang:region%."
|
||||
"delfriend-notAdded": "%lang:tPlayer|%0%|% 没有添加好友 %lang:region%."
|
||||
"delfriend-noOwner": "你无法从没有主人的区域删除好友."
|
||||
"linksigns-multipleRegions": "已找到多个区域: [gray]%0%."
|
||||
"linksigns-multipleRegionsAdvice": "点击另一个牌子再试一次或者使用指令 '/as linksigns' 去停止."
|
||||
"linksigns-noRegions": "在鼠标准心方向找不到区域商店,确保将该区域已被添加到了区域商店 [gray](最大的范围是100个方块)."
|
||||
"linksigns-regionFound": "已找到区域 %lang:region%, 现在指向一个木牌并左键关联它."
|
||||
"linksigns-signFound": "发现一块木牌 (%0%, %1%, %2%), 现在指向一个区域,并右键关联"
|
||||
"linksigns-noSign": "没有找到木牌,请确保你直接看到一个木牌,再次点击 [gray](最大范围100个方块)."
|
||||
"linksigns-alreadyRegistered": "这个牌子已经绑定了一个区域 %lang:region%, 请点击选择另一个牌子."
|
||||
"linksigns-first": "你已经进入了牌子关联模式."
|
||||
"linksigns-next": "[gray]左键单击选择一个木牌,单击右键选择一个区域,使用: /as linksigns to stop."
|
||||
"linksigns-noPermission": "你没有进入批量牌子关联模式的权限。"
|
||||
"linksigns-stopped": "退出牌子关联模式."
|
||||
"stack-help":
|
||||
- "/as stack <数量> <区域商店的间隔> <名称> <rent|buy> [权限组].[break]"
|
||||
- " [gray]<amount> 要创建的区域数量[break]"
|
||||
- " [gray]<gap> 阻止区域之间的间隔.[break]"
|
||||
- " [gray]<name> 区域名称(数字将在后面).[break]"
|
||||
- " [gray]<rent|buy> 出租或购买区域.[break]"
|
||||
- " [gray][group] 将创建的区域添加到权限组.[break]"
|
||||
- " [gray]这些区域将按照你的朝向创建。"
|
||||
"stack-accepted": "开始创建%0%个%1%类型的区域,间隔为%2%,名称以%3%开头,后面数字由001|%4%开始"
|
||||
"stack-addToGroup": " 创建的区域将添加到权限组 '%0%'."
|
||||
"stack-noPermission": "你没有权限批量创建和添加区域商店."
|
||||
"stack-wrongAmount": "'%0%' 区域商店的数量不正确."
|
||||
"stack-wrongGap": "'%0%' 在两个区域商店之间不是正确的数字."
|
||||
"stack-noSelection": "你创建区域需要使用创世神工具选择区域"
|
||||
"stack-addStart": "[gray]添加 %0% 区域商店,以每秒钟 %1%的速度创建. "
|
||||
"stack-addComplete": "[gray]新建 %0% regions%1%."
|
||||
"stack-tooHigh": ",跳过 %0% 区域,因为高度在256以上。"
|
||||
"stack-tooLow": ",跳过 %0% 区域,因为高度y低于0"
|
||||
"stack-unclearDirection": "请分辨好 北, 东, 南, 西, 上, 下 方向, 目前检测到 %0%."
|
||||
"setlandlord-help": "/as setlandlord <玩家> [区域], 如果你没有选定区域,那么你所在的地方即将是你要使用的区域."
|
||||
"setlandlord-noPermission": "你没有权限为这个区域设置主人."
|
||||
"setlandlord-success": "%lang:landlord% 成功继承了 %lang:region% 并成为了改区域商店的主人."
|
||||
"message-help": "/as message <玩家ID> <消息内容...>"
|
||||
"message-noPermission": "你没有发送区域商店消息的权限。."
|
||||
"message-notOnline": "%0% 目前不在线."
|
||||
"confirm-rent":
|
||||
- "%lang:prefix%确定你要租用吗 %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|点击租用 %0%|%"
|
||||
- " hover: %lang:action|租用 %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-extend":
|
||||
- "%lang:prefix%你确定要续费吗 %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|点击续费 %0%|%"
|
||||
- " hover: %lang:action|续费 %0%|%"
|
||||
- " command: /areashop rent %0%"
|
||||
"confirm-unrent":
|
||||
- "%lang:prefix%你确定要停止租用吗 %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|点击停止租用 %0%|%"
|
||||
- " hover: %lang:action|停止租用 %0%|%"
|
||||
- " command: /areashop unrent %0%"
|
||||
"confirm-buy":
|
||||
- "%lang:prefix%确定你要购买吗 %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|点击购买 %0%|%"
|
||||
- " hover: %lang:action|购买 %0%|%"
|
||||
- " command: /areashop buy %0%"
|
||||
"confirm-sell":
|
||||
- "%lang:prefix%确定你要出售吗 %lang:tRegion|%0%|%?[break]"
|
||||
- "[darkgreen][bold]►[reset] %lang:button|点击出售 %0%|%"
|
||||
- " hover: %lang:action|出售 %0%|%"
|
||||
- " command: /areashop sell %0%"
|
||||
"timeleft-years": "%0% 年"
|
||||
"timeleft-months": "%0% 月"
|
||||
"timeleft-days": "%0% 天"
|
||||
"timeleft-hours": "%0% 分钟"
|
||||
"timeleft-minutes": "%0% 分钟"
|
||||
"timeleft-second": "%0% 秒"
|
||||
"timeleft-seconds": "%0% 秒"
|
||||
"timeleft-ended": "已过期"
|
||||
"greeting-forrent": "区域商店:&2&l%region%&r可以花费 &2&l%price%&r 金币,租用期限为&2&l%duration%&r."
|
||||
"greeting-rented": "欢迎来到:&2&l%player%&r的商店,商店编号:&2&l%region%&r,租用期限直到&2%until%."
|
||||
"greeting-forsale": "区域商店:&2&l%region%&r可以花费&2&l%price%&r金币购买."
|
||||
"greeting-bought": "区域商店:&2&l%region%&r被&2&l%player%&r购买了."
|
||||
"greeting-resale": "区域商店:&2&l%region%&r可以找&2&l%player%&r购买&2&l%resaleprice%&r."
|
||||
"update-playerNotify": "[darkgreen]请更新AreaShop 版本%0% 到 %1% 版本 , 获取最新版本 https://github.com/NLthijs48/AreaShop/releases."
|
||||
Loaded 100 of 179 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user