mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2026-02-18 09:43:00 +01:00
Compare commits
1249 Commits
1.12
...
configurab
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
46e285bf44 | ||
|
|
9a72af12b3 | ||
|
|
f8dbace9f0 | ||
|
|
58174d3391 | ||
|
|
7865ad8934 | ||
|
|
d525f754a7 | ||
|
|
fd1b1fe124 | ||
|
|
de71c60d6b | ||
|
|
5609f1cdde | ||
|
|
1bd4454a6b | ||
|
|
8f8dfcf556 | ||
|
|
ce1051c364 | ||
|
|
b9d05d8d67 | ||
|
|
3aa9f385e5 | ||
|
|
ff8c94bf44 | ||
|
|
51e80f40dd | ||
|
|
a7d2c901df | ||
|
|
325cbcad9d | ||
|
|
2644de5ab4 | ||
|
|
3a81d94b32 | ||
|
|
89a990f0cb | ||
|
|
d585b1c2f7 | ||
|
|
1101815f18 | ||
|
|
efea1c5d33 | ||
|
|
33e0b40e19 | ||
|
|
31a98791f3 | ||
|
|
c2bbe33fe8 | ||
|
|
12abd68add | ||
|
|
326ff1cd70 | ||
|
|
9f0fe26778 | ||
|
|
0a59b79ef9 | ||
|
|
441125dbd1 | ||
|
|
27b1c6b094 | ||
|
|
db70d56493 | ||
|
|
eff1ce102f | ||
|
|
705b57a30b | ||
|
|
d4ba9d7605 | ||
|
|
3b3396ce2c | ||
|
|
4cd91350db | ||
|
|
b3bea7833f | ||
|
|
b0c7e0368a | ||
|
|
4e895b7361 | ||
|
|
6168309ec9 | ||
|
|
95c403a467 | ||
|
|
a598796c99 | ||
|
|
a333f36fd8 | ||
|
|
7c6d5c476d | ||
|
|
e2073ff9f7 | ||
|
|
8f26544188 | ||
|
|
4e21f1a200 | ||
|
|
ab6dbe306d | ||
|
|
19a4c0238f | ||
|
|
c071471bdf | ||
|
|
85550c5750 | ||
|
|
3c382a11ed | ||
|
|
f45c70b694 | ||
|
|
38d64f207d | ||
|
|
2d342f8a3d | ||
|
|
3b276b59cf | ||
|
|
4ff4def56a | ||
|
|
63de093ebb | ||
|
|
b34f0d62d6 | ||
|
|
a74f33c96d | ||
|
|
8e8024e3e1 | ||
|
|
4f161812aa | ||
|
|
24ba3b1a01 | ||
|
|
359e3e34ad | ||
|
|
ab0fc06dc2 | ||
|
|
11ca0d9ff1 | ||
|
|
4eef4a3e41 | ||
|
|
816b64cb70 | ||
|
|
dceee5554d | ||
|
|
e3edc9a18f | ||
|
|
aaffafb88b | ||
|
|
2e5a12a72b | ||
|
|
769a26a911 | ||
|
|
8094be46c8 | ||
|
|
2525ce9abe | ||
|
|
47bcd1223b | ||
|
|
ea70c937f2 | ||
|
|
3eb160a794 | ||
|
|
4b6e2c35b2 | ||
|
|
550a3df616 | ||
|
|
657abb76a7 | ||
|
|
0ffcff53b3 | ||
|
|
33f4ac14b5 | ||
|
|
15d3119627 | ||
|
|
4fd94bfe29 | ||
|
|
ac731258c7 | ||
|
|
7b8c90d362 | ||
|
|
055391e908 | ||
|
|
cd6ce5a19d | ||
|
|
7441d2d8d6 | ||
|
|
7b941baa1c | ||
|
|
0c1fa07079 | ||
|
|
539cd7290e | ||
|
|
406429f4e3 | ||
|
|
40802e6bae | ||
|
|
421a394f68 | ||
|
|
d4adb490e2 | ||
|
|
de5a8babc5 | ||
|
|
d892bfe83a | ||
|
|
ceaff0c862 | ||
|
|
a118d8465e | ||
|
|
7c156319be | ||
|
|
24b3bf1100 | ||
|
|
41bdca948a | ||
|
|
5441a7eb96 | ||
|
|
c45f2ce406 | ||
|
|
3cbbf1bee0 | ||
|
|
8fd1af4cbf | ||
|
|
601297799f | ||
|
|
da98be88ad | ||
|
|
1104f48ad5 | ||
|
|
af50699de1 | ||
|
|
1c71f1daf5 | ||
|
|
b7dd491c01 | ||
|
|
3ce0d7b972 | ||
|
|
9dcbccb010 | ||
|
|
c5cbab39b6 | ||
|
|
ca1906fbc5 | ||
|
|
7eab20ef56 | ||
|
|
25a9c75a5a | ||
|
|
9911c406f8 | ||
|
|
fdb900ec5d | ||
|
|
bf94073935 | ||
|
|
bfcc167862 | ||
|
|
2a606b1ed1 | ||
|
|
edc8701e35 | ||
|
|
188b0f9813 | ||
|
|
e6c9cc6fdd | ||
|
|
76ca7cc88f | ||
|
|
335d708848 | ||
|
|
b4179cb9a6 | ||
|
|
8bbf95e9da | ||
|
|
dc805825de | ||
|
|
871ca744d9 | ||
|
|
1b091bdbd5 | ||
|
|
31dc7bf03f | ||
|
|
7be849da2a | ||
|
|
b572494c9c | ||
|
|
143714c9eb | ||
|
|
110d9a633b | ||
|
|
584859318b | ||
|
|
4bff07bd2b | ||
|
|
365938f351 | ||
|
|
7f6bbadc1c | ||
|
|
ec1fdea40d | ||
|
|
8febe2d0bd | ||
|
|
6e0f8f99fa | ||
|
|
1eb2c7b2d7 | ||
|
|
3310a12a95 | ||
|
|
433f6d085d | ||
|
|
0509f4f63e | ||
|
|
d2028321d4 | ||
|
|
4437f419cb | ||
|
|
a58d875d74 | ||
|
|
154d0a8d50 | ||
|
|
9e01a07542 | ||
|
|
f13364eb04 | ||
|
|
b763a56d75 | ||
|
|
c7d2631a79 | ||
|
|
0cea66a084 | ||
|
|
15913c8cf0 | ||
|
|
ba5c24fa3c | ||
|
|
f53d4bde67 | ||
|
|
83373275f7 | ||
|
|
90897c9ae1 | ||
|
|
7385679ec5 | ||
|
|
075ccbf4da | ||
|
|
8a4318ee1f | ||
|
|
8e1f002808 | ||
|
|
3700128b21 | ||
|
|
c44ca47bfe | ||
|
|
6125b3fbd2 | ||
|
|
2ee102b44f | ||
|
|
c0bfdd34b7 | ||
|
|
fd7bcc4a32 | ||
|
|
7f94f3833d | ||
|
|
df6386ec2f | ||
|
|
f1de5484ec | ||
|
|
20b9b0d0fe | ||
|
|
8a4b1bf307 | ||
|
|
46b881e730 | ||
|
|
d484ccc15e | ||
|
|
e8f14eece0 | ||
|
|
8ad08298d0 | ||
|
|
297ce64a24 | ||
|
|
32d9eaab3d | ||
|
|
e1656423c1 | ||
|
|
f52144fb3e | ||
|
|
f7aaf25d93 | ||
|
|
3552457790 | ||
|
|
564b8ceb94 | ||
|
|
4b1cdbf493 | ||
|
|
f0636ef47e | ||
|
|
68f6fea66a | ||
|
|
bde66ee4e1 | ||
|
|
ec4fbe678e | ||
|
|
2735cb1666 | ||
|
|
1c2d1fa56f | ||
|
|
14fa243b69 | ||
|
|
815131a013 | ||
|
|
3aead73d07 | ||
|
|
b0803df7c5 | ||
|
|
50e955d07e | ||
|
|
67a2841705 | ||
|
|
d4826eebd8 | ||
|
|
12e3a5d222 | ||
|
|
57c30bac98 | ||
|
|
efbd9d52c3 | ||
|
|
ef25385786 | ||
|
|
b399c415dc | ||
|
|
810a29cb9d | ||
|
|
9b6e6d7861 | ||
|
|
4e2d68908e | ||
|
|
0d6b5e2530 | ||
|
|
d679101cfb | ||
|
|
122c8b0faa | ||
|
|
1a3832f117 | ||
|
|
a6a544f472 | ||
|
|
1d7bfc615f | ||
|
|
2165d1448e | ||
|
|
396926d970 | ||
|
|
7c0d1f4e0a | ||
|
|
3aa896cfc9 | ||
|
|
43d60b6a7d | ||
|
|
08d1ad4f6c | ||
|
|
8e19e1de15 | ||
|
|
101b0671fe | ||
|
|
e14c53d3ca | ||
|
|
28c0215a93 | ||
|
|
51a373db4f | ||
|
|
1b889b8177 | ||
|
|
4a4124d09f | ||
|
|
ceaf3d46cb | ||
|
|
260d0f9b4a | ||
|
|
d3a7ff8e8c | ||
|
|
9154b3f083 | ||
|
|
c3548be380 | ||
|
|
67bfb40dd5 | ||
|
|
777a9d4185 | ||
|
|
fcd45f3bc1 | ||
|
|
478d542981 | ||
|
|
c6c1c39a98 | ||
|
|
0d6165c0f4 | ||
|
|
f45983949a | ||
|
|
cca0524441 | ||
|
|
e84e9a7dc8 | ||
|
|
a3600e11a9 | ||
|
|
483579503a | ||
|
|
d89ff8b238 | ||
|
|
582ff48b6f | ||
|
|
d6e14ca431 | ||
|
|
0961351ba2 | ||
|
|
0b93a74652 | ||
|
|
2bc2e5bb32 | ||
|
|
98f8e049f3 | ||
|
|
e27d299132 | ||
|
|
7cf40d9dbf | ||
|
|
d6eefac065 | ||
|
|
3036c4ef80 | ||
|
|
a81468ccfc | ||
|
|
2a2a4479ca | ||
|
|
289276d987 | ||
|
|
f771b777b9 | ||
|
|
e4d081f14b | ||
|
|
bba35f8a4e | ||
|
|
8a4410cde8 | ||
|
|
8951c1fd21 | ||
|
|
1f7f71e8b5 | ||
|
|
88b056c38f | ||
|
|
d408782acf | ||
|
|
dfeab6b558 | ||
|
|
f4fe25009d | ||
|
|
905010aacd | ||
|
|
5ea2c493e8 | ||
|
|
734c6f9c62 | ||
|
|
44a3238c79 | ||
|
|
139975958f | ||
|
|
52f9273fa8 | ||
|
|
77ffee2515 | ||
|
|
40118d570c | ||
|
|
8109ecb0e0 | ||
|
|
1147dff4c3 | ||
|
|
c274b21af1 | ||
|
|
2b72e8e69f | ||
|
|
ca511ca0f5 | ||
|
|
cafacc05ab | ||
|
|
2974ed0993 | ||
|
|
861552bcd8 | ||
|
|
7095ddb611 | ||
|
|
f70f2321f2 | ||
|
|
4bb8e20b59 | ||
|
|
e8165321e1 | ||
|
|
9428ea395d | ||
|
|
4f6706b664 | ||
|
|
665a31fc85 | ||
|
|
1221069854 | ||
|
|
054f8ffe0a | ||
|
|
dbecd289b2 | ||
|
|
bb7989449e | ||
|
|
296c2e99f7 | ||
|
|
4246f59d44 | ||
|
|
87ff69d5c4 | ||
|
|
84cb40521b | ||
|
|
dda894dd9a | ||
|
|
7853efc63d | ||
|
|
11409c07c0 | ||
|
|
7c17126ffb | ||
|
|
05e19b2122 | ||
|
|
3b8fee5134 | ||
|
|
4735b2ff8f | ||
|
|
ac29c51d6e | ||
|
|
ad9fa2dd9f | ||
|
|
1e2f11f4f9 | ||
|
|
3a1f297618 | ||
|
|
8af3f41f12 | ||
|
|
e4d980b135 | ||
|
|
62ce98c8a5 | ||
|
|
31a1fd4ece | ||
|
|
51e22f7904 | ||
|
|
106fd84b7f | ||
|
|
5f99a6cf19 | ||
|
|
aba465e1a8 | ||
|
|
73500aae90 | ||
|
|
c3ec6a0b80 | ||
|
|
509ca5ae7f | ||
|
|
9b3091add4 | ||
|
|
b503cb5d80 | ||
|
|
a631388e5a | ||
|
|
d64b869695 | ||
|
|
8e1c1c9ef4 | ||
|
|
952ee9556a | ||
|
|
3155550931 | ||
|
|
7242a171dd | ||
|
|
0dac5f6b3f | ||
|
|
ff3bbad68c | ||
|
|
5cc473fd96 | ||
|
|
c03907b5a3 | ||
|
|
f9c257b73a | ||
|
|
fdc8e4b81d | ||
|
|
308e3a4b1f | ||
|
|
99f8f34529 | ||
|
|
5f7f6fc55a | ||
|
|
36932e397d | ||
|
|
732e29f0a5 | ||
|
|
cd0ed4b385 | ||
|
|
03fd558e1b | ||
|
|
6bc57f184a | ||
|
|
6c58e8a243 | ||
|
|
c818bf82b0 | ||
|
|
67a687ee40 | ||
|
|
ec44c99076 | ||
|
|
39a1a07a7d | ||
|
|
0b2d0fa332 | ||
|
|
304a942f51 | ||
|
|
250753c064 | ||
|
|
05f289e6e6 | ||
|
|
c5a7c88e0c | ||
|
|
8f540796ff | ||
|
|
376e156646 | ||
|
|
e001dea4d7 | ||
|
|
381eba8ddc | ||
|
|
084b5edf1f | ||
|
|
8b39224cbc | ||
|
|
bd0a673838 | ||
|
|
900d3bb7fd | ||
|
|
5af09581e0 | ||
|
|
cf6d28a1bd | ||
|
|
148a4fd555 | ||
|
|
b756938fb1 | ||
|
|
cf46ec7498 | ||
|
|
3ea739d111 | ||
|
|
997fac0d17 | ||
|
|
35f3c5d585 | ||
|
|
982e67af70 | ||
|
|
4da455b9d2 | ||
|
|
40a3de76fb | ||
|
|
3bddfed72f | ||
|
|
bc183cd4f9 | ||
|
|
5ec59536c7 | ||
|
|
e7b80cbce5 | ||
|
|
4815bd7d11 | ||
|
|
1260f4e57a | ||
|
|
67afdd7efb | ||
|
|
a9207b6f38 | ||
|
|
57b7050a2c | ||
|
|
762c3bd04e | ||
|
|
5fd93cea19 | ||
|
|
4c4732695b | ||
|
|
fc9942fdc4 | ||
|
|
02c1ce749c | ||
|
|
1307169d8b | ||
|
|
8eeebf63e9 | ||
|
|
f7c0c9beb7 | ||
|
|
9ec4f64c70 | ||
|
|
9667eaf045 | ||
|
|
51ade5113f | ||
|
|
0af3c82612 | ||
|
|
4c13c0ec31 | ||
|
|
8ca5a5cdec | ||
|
|
43819605fa | ||
|
|
6e00f7eaa2 | ||
|
|
5d0ce407b7 | ||
|
|
bf70a42f6a | ||
|
|
6e70258f9a | ||
|
|
1ae9e80d96 | ||
|
|
444edb209c | ||
|
|
8a9c836065 | ||
|
|
a19ddb46b6 | ||
|
|
53d6065185 | ||
|
|
a66940b2b8 | ||
|
|
225045b49f | ||
|
|
87af2419a3 | ||
|
|
5ee862effd | ||
|
|
6504e06b5f | ||
|
|
1c9e5ba542 | ||
|
|
bc0a59d6fb | ||
|
|
b069480244 | ||
|
|
9092e70544 | ||
|
|
517ca6568f | ||
|
|
3368625dde | ||
|
|
2eb330f070 | ||
|
|
74a2485cff | ||
|
|
03efd14ff4 | ||
|
|
e71c95139d | ||
|
|
d9b84b0ab3 | ||
|
|
421d6cff3b | ||
|
|
ccb86264d9 | ||
|
|
ee2a1b332e | ||
|
|
2dda0bf27a | ||
|
|
d347fa9512 | ||
|
|
913323245c | ||
|
|
68ad507be3 | ||
|
|
764b4c20f5 | ||
|
|
a135e08e12 | ||
|
|
214974e3a3 | ||
|
|
3673d3fb7b | ||
|
|
f6ad530660 | ||
|
|
046daa43fa | ||
|
|
cc1c5239dc | ||
|
|
4fafb5731e | ||
|
|
9ab4d59cca | ||
|
|
89e988660d | ||
|
|
121f881d59 | ||
|
|
68864dae2d | ||
|
|
ae6d377abb | ||
|
|
b479d45f14 | ||
|
|
e17afe31a5 | ||
|
|
5c31bdbd49 | ||
|
|
5f115d5e4a | ||
|
|
1984131874 | ||
|
|
d843108164 | ||
|
|
d782d64750 | ||
|
|
0b4e2b48c9 | ||
|
|
0050a73be8 | ||
|
|
099dfcb0e5 | ||
|
|
6aa53823f1 | ||
|
|
7f567585e2 | ||
|
|
c6d604bbbc | ||
|
|
c7fadf02e6 | ||
|
|
55609249ed | ||
|
|
5698d8282c | ||
|
|
b41a30fa26 | ||
|
|
458e198fdb | ||
|
|
1e338e6aec | ||
|
|
8f04b83954 | ||
|
|
c0685bd1eb | ||
|
|
29670cd66f | ||
|
|
83636644b1 | ||
|
|
fa6995b9fd | ||
|
|
c83d38b5c2 | ||
|
|
27d25ad321 | ||
|
|
31e9abd8eb | ||
|
|
43b7abafe7 | ||
|
|
483134df10 | ||
|
|
a6a734befe | ||
|
|
18fd9bbf9b | ||
|
|
bca1298918 | ||
|
|
87f0171969 | ||
|
|
8b2d1eb1d8 | ||
|
|
b612a599de | ||
|
|
2cecc91026 | ||
|
|
38bc60ba86 | ||
|
|
4e4d798b1d | ||
|
|
218b2a1a75 | ||
|
|
12964a816d | ||
|
|
3a89ba2139 | ||
|
|
303b12b79f | ||
|
|
84704007ac | ||
|
|
5a48b568ef | ||
|
|
73ce7e729c | ||
|
|
d67cbe2861 | ||
|
|
726369077e | ||
|
|
2d1472b913 | ||
|
|
a1e3bb18a4 | ||
|
|
43ca43cc48 | ||
|
|
278efc8e37 | ||
|
|
3cde1400d1 | ||
|
|
3e01b413b4 | ||
|
|
8320b89b9f | ||
|
|
fb08bbb79d | ||
|
|
c3f38cdabd | ||
|
|
8f55a6277a | ||
|
|
ef71661db1 | ||
|
|
4f2e3f4399 | ||
|
|
dac447f381 | ||
|
|
8eba1dda1f | ||
|
|
ffa35d0179 | ||
|
|
e7e28ec3cb | ||
|
|
ab56464bc4 | ||
|
|
43600ef800 | ||
|
|
b4e612b15b | ||
|
|
9e336c8a6f | ||
|
|
29a712ca80 | ||
|
|
18a28a87b1 | ||
|
|
307bf8b332 | ||
|
|
86a4b74eb3 | ||
|
|
6f3b90d0dd | ||
|
|
f0cce29d71 | ||
|
|
8abccfc9cd | ||
|
|
adefda42df | ||
|
|
9c04054017 | ||
|
|
bdd0335d0b | ||
|
|
7ab70ba597 | ||
|
|
a97f1b208f | ||
|
|
0abccd105d | ||
|
|
473e4586c9 | ||
|
|
15b34e2056 | ||
|
|
ae551a6bc1 | ||
|
|
98f6eac50c | ||
|
|
b0f09c8e7b | ||
|
|
b03abcdee8 | ||
|
|
963d0a1897 | ||
|
|
b29d87df8c | ||
|
|
a654762f4d | ||
|
|
705285878f | ||
|
|
e1dcb65888 | ||
|
|
9062dbcaae | ||
|
|
97c98969ff | ||
|
|
3fe47c939a | ||
|
|
46dee3c9b6 | ||
|
|
8e67e2d158 | ||
|
|
f5f4182a90 | ||
|
|
05087e569a | ||
|
|
77bde61f4b | ||
|
|
1297b45ef8 | ||
|
|
83b55db4f8 | ||
|
|
caec01e9fa | ||
|
|
2be67bae19 | ||
|
|
a677450d50 | ||
|
|
1d7919c050 | ||
|
|
a132172507 | ||
|
|
549ef5734e | ||
|
|
77fbf7f51e | ||
|
|
e37820d25e | ||
|
|
00bee60151 | ||
|
|
c58a36e604 | ||
|
|
3c3bc338f2 | ||
|
|
80beb92a06 | ||
|
|
39b5719e12 | ||
|
|
7679afd3e0 | ||
|
|
0b0408ef98 | ||
|
|
5eb80f9277 | ||
|
|
d879575d5f | ||
|
|
51a57429b6 | ||
|
|
3e75026281 | ||
|
|
c698bed05e | ||
|
|
237311a98f | ||
|
|
240ab0a0af | ||
|
|
582c9a6726 | ||
|
|
fc2077ffdb | ||
|
|
58cde322f5 | ||
|
|
0638f4c437 | ||
|
|
426b2d27e7 | ||
|
|
3ce3ac5350 | ||
|
|
94df19bdb4 | ||
|
|
fc6c6ed2c4 | ||
|
|
32fa6cee96 | ||
|
|
ffe27326e3 | ||
|
|
97b70ec2a1 | ||
|
|
e5592919b7 | ||
|
|
b2dc322a2b | ||
|
|
cf6a4c804a | ||
|
|
b62bd0e620 | ||
|
|
86a46babc1 | ||
|
|
0bafcb659b | ||
|
|
9db152ebc8 | ||
|
|
ef44a43bd2 | ||
|
|
bdc44f6ede | ||
|
|
0e70c9ce75 | ||
|
|
2d1d2693ed | ||
|
|
c33d6e62b7 | ||
|
|
fd78ce278e | ||
|
|
5ca027650e | ||
|
|
e05078b280 | ||
|
|
12c0b19776 | ||
|
|
f898525362 | ||
|
|
f53bd1ab03 | ||
|
|
c82f60e08b | ||
|
|
8c1c17fa17 | ||
|
|
7a0ef0d4ed | ||
|
|
29876b4a20 | ||
|
|
fc7455354f | ||
|
|
4048ecc764 | ||
|
|
f93a1aa151 | ||
|
|
f6dc76719a | ||
|
|
3035af97a4 | ||
|
|
3832ef3547 | ||
|
|
8b4cea5dab | ||
|
|
4e7e2daf3c | ||
|
|
9dfbb14c39 | ||
|
|
cb9a4e5e5d | ||
|
|
5af60e2fe1 | ||
|
|
9111590dc2 | ||
|
|
9d47234918 | ||
|
|
299c989dd4 | ||
|
|
00131bb412 | ||
|
|
186ad2cd59 | ||
|
|
19acf47f1e | ||
|
|
01bffc6670 | ||
|
|
1532791c3f | ||
|
|
84b9b255aa | ||
|
|
61e46b6f10 | ||
|
|
8d10f8053f | ||
|
|
b27d46f0cc | ||
|
|
ff1bb0deed | ||
|
|
4795143fca | ||
|
|
54eca5b8ba | ||
|
|
11f669f8f4 | ||
|
|
1cda612e86 | ||
|
|
50e4e971d9 | ||
|
|
33dd34931c | ||
|
|
ce230bf403 | ||
|
|
d7b2a98723 | ||
|
|
bfb48ccea3 | ||
|
|
8cd39301a3 | ||
|
|
321684e5f6 | ||
|
|
b6d11e655d | ||
|
|
04fb4c30fe | ||
|
|
04b4a8e069 | ||
|
|
1e1b803cce | ||
|
|
3d576eaa6a | ||
|
|
087df05e77 | ||
|
|
05936b3c75 | ||
|
|
c10853def9 | ||
|
|
08baa5993e | ||
|
|
0396039d50 | ||
|
|
4aa81f1023 | ||
|
|
4bd3f8d6bd | ||
|
|
4627df1160 | ||
|
|
a72c45766f | ||
|
|
4ced61e4fc | ||
|
|
c237601af6 | ||
|
|
3a88193459 | ||
|
|
65a234c6b3 | ||
|
|
9fb9228869 | ||
|
|
ca8293bc35 | ||
|
|
9c5ec234d9 | ||
|
|
0b247dfae7 | ||
|
|
d46fae2d1a | ||
|
|
5d6690fc1a | ||
|
|
66425ba48d | ||
|
|
3b3a36c64d | ||
|
|
2433ef5db7 | ||
|
|
663757352a | ||
|
|
1ced5d8ffc | ||
|
|
04c6bd8750 | ||
|
|
b0dc41b4d9 | ||
|
|
92e6cedb14 | ||
|
|
447ce97f24 | ||
|
|
2a471e409c | ||
|
|
08223bd320 | ||
|
|
90480ca626 | ||
|
|
56b031b99d | ||
|
|
f3cbd450d0 | ||
|
|
b176fd9bca | ||
|
|
1c130aad42 | ||
|
|
734dfcdec5 | ||
|
|
c8a32b8b38 | ||
|
|
ed3ec3aa40 | ||
|
|
88d8d0e6bb | ||
|
|
b532b42db3 | ||
|
|
a763f7f025 | ||
|
|
357e9cc08f | ||
|
|
f0d6f7077b | ||
|
|
2746bac86a | ||
|
|
95652efbaa | ||
|
|
e70e5b04b5 | ||
|
|
34869914c4 | ||
|
|
a53505ee0b | ||
|
|
f0e64d992b | ||
|
|
c61c55031d | ||
|
|
39d10855d8 | ||
|
|
aeb518f38c | ||
|
|
d3a719eb8d | ||
|
|
ab4b4edb1a | ||
|
|
591c9e67a3 | ||
|
|
59c8d16374 | ||
|
|
3a6d94e682 | ||
|
|
2b0931314a | ||
|
|
d1298c0cd2 | ||
|
|
3f6a33dea6 | ||
|
|
d8841c6ae7 | ||
|
|
2e3f9b4a96 | ||
|
|
6425cd18b8 | ||
|
|
86b98368bc | ||
|
|
b5eb942682 | ||
|
|
f7e6e3adb6 | ||
|
|
ca4f15df46 | ||
|
|
2c8b8658a3 | ||
|
|
80163c0d8f | ||
|
|
72fc3efa78 | ||
|
|
d614df65a7 | ||
|
|
3123f69aec | ||
|
|
1c6b0363ce | ||
|
|
ddb92af400 | ||
|
|
ed1831da78 | ||
|
|
774ee65677 | ||
|
|
61ae372694 | ||
|
|
945359b408 | ||
|
|
06bf814fcf | ||
|
|
cc1eae150a | ||
|
|
7ad0a61c53 | ||
|
|
48a3621ac6 | ||
|
|
4ab688b302 | ||
|
|
8cfeaf34f3 | ||
|
|
ad550759e6 | ||
|
|
ca7cf5cc58 | ||
|
|
40598a0e96 | ||
|
|
984518d9f5 | ||
|
|
e0055eeead | ||
|
|
0331c98c9b | ||
|
|
c968b9f94a | ||
|
|
8033bc577c | ||
|
|
fe07261846 | ||
|
|
0cbb9b22a5 | ||
|
|
31ccf2ca02 | ||
|
|
08269cab5b | ||
|
|
71a2ea2a2e | ||
|
|
23b7e11dd1 | ||
|
|
ecac8d00ee | ||
|
|
588b6f3692 | ||
|
|
620f2fc4f8 | ||
|
|
3e61dc6c5f | ||
|
|
a919c45b09 | ||
|
|
8a312da0f5 | ||
|
|
cdf6e607de | ||
|
|
29835a3316 | ||
|
|
f61917e8fe | ||
|
|
661564df36 | ||
|
|
0a7c852d89 | ||
|
|
c1379f7ac6 | ||
|
|
22ef134c84 | ||
|
|
9157a08a3b | ||
|
|
3997a44fce | ||
|
|
7f95956a01 | ||
|
|
40ea101bf6 | ||
|
|
0c8b001d05 | ||
|
|
5dc9c3f732 | ||
|
|
ec574a6b63 | ||
|
|
1ca48051ad | ||
|
|
4d8e4d0e70 | ||
|
|
2efa64ae17 | ||
|
|
e5441f2a96 | ||
|
|
06016f4ada | ||
|
|
6932abc9d8 | ||
|
|
0f2e1ea740 | ||
|
|
c2d4aeaf85 | ||
|
|
faed690602 | ||
|
|
7b3f69aee6 | ||
|
|
6e173c0d4e | ||
|
|
d0259d73c5 | ||
|
|
7f64fe11b8 | ||
|
|
a496b1fd71 | ||
|
|
ff8baecb54 | ||
|
|
ac8042f5d8 | ||
|
|
437bac1324 | ||
|
|
7c4481f099 | ||
|
|
d1085aa8f8 | ||
|
|
986162803b | ||
|
|
f7eb06e80b | ||
|
|
f4214e2031 | ||
|
|
fd8712ee61 | ||
|
|
f904ac7019 | ||
|
|
3c08af363f | ||
|
|
8295355a5d | ||
|
|
aee81f87f5 | ||
|
|
43d08ec21d | ||
|
|
15e3ad8876 | ||
|
|
a583f557d7 | ||
|
|
0949931a61 | ||
|
|
8efee39f7e | ||
|
|
307b807b38 | ||
|
|
be8a2a4b07 | ||
|
|
30df57fa35 | ||
|
|
467025888c | ||
|
|
02a69cbb05 | ||
|
|
dc758a6dfc | ||
|
|
989537366a | ||
|
|
21ecf959ea | ||
|
|
9fcedcad76 | ||
|
|
9d9b5464c3 | ||
|
|
5fc416a457 | ||
|
|
d1401d0cba | ||
|
|
63e905db6c | ||
|
|
e8ea502f77 | ||
|
|
ba8b73ad4d | ||
|
|
df2a52984e | ||
|
|
b8ad722e9e | ||
|
|
7928ababf6 | ||
|
|
0a63e6674a | ||
|
|
b5930fc35d | ||
|
|
9a74ab77f4 | ||
|
|
7f233b8e77 | ||
|
|
17c193f984 | ||
|
|
176b5db83e | ||
|
|
18d698aad2 | ||
|
|
3329a6c49e | ||
|
|
c07a29ba86 | ||
|
|
b36c4b56c3 | ||
|
|
cee0025147 | ||
|
|
372ad1fac3 | ||
|
|
09cba965d3 | ||
|
|
d862f7f779 | ||
|
|
0adaa0ba66 | ||
|
|
432a4aa330 | ||
|
|
1c490cd463 | ||
|
|
b41637fbf8 | ||
|
|
7506646862 | ||
|
|
570ab49e55 | ||
|
|
227fb49dec | ||
|
|
78fdfc1c35 | ||
|
|
0b26d6c72c | ||
|
|
cae722e8c7 | ||
|
|
0eed1a6c5a | ||
|
|
bbf7ce9c57 | ||
|
|
1fa21823a4 | ||
|
|
4b34299648 | ||
|
|
45841218e6 | ||
|
|
c509daff9f | ||
|
|
ce92329705 | ||
|
|
817b5364cf | ||
|
|
9b08f9bc44 | ||
|
|
3973f9ec43 | ||
|
|
820c3260c8 | ||
|
|
57bbde552a | ||
|
|
30bc73be7d | ||
|
|
ae35da8e02 | ||
|
|
3c6b694fb8 | ||
|
|
bbd43e156a | ||
|
|
a9cb28a8f2 | ||
|
|
3e2f2cd000 | ||
|
|
c69a9fc299 | ||
|
|
f09007b60c | ||
|
|
6e62930b6a | ||
|
|
28bf67f154 | ||
|
|
5d7d06831b | ||
|
|
e23aec7294 | ||
|
|
f90205f1ae | ||
|
|
54a1475fef | ||
|
|
7e039321e1 | ||
|
|
bd0204a09e | ||
|
|
31c1bd52bc | ||
|
|
0f8c0f97d9 | ||
|
|
5a56b27ea8 | ||
|
|
273dfbbdce | ||
|
|
138b109ff5 | ||
|
|
908ac7c541 | ||
|
|
e7e13d990a | ||
|
|
ea9f79291e | ||
|
|
4b13cbeb43 | ||
|
|
d542098f8a | ||
|
|
f6e01ea910 | ||
|
|
2a053a0be2 | ||
|
|
b5cbfc7f66 | ||
|
|
8c0076ff80 | ||
|
|
6e3c2fcb76 | ||
|
|
33a68daa9c | ||
|
|
7cf3b4e521 | ||
|
|
7e047aed59 | ||
|
|
86f62fba0b | ||
|
|
b64b8d0f8f | ||
|
|
1fe4fef75a | ||
|
|
00cc5f0845 | ||
|
|
8b0a580505 | ||
|
|
87bf3a5b40 | ||
|
|
de3e2b79f7 | ||
|
|
21e1d54ad5 | ||
|
|
9c1f38ce6d | ||
|
|
78aeb0679b | ||
|
|
c41a650415 | ||
|
|
856e6f0447 | ||
|
|
1f734582d4 | ||
|
|
75bb3f181d | ||
|
|
2170c6de24 | ||
|
|
e156d6d5ef | ||
|
|
fb6e5e41ad | ||
|
|
8ddbb3aa91 | ||
|
|
426b1304e2 | ||
|
|
ba180ebae3 | ||
|
|
aecc90fa33 | ||
|
|
4394ac7049 | ||
|
|
a2279a58a5 | ||
|
|
2ef10afce3 | ||
|
|
4433ea7118 | ||
|
|
f1204f8a2a | ||
|
|
5facd8d412 | ||
|
|
f7b07899c1 | ||
|
|
e5de240eb4 | ||
|
|
b63280a2aa | ||
|
|
0ba3d7bd68 | ||
|
|
79d5c6192f | ||
|
|
8c164749e2 | ||
|
|
3806dcbd5d | ||
|
|
b67bc45e9a | ||
|
|
737b95d538 | ||
|
|
b8ae8438de | ||
|
|
974106f983 | ||
|
|
ee90780d7b | ||
|
|
abda53641f | ||
|
|
77eba76e13 | ||
|
|
d599db2897 | ||
|
|
3f89f91f42 | ||
|
|
2fca0963d7 | ||
|
|
81d648f94d | ||
|
|
42a7673ad7 | ||
|
|
51291f7c49 | ||
|
|
4068d61246 | ||
|
|
b63db1981c | ||
|
|
af744fa088 | ||
|
|
8538ac4e50 | ||
|
|
cabc5977d9 | ||
|
|
43dd382541 | ||
|
|
cdb81e961e | ||
|
|
51ced83301 | ||
|
|
09bca96af3 | ||
|
|
f1d9f787f4 | ||
|
|
6cad982969 | ||
|
|
b8b0be71b1 | ||
|
|
ac10261803 | ||
|
|
5b2720a04f | ||
|
|
0ca0140348 | ||
|
|
43037f8c13 | ||
|
|
0e39656c88 | ||
|
|
8991c2bf2c | ||
|
|
7bbf1acd5d | ||
|
|
dc018be6bb | ||
|
|
832b653a88 | ||
|
|
1fddaf15cc | ||
|
|
9acf597eb9 | ||
|
|
d2faac3b0d | ||
|
|
b68feb6992 | ||
|
|
f3837265db | ||
|
|
ecce631527 | ||
|
|
5c6f0e8cbf | ||
|
|
ac67e006d8 | ||
|
|
661c63a8aa | ||
|
|
eb43dc4460 | ||
|
|
9514b200cd | ||
|
|
c428aff251 | ||
|
|
c6e8e63088 | ||
|
|
8f33b378bf | ||
|
|
67f95d3343 | ||
|
|
5e1c12d8ec | ||
|
|
09c91f3b4b | ||
|
|
8d9f6c14a7 | ||
|
|
dcd40d3ced | ||
|
|
456e64456d | ||
|
|
f1ecef310c | ||
|
|
1f2eae0799 | ||
|
|
0d3551c84b | ||
|
|
dc4401ffb0 | ||
|
|
9568c0f85c | ||
|
|
3f30f6950b | ||
|
|
8182249641 | ||
|
|
b36c1376cf | ||
|
|
e4c911869d | ||
|
|
457b7f9d14 | ||
|
|
ae551e17cd | ||
|
|
c6d055cb48 | ||
|
|
68e34d682c | ||
|
|
b125600dac | ||
|
|
57b31b60b3 | ||
|
|
7757e187be | ||
|
|
5ce360d443 | ||
|
|
d44b6e0afb | ||
|
|
629d882831 | ||
|
|
947018c0f1 | ||
|
|
ca2e1c11e6 | ||
|
|
69e5d3e1b5 | ||
|
|
b7d33f0227 | ||
|
|
28c7fdd4e2 | ||
|
|
53534e0f1d | ||
|
|
8d477a5cf5 | ||
|
|
74908cdcf5 | ||
|
|
c5f87e17f6 | ||
|
|
7d1cbe4c45 | ||
|
|
dc5766035b | ||
|
|
d144409673 | ||
|
|
07ebf12ae2 | ||
|
|
6e83763f22 | ||
|
|
e232bb3699 | ||
|
|
968636b8d4 | ||
|
|
0f98d9babe | ||
|
|
bf8e3d5a08 | ||
|
|
7aea4e1d92 | ||
|
|
68b32e0b9e | ||
|
|
ef6bec4ffc | ||
|
|
ff986ec97d | ||
|
|
0c58f5073c | ||
|
|
579109b2f5 | ||
|
|
d4d8cbbc03 | ||
|
|
d8b540cad8 | ||
|
|
1ff3e55c7e | ||
|
|
437bc264bc | ||
|
|
17cb2c2615 | ||
|
|
3d21591830 | ||
|
|
1cea9830a6 | ||
|
|
121c54b802 | ||
|
|
e709f04004 | ||
|
|
2cdb0395ee | ||
|
|
8f6f0e4a0f | ||
|
|
133dadccec | ||
|
|
c01b8e4ad4 | ||
|
|
ac04ca5c27 | ||
|
|
956b01a28e | ||
|
|
7cd8099d3c | ||
|
|
bd0a4c75c0 | ||
|
|
883fca3cf3 | ||
|
|
45430d9c25 | ||
|
|
e933efcee0 | ||
|
|
b9a37614b2 | ||
|
|
7c0469dce1 | ||
|
|
7d2e76e464 | ||
|
|
3a21a913c6 | ||
|
|
b0b326d080 | ||
|
|
16d4c160c6 | ||
|
|
652291fee1 | ||
|
|
f299f84a6f | ||
|
|
80df1dd4bd | ||
|
|
8a6ed2f076 | ||
|
|
d11f8fcdce | ||
|
|
6be936972f | ||
|
|
82dec38e5c | ||
|
|
70b3ca3094 | ||
|
|
f0455b28dc | ||
|
|
f96c4bc063 | ||
|
|
a812ca42f7 | ||
|
|
fb1467551f | ||
|
|
96b781ab0a | ||
|
|
a710893e2a | ||
|
|
0bed8898bf | ||
|
|
4c78afc04b | ||
|
|
cb21c0bf24 | ||
|
|
eb14d14e05 | ||
|
|
7c0a741b47 | ||
|
|
2acc230895 | ||
|
|
e57bf35e5e | ||
|
|
2001ef30ee | ||
|
|
b2c1358a84 | ||
|
|
efdd56684b | ||
|
|
0d8b4c5f5f | ||
|
|
04fdd3270a | ||
|
|
094850ab85 | ||
|
|
d272d60112 | ||
|
|
f5c1e0952b | ||
|
|
0e61557812 | ||
|
|
160f27b492 | ||
|
|
7a7dd7002e | ||
|
|
0046c47163 | ||
|
|
1cdc59cfb1 | ||
|
|
8660d86306 | ||
|
|
d139d520e7 | ||
|
|
8578d923d6 | ||
|
|
307340bea3 | ||
|
|
bbe9b92c15 | ||
|
|
f00601931d | ||
|
|
1c289cfcdf | ||
|
|
a8bf6357aa | ||
|
|
77b4ade885 | ||
|
|
d3b437f6d3 | ||
|
|
45e785bd1f | ||
|
|
707e6d0342 | ||
|
|
be69f0d6a7 | ||
|
|
e94005df34 | ||
|
|
88cd8e64bb | ||
|
|
948837546a | ||
|
|
8bc49e8bfb | ||
|
|
55b1da0341 | ||
|
|
132b908eee | ||
|
|
7d152794ba | ||
|
|
e757dd10c8 | ||
|
|
d5ea196840 | ||
|
|
f772b39eda | ||
|
|
493d6b0a67 | ||
|
|
76472a2b9f | ||
|
|
f0e8eb35c4 | ||
|
|
59f3835554 | ||
|
|
38c11d1601 | ||
|
|
608a523996 | ||
|
|
a2e0ca0f84 | ||
|
|
a3b8ab81be | ||
|
|
07db198a67 | ||
|
|
234a31d283 | ||
|
|
f2945569fb | ||
|
|
72663ae2d3 | ||
|
|
22eead18dd | ||
|
|
8101decef5 | ||
|
|
35d1e1ebd9 | ||
|
|
4418d34930 | ||
|
|
ed8611585f | ||
|
|
b3ed05eb09 | ||
|
|
9d0dd7ecd6 | ||
|
|
e354e7b89b | ||
|
|
714d9c0ca7 | ||
|
|
53f06832f1 | ||
|
|
562066311b | ||
|
|
b5b9a223a7 | ||
|
|
049b76f651 | ||
|
|
4ab5e5e925 | ||
|
|
22ca1863fd | ||
|
|
bdbda5587f | ||
|
|
a344e43e2e | ||
|
|
198b7e3f46 | ||
|
|
5647eebe99 | ||
|
|
367fabf70c | ||
|
|
2f804de36f | ||
|
|
677e45a811 | ||
|
|
99f0e029c2 | ||
|
|
3fc9f26b8b | ||
|
|
e75170f576 | ||
|
|
3158ba591b | ||
|
|
31402d97c4 | ||
|
|
bef86f0e97 | ||
|
|
811b90bc31 | ||
|
|
ef6b70f686 | ||
|
|
2c752dc470 | ||
|
|
63a0598766 | ||
|
|
772ceddf65 | ||
|
|
15be278ee1 | ||
|
|
349a714134 | ||
|
|
41bfba0c68 | ||
|
|
83ee9ca92c | ||
|
|
18d8b84099 | ||
|
|
e6aee141fb | ||
|
|
b0b0167ee2 | ||
|
|
26b66b550c | ||
|
|
cef1bf6c8c | ||
|
|
bd74d6e4f1 | ||
|
|
6152ac30b9 | ||
|
|
6604f98140 | ||
|
|
b81ca84a99 | ||
|
|
4bfa790be9 | ||
|
|
c14b949b0a | ||
|
|
5ce08a2294 | ||
|
|
c91255c474 | ||
|
|
4bb513c2d1 | ||
|
|
9f9b456b0a | ||
|
|
894b30660c | ||
|
|
a939f54b10 | ||
|
|
3fc0bbb466 | ||
|
|
e7d8e51722 | ||
|
|
63aebd0454 | ||
|
|
f08456b789 | ||
|
|
d7e0c95984 | ||
|
|
f4ba472403 | ||
|
|
acf2bf362f | ||
|
|
9731b9cffb | ||
|
|
2de87f7189 | ||
|
|
fb2eddd432 | ||
|
|
bf63ce33c5 | ||
|
|
e7b91f57ea | ||
|
|
78f0a42ec1 | ||
|
|
fd8e44ef47 | ||
|
|
0f743a55b5 | ||
|
|
69fa10559c | ||
|
|
c1cf246084 | ||
|
|
39b22d0ee8 | ||
|
|
74e62ab08c | ||
|
|
f1cc745de8 | ||
|
|
7654e78fbe | ||
|
|
558c727136 | ||
|
|
18097fa1a5 | ||
|
|
e2b8d940d3 | ||
|
|
5093c37efb | ||
|
|
610e1a6bf4 | ||
|
|
99843f2735 | ||
|
|
732726bbd3 | ||
|
|
65687ca603 | ||
|
|
658382dba2 | ||
|
|
404a876d6b | ||
|
|
c4a383c4fb | ||
|
|
e0341f7ae7 | ||
|
|
018c6fc96b | ||
|
|
d324aa9589 | ||
|
|
cc1c73cb17 | ||
|
|
d6dc8bb04c | ||
|
|
88ef6b0984 | ||
|
|
624299602d | ||
|
|
8fe8db2353 | ||
|
|
159cf7c0d4 | ||
|
|
947cdc91a4 | ||
|
|
ff55cbb946 | ||
|
|
fdb151083d | ||
|
|
7a3d608f36 | ||
|
|
719283177e | ||
|
|
55fb3ed74f | ||
|
|
363ea66335 | ||
|
|
7ee65a7e65 | ||
|
|
aa25ba6338 | ||
|
|
b68bbad766 | ||
|
|
6d19239db7 | ||
|
|
faab64864a | ||
|
|
b1f4ea8cba | ||
|
|
df6315dd62 | ||
|
|
255f7bf335 | ||
|
|
ce6553d857 | ||
|
|
df1497924c | ||
|
|
aeed0cf6ad | ||
|
|
e40a7bb4e1 | ||
|
|
d59dbe7630 | ||
|
|
dece43429d | ||
|
|
14f900aa83 | ||
|
|
53848d3fd3 | ||
|
|
c8d95dc711 | ||
|
|
bb118607ce | ||
|
|
2d849f55e5 | ||
|
|
fef9058e16 | ||
|
|
e3d2526939 | ||
|
|
2f0a58b968 | ||
|
|
8994594ed4 | ||
|
|
bb46b2a6ac | ||
|
|
7296deb149 | ||
|
|
ef5cd3ec60 | ||
|
|
f9f6d1550e | ||
|
|
68e43e3641 | ||
|
|
93458aa355 | ||
|
|
e80e771e9d | ||
|
|
af9b631ee2 | ||
|
|
ca5a46508d | ||
|
|
7703cafa34 | ||
|
|
437fe29112 | ||
|
|
28b71804a2 | ||
|
|
6f15cd4005 | ||
|
|
3ed4228b72 | ||
|
|
ba88831c88 | ||
|
|
93fefa031b |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -2,3 +2,4 @@
|
||||
|
||||
*.png binary
|
||||
*.wav binary
|
||||
p
|
||||
12
.github/FUNDING.yml
vendored
Normal file
12
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
github: [nossr50] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
patreon: nossr50 # Replace with a single Patreon username
|
||||
open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: # Replace with a single Ko-fi username
|
||||
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
liberapay: # Replace with a single Liberapay username
|
||||
issuehunt: # Replace with a single IssueHunt username
|
||||
otechie: # Replace with a single Otechie username
|
||||
custom: https://paypal.me/nossr50 # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
335
.gitignore
vendored
335
.gitignore
vendored
@@ -1,6 +1,128 @@
|
||||
|
||||
### NetBeans template
|
||||
**/nbproject/private/
|
||||
**/nbproject/Makefile-*.mk
|
||||
**/nbproject/Package-*.bash
|
||||
build/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
.nb-gradle/
|
||||
|
||||
### Bash Scripts
|
||||
*.sh
|
||||
!mcmmo-core/src/main/resources/com/gmail/nossr50/locale/doTranslation.sh
|
||||
|
||||
### JetBrains template
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
.idea/modules.xml
|
||||
.idea/*.iml
|
||||
.idea/modules
|
||||
.idea
|
||||
*.iml
|
||||
*.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
|
||||
### Kotlin template
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
|
||||
### Eclipse template
|
||||
|
||||
.metadata
|
||||
bin/
|
||||
tmp/
|
||||
@@ -56,77 +178,11 @@ local.properties
|
||||
.cache-main
|
||||
.scala_dependencies
|
||||
.worksheet
|
||||
### Android template
|
||||
# Built application files
|
||||
*.apk
|
||||
*.ap_
|
||||
|
||||
# Files for the ART/Dalvik VM
|
||||
*.dex
|
||||
|
||||
# Java class files
|
||||
*.class
|
||||
|
||||
# Generated files
|
||||
gen/
|
||||
out/
|
||||
|
||||
# Gradle files
|
||||
.gradle/
|
||||
build/
|
||||
|
||||
# Local configuration file (sdk path, etc)
|
||||
# Proguard folder generated by Eclipse
|
||||
proguard/
|
||||
|
||||
# Log Files
|
||||
*.log
|
||||
|
||||
# Android Studio Navigation editor temp files
|
||||
.navigation/
|
||||
|
||||
# Android Studio captures folder
|
||||
captures/
|
||||
|
||||
# IntelliJ
|
||||
*.iml
|
||||
.idea/workspace.xml
|
||||
.idea/tasks.xml
|
||||
.idea/gradle.xml
|
||||
.idea/assetWizardSettings.xml
|
||||
.idea/dictionaries
|
||||
.idea/libraries
|
||||
.idea/caches
|
||||
|
||||
# Keystore files
|
||||
# Uncomment the following line if you do not want to check your keystore files in.
|
||||
#*.jks
|
||||
|
||||
# External native build folder generated in Android Studio 2.2 and later
|
||||
.externalNativeBuild
|
||||
|
||||
# Google Services (e.g. APIs or Firebase)
|
||||
google-services.json
|
||||
|
||||
# Freeline
|
||||
freeline.py
|
||||
freeline/
|
||||
freeline_project_description.json
|
||||
|
||||
# fastlane
|
||||
fastlane/report.xml
|
||||
fastlane/Preview.html
|
||||
fastlane/screenshots
|
||||
fastlane/test_output
|
||||
fastlane/readme.md
|
||||
### Dropbox template
|
||||
# Dropbox settings and caches
|
||||
.dropbox
|
||||
.dropbox.attr
|
||||
.dropbox.cache
|
||||
### Windows template
|
||||
# Windows thumbnail cache files
|
||||
Thumbs.db
|
||||
Thumbs.db:encryptable
|
||||
ehthumbs.db
|
||||
ehthumbs_vista.db
|
||||
|
||||
@@ -148,23 +204,7 @@ $RECYCLE.BIN/
|
||||
|
||||
# Windows shortcuts
|
||||
*.lnk
|
||||
### Maven template
|
||||
target/
|
||||
pom.xml.tag
|
||||
pom.xml.releaseBackup
|
||||
pom.xml.versionsBackup
|
||||
pom.xml.next
|
||||
release.properties
|
||||
dependency-reduced-pom.xml
|
||||
buildNumber.properties
|
||||
.mvn/timing.properties
|
||||
.mvn/wrapper/maven-wrapper.jar
|
||||
### NetBeans template
|
||||
nbproject/private/
|
||||
nbbuild/
|
||||
dist/
|
||||
nbdist/
|
||||
.nb-gradle/
|
||||
|
||||
### macOS template
|
||||
# General
|
||||
.DS_Store
|
||||
@@ -192,6 +232,7 @@ Icon
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### Linux template
|
||||
*~
|
||||
|
||||
@@ -206,104 +247,14 @@ Temporary Items
|
||||
|
||||
# .nfs files are created when an open file is removed but is still being accessed
|
||||
.nfs*
|
||||
### GPG template
|
||||
secring.*
|
||||
|
||||
### Gradle template
|
||||
.gradle
|
||||
/build/
|
||||
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
|
||||
# gradle/wrapper/gradle-wrapper.properties
|
||||
### SBT template
|
||||
# Simple Build Tool
|
||||
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
|
||||
|
||||
dist/*
|
||||
lib_managed/
|
||||
src_managed/
|
||||
project/boot/
|
||||
project/plugins/project/
|
||||
.history
|
||||
.cache
|
||||
.lib/
|
||||
### Example user template template
|
||||
### Example user template
|
||||
|
||||
# IntelliJ project files
|
||||
.idea
|
||||
out
|
||||
gen### JetBrains template
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
### Kotlin template
|
||||
### Java template
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
@@ -321,10 +272,20 @@ fabric.properties
|
||||
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
### Java template
|
||||
# Compiled class file
|
||||
# Log file
|
||||
# BlueJ files
|
||||
# Mobile Tools for Java (J2ME)
|
||||
# Package Files #
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
|
||||
### Gradle template
|
||||
.gradle
|
||||
/build/
|
||||
|
||||
# Ignore Gradle GUI config
|
||||
gradle-app.setting
|
||||
|
||||
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
|
||||
!gradle-wrapper.jar
|
||||
|
||||
# Cache of project
|
||||
.gradletasknamecache
|
||||
|
||||
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
|
||||
# gradle/wrapper/gradle-wrapper.properties
|
||||
|
||||
|
||||
1257
Changelog.txt
1257
Changelog.txt
File diff suppressed because it is too large
Load Diff
894
LICENSE
894
LICENSE
@@ -1,346 +1,674 @@
|
||||
TERMS AND CONDITIONS
|
||||
0. Definitions.
|
||||
“This License” refers to version 3 of the GNU General Public License.
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”.
|
||||
“Licensees” and “recipients” may be individuals or organizations.
|
||||
Preamble
|
||||
|
||||
To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission,
|
||||
other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work
|
||||
“based on” the earlier work.
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
A “covered work” means either the unmodified Program or a work based on the Program.
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily
|
||||
liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy.
|
||||
Propagation includes copying, distribution (with or without modification), making available to the public, and in some
|
||||
countries other activities as well.
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction
|
||||
with a user through a computer network, with no transfer of a copy, is not conveying.
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and
|
||||
prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no
|
||||
warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this
|
||||
License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any
|
||||
non-source form of a work.
|
||||
1. Source Code.
|
||||
|
||||
A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or,
|
||||
in the case of interfaces specified for a particular programming language, one that is widely used among developers
|
||||
working in that language.
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in
|
||||
the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to
|
||||
enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is
|
||||
available to the public in source code form. A “Major Component”, in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a
|
||||
compiler used to produce the work, or an object code interpreter used to run it.
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and
|
||||
(for an executable work) run the object code and to modify the work, including scripts to control those activities.
|
||||
However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs
|
||||
which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding
|
||||
Source includes interface definition files associated with source files for the work, and the source code for shared
|
||||
libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data
|
||||
communication or control flow between those subprograms and other parts of the work.
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The Corresponding Source need not include anything that users can regenerate automatically from other parts of the
|
||||
Corresponding Source.
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source for a work in source code form is that same work.
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
2. Basic Permissions.
|
||||
All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided
|
||||
the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program.
|
||||
The output from running a covered work is covered by this License only if the output, given its content, constitutes a
|
||||
covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
You may make, run and propagate covered works that you do not convey, without conditions so long as your license
|
||||
otherwise remains in force. You may convey covered works to others for the sole purpose of having them make
|
||||
modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do not control copyright. Those thus making or running
|
||||
the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that
|
||||
prohibit them from making any copies of your copyrighted material outside their relationship with you.
|
||||
2. Basic Permissions.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not
|
||||
allowed; section 10 makes it unnecessary.
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling
|
||||
obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or
|
||||
restricting circumvention of such measures.
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the
|
||||
extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you
|
||||
disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users,
|
||||
your or third parties' legal rights to forbid circumvention of technological measures.
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating
|
||||
that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices
|
||||
of the absence of any warranty; and give all recipients a copy of this License along with the Program.
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for
|
||||
a fee.
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source
|
||||
code under the terms of section 4, provided that you also meet all of these conditions:
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
|
||||
b) The work must carry prominent notices stating that it is released under this License and any conditions added under
|
||||
section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
|
||||
c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all
|
||||
its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way,
|
||||
but it does not invalidate such permission if you have separately received it.
|
||||
d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has
|
||||
interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
|
||||
A compilation of a covered work with other separate and independent works, which are not by their nature extensions of
|
||||
the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or
|
||||
distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the
|
||||
access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other parts of the aggregate.
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License, in one of these ways:
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied
|
||||
by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
|
||||
b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied
|
||||
by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for
|
||||
that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all
|
||||
the software in the product that is covered by this License, on a durable physical medium customarily used for software
|
||||
interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2)
|
||||
access to copy the Corresponding Source from a network server at no charge.
|
||||
c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source.
|
||||
This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an
|
||||
offer, in accord with subsection 6b.
|
||||
d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent
|
||||
access to the Corresponding Source in the same way through the same place at no further charge. You need not require
|
||||
recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a
|
||||
network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports
|
||||
equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it
|
||||
is available for as long as needed to satisfy these requirements.
|
||||
e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and
|
||||
Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
|
||||
A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library,
|
||||
need not be included in conveying the object code work.
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used
|
||||
for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In
|
||||
determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a
|
||||
particular product received by a particular user, “normally used” refers to a typical or common use of that class of
|
||||
product, regardless of the status of the particular user or of the way in which the particular user actually uses, or
|
||||
expects or is expected to use, the product. A product is a consumer product regardless of whether the product has
|
||||
substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of
|
||||
the product.
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information
|
||||
required to install and execute modified versions of a covered work in that User Product from a modified version of its
|
||||
Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code
|
||||
is in no case prevented or interfered with solely because modification has been made.
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the
|
||||
conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to
|
||||
the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding
|
||||
Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not
|
||||
apply if neither you nor any third party retains the ability to install modified object code on the User Product (for
|
||||
example, the work has been installed in ROM).
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
The requirement to provide Installation Information does not include a requirement to continue to provide support
|
||||
service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product
|
||||
in which it has been modified or installed. Access to a network may be denied when the modification itself materially
|
||||
and adversely affects the operation of the network or violates the rules and protocols for communication across the
|
||||
network.
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format
|
||||
that is publicly documented (and with an implementation available to the public in source code form), and must require
|
||||
no special password or key for unpacking, reading or copying.
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
7. Additional Terms.
|
||||
“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its
|
||||
conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were
|
||||
included in this License, to the extent that they are valid under applicable law. If additional permissions apply only
|
||||
to part of the Program, that part may be used separately under those permissions, but the entire Program remains
|
||||
governed by this License without regard to the additional permissions.
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or
|
||||
from any part of it. (Additional permissions may be written to require their own removal in certain cases when you
|
||||
modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have
|
||||
or can give appropriate copyright permission.
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by
|
||||
the copyright holders of that material) supplement the terms of this License with terms:
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
|
||||
b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the
|
||||
Appropriate Legal Notices displayed by works containing it; or
|
||||
c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be
|
||||
marked in reasonable ways as different from the original version; or
|
||||
d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
|
||||
e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
|
||||
f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified
|
||||
versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual
|
||||
assumptions directly impose on those licensors and authors.
|
||||
All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the
|
||||
Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with
|
||||
a term that is a further restriction, you may remove that term. If a license document contains a further restriction but
|
||||
permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of
|
||||
that license document, provided that the further restriction does not survive such relicensing or conveying.
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a
|
||||
statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as
|
||||
exceptions; the above requirements apply either way.
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
8. Termination.
|
||||
You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to
|
||||
propagate or modify it is void, and will automatically terminate your rights under this License (including any patent
|
||||
licenses granted under the third paragraph of section 11).
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated
|
||||
(a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and
|
||||
(b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days
|
||||
after the cessation.
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you
|
||||
of the violation by some reasonable means, this is the first time you have received notice of violation of this License
|
||||
(for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
Termination of your rights under this section does not terminate the licenses of parties who have received copies or
|
||||
rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not
|
||||
qualify to receive new licenses for the same material under section 10.
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a
|
||||
covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not
|
||||
require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered
|
||||
work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run,
|
||||
modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third
|
||||
parties with this License.
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or
|
||||
subdividing an organization, or merging organizations. If propagation of a covered work results from an entity
|
||||
transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work
|
||||
the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with
|
||||
reasonable efforts.
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For
|
||||
example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License,
|
||||
and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent
|
||||
claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
11. Patents.
|
||||
A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program
|
||||
is based. The work thus licensed is called the contributor's “contributor version”.
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already
|
||||
acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or
|
||||
selling its contributor version, but do not include claims that would be infringed only as a consequence of further
|
||||
modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent
|
||||
sublicenses in a manner consistent with the requirements of this License.
|
||||
11. Patents.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential
|
||||
patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its
|
||||
contributor version.
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to
|
||||
enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To
|
||||
“grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against
|
||||
the party.
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not
|
||||
available for anyone to copy, free of charge and under the terms of this License, through a publicly available network
|
||||
server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available,
|
||||
or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a
|
||||
manner consistent with the requirements of this License, to extend the patent license to downstream recipients.
|
||||
“Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in
|
||||
a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in
|
||||
that country that you have reason to believe are valid.
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring
|
||||
conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing
|
||||
them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is
|
||||
automatically extended to all recipients of the covered work and works based on it.
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of,
|
||||
or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You
|
||||
may not convey a covered work if you are a party to an arrangement with a third party that is in the business of
|
||||
distributing software, under which you make payment to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a
|
||||
discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from
|
||||
those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered
|
||||
work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to
|
||||
infringement that may otherwise be available to you under applicable patent law.
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this
|
||||
License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to
|
||||
satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence
|
||||
you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further
|
||||
conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License
|
||||
would be to refrain entirely from conveying the Program.
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work
|
||||
licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the
|
||||
resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special
|
||||
requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply
|
||||
to the combination as such.
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to
|
||||
time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new
|
||||
problems or concerns.
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the
|
||||
GNU General Public License “or any later version” applies to it, you have the option of following the terms and
|
||||
conditions either of that numbered version or of any later version published by the Free Software Foundation. If the
|
||||
Program does not specify a version number of the GNU General Public License, you may choose any version ever published
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used,
|
||||
that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the
|
||||
Program.
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different permissions. However, no additional obligations are imposed
|
||||
on any author or copyright holder as a result of your choosing to follow a later version.
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING
|
||||
THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
|
||||
IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU
|
||||
ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
16. Limitation of Liability.
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO
|
||||
MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL,
|
||||
INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO
|
||||
LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM
|
||||
TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to
|
||||
their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil
|
||||
liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program
|
||||
in return for a fee.
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<https://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<https://www.gnu.org/licenses/why-not-lgpl.html>.
|
||||
|
||||
58
README.md
58
README.md
@@ -1,57 +1,47 @@
|
||||
# mcMMO
|
||||
## The RPG lovers mod
|
||||
## The #1 RPG Mod for Minecraft
|
||||
|
||||
## Website
|
||||
I'm working on a brand new website for mcMMO
|
||||
|
||||
You can check it out here http://www.mcmmo.org
|
||||
|
||||
Spigot Resource: https://spigot.mcmmo.org
|
||||
|
||||
I plan to post links to our new wiki (its still under development), downloads, and dev blogs there.
|
||||
|
||||
### Contributing
|
||||
As the plugin is being developed for multiple Minecraft versions, and multiple Minecraft platforms (read: [sponge](https://spongepowered.org/), [spigot](https://spigotmc.org/), bukkit, and [paper](https://papermc.io)), the
|
||||
overall build process is handled by [Gradle](https://gradle.org/) with [Kotlin-dsl](https://github.com/gradle/kotlin-dsl) based scripts.
|
||||
As such, an IDE is strongly recommended when attempting to contribute features, additions, changes, bug fixes, etc. to mcMMO as the scripts handle a
|
||||
majority of our dependencies and rebuilding a production worthy jar.
|
||||
|
||||
To get started, a few things need to be installed:
|
||||
- JDK 8 (not 9, 10, 11, or 7)
|
||||
- git
|
||||
- Your favorite IDE (can be [Eclipse](https://eclipse.org/), [IntelliJ](https://jetbrains.org/)
|
||||
- BuildTools.jar from [Spigot](https://www.spigotmc.org/wiki/buildtools/)
|
||||
|
||||
##### Using BuildTools
|
||||
BuildTools is used to generate the craftbukkit/spigot dependencies used for varoius versions of Minecraft.
|
||||
The key with this tool is that it can build and deploy multiple vesions of Minecraft based on "reviewions".
|
||||
|
||||
|
||||
### Builds
|
||||
Currently, you can obtain our builds via the Spigot resource page: https://spigot.mcmmo.org
|
||||
Currently, you can obtain our builds via the Spigot resource page: http://spigot.mcmmo.org
|
||||
|
||||
### Brief Description
|
||||
The goal of mcMMO is to take core Minecraft game mechanics and expand them into add an extensive and quality RPG experience. Everything in mcMMO has been carefully thought out and is constantly being improved upon. Currently, mcMMO adds fourteen unique skills to train and level in. Each of these skills is highly customizable through our configuration files, allowing server admins to tweak mcMMO to best suit the needs of his or her server. Know that the mcMMO team is dedicated to providing an ever-evolving experience, and that we carefully read all feedback and bug reports in order to evaluate and balance the mechanics of mcMMO in every update.
|
||||
The goal of mcMMO is to take core Minecraft game mechanics and expand them into an extensive and quality RPG experience. Everything in mcMMO has been carefully thought out and is constantly being improved upon. Currently, mcMMO adds fourteen unique skills to train and level in. Each of these skills is highly customizable through our configuration files, allowing server admins to tweak mcMMO to best suit the needs of his or her server. Know that the mcMMO team is dedicated to providing an ever-evolving experience, and that we carefully read all feedback and bug reports in order to evaluate and balance the mechanics of mcMMO in every update.
|
||||
|
||||
## About the Team
|
||||
mcMMO is currently developed by a team of individuals from all over the world.
|
||||
In December 2018, the original author and creator of mcMMO (nossr50) returned and took over the role of project lead once again, to develop and improve mcMMO.
|
||||
#### Project Lead & Founder
|
||||
[](https://github.com/nossr50)
|
||||
|
||||
### Project Lead & Founder
|
||||
[](https://github.com/com.gmail.nossr50)
|
||||
#### mcMMO Devs
|
||||
[](https://github.com/nossr50)
|
||||
[](https://github.com/kashike)
|
||||
[](https://github.com/electronicboy)
|
||||
|
||||
### Former Lead
|
||||
#### Classic Maintainer
|
||||
[](https://github.com/t00thpick1)
|
||||
|
||||
## Former Team Members
|
||||
|
||||
### Former Lead & Awesome guy
|
||||
[](https://github.com/gmcferrin)
|
||||
|
||||
### Developers
|
||||
### Former team members
|
||||
[](https://github.com/bm01)
|
||||
[](https://github.com/Glitchfinder)
|
||||
[](https://github.com/NuclearW)
|
||||
[](https://github.com/shatteredbeam)
|
||||
[](https://github.com/TfT-02)
|
||||
[](https://github.com/t00thpick1)
|
||||
[](https://github.com/riking)
|
||||
|
||||
### Special thanks
|
||||
[](https://github.com/EasyMFnE)
|
||||
Added the Alchemy skill
|
||||
[](https://github.com/TheYeti)
|
||||
|
||||
## Compiling
|
||||
|
||||
@@ -60,7 +50,13 @@ mcMMO uses Maven 3 to manage dependencies, packaging, and shading of necessary c
|
||||
The typical command used to build mcMMO is: `mvn clean package install`
|
||||
|
||||
Required Libraries:
|
||||
* Bukkit
|
||||
* Spigot
|
||||
* JUnit
|
||||
* WorldGuard 7
|
||||
* bStats Bukkit
|
||||
|
||||
https://spigot.mcmmo.org for more up to date information.
|
||||
|
||||
Resource Page
|
||||
|
||||
https://www.spigotmc.org/resources/official-mcmmo-original-author-returns.64348/
|
||||
|
||||
161
build.gradle.kts
161
build.gradle.kts
@@ -1,139 +1,30 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
|
||||
/*
|
||||
* Declares the version of the Gradle wrapper. We need 4.9 for now because
|
||||
* ForgeGradle 3+ is a hard dependency for Gradle 4.9, 4.10 is not compatible
|
||||
*/
|
||||
val wrapper by tasks.getting(Wrapper::class) {
|
||||
gradleVersion = "4.9"
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets up project references to be used in child scripts, like
|
||||
* ":bukkit", ":core", ":sponge" where these projects need to be
|
||||
* referred to for dependencies, paths, outputs etc.
|
||||
* Projects is specifically an object stored in <root>/buildSrc/src/main/java/Config.kt
|
||||
* It's a nullable variable, but we just store it here and use it elsewhere.
|
||||
*/
|
||||
Projects.core = project("core")
|
||||
Projects.bukkit = project("bukkit")
|
||||
Projects.sponge = project("sponge")
|
||||
/*
|
||||
Declares the various other projects and stores them to Gradle's `extra` properties.
|
||||
These are potentially usable for other purposes, but for now, they're here only to
|
||||
declare the values for this root project's dependency (for shadowjar)
|
||||
*/
|
||||
var core: Project by extra { project("core") }
|
||||
val bukkit by extra { project("bukkit") }
|
||||
val bukkit_18 by extra { bukkit.project("1_8_8") }
|
||||
val bukkit_112 by extra { bukkit.project("1_12") }
|
||||
val bukkit_113 by extra { bukkit.project("1_13") }
|
||||
val sponge by extra { project("sponge") }
|
||||
val sponge_7 by extra { sponge.project("api7") }
|
||||
|
||||
group = properties["pluginGroup"]!!
|
||||
version = properties["pluginVersion"]!!
|
||||
|
||||
/*
|
||||
Even though all projects declares some of these plugins, we want to declare them the traditional
|
||||
way so that we can have IDE utiliziation and processing, it helps with writing these scripts.
|
||||
*/
|
||||
plugins {
|
||||
`java-library`
|
||||
`maven-publish`
|
||||
id("com.github.johnrengelman.shadow") version "4.0.4"
|
||||
}
|
||||
|
||||
/*
|
||||
Default management for ALL projects, not just root, or ":bukkit", but all projects and
|
||||
their children projects.
|
||||
*/
|
||||
allprojects {
|
||||
/*
|
||||
We need the java library processing, and shadow allows us to run
|
||||
shadowJar to relocate dependencies and bundle dependencies into a fat jar.
|
||||
*/
|
||||
apply(plugin="java-library")
|
||||
apply(plugin="com.github.johnrengelman.shadow")
|
||||
|
||||
/*
|
||||
Defines all the repositories for all project dependency resolutions. Some of these
|
||||
repositories are meant for specific dependencies, so the content filters will
|
||||
prevent attempts at resolving those dependencies being requested at those repositories.
|
||||
Constants are defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
*/
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven(Repos.sk89q) // WorldEdit/WorldGuard
|
||||
maven(Repos.bstats) // bstats
|
||||
maven(Repos.sponge) // Sponge, Configurate, and some other things
|
||||
maven(Repos.spigot) // Spigot and Bukkit
|
||||
maven(Repos.sonatype) // General Maven
|
||||
mavenLocal() // For nms packages
|
||||
}
|
||||
|
||||
// Sets all projects compatibility level to Java 8
|
||||
java {
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
// Encoding for all packages is UTF-8
|
||||
tasks.getting(JavaCompile::class) {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
// Default shadow jar configuration. Sub projects will override and add on,
|
||||
// but this sets up at the very least the jdbc connection dependencies to be relocated
|
||||
val shadowJar by tasks.getting(ShadowJar::class) { // Configure basics of relocation
|
||||
relocate(Shadow.Origin.juli, Shadow.Target.juli)
|
||||
relocate(Shadow.Origin.tomcat, Shadow.Target.tomcat)
|
||||
exclude(Shadow.Exclude.ForgeGradle.dummyThing)
|
||||
exclude(Shadow.Exclude.ForgeGradle.template)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
All subprojects shadowjar tasks that will exclude various dependencies, while
|
||||
the root project will include some of these dependencies (like jdbc, configurate)
|
||||
so that the sub project jars are already somewhat minimized, in the event those
|
||||
platform jars are to be deployed individually versus an overall "all platforms"
|
||||
jar.
|
||||
*/
|
||||
subprojects {
|
||||
val shadowJar by tasks.getting(ShadowJar::class) {
|
||||
dependencies {
|
||||
exclude(dependency("${Deps.Groups.sponge}:${Deps.Modules.configurate_yaml}"))
|
||||
exclude(dependency(Shadow.Exclude.guava))
|
||||
exclude(dependency(Shadow.Exclude.snakeyaml))
|
||||
exclude(dependency(Shadow.Exclude.tomcat))
|
||||
exclude(dependency(Shadow.Exclude.juli))
|
||||
apply(plugin = "java-library")
|
||||
// Java is not explicitly needed, but keeps IJ happy with the tasks block
|
||||
apply(plugin = "java")
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
maven("https://oss.sonatype.org/content/groups/public/")
|
||||
maven("https://repo.spongepowered.org/maven")
|
||||
maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots")
|
||||
maven("https://repo.codemc.org/repository/maven-public")
|
||||
maven("https://maven.sk89q.com/repo")
|
||||
maven("https://mvnrepository.com/artifact/org.jetbrains/annotations")
|
||||
maven("https://repo.aikar.co/content/groups/aikar/")
|
||||
maven("https://hub.spigotmc.org/nexus/content/groups/public/")
|
||||
}
|
||||
|
||||
tasks {
|
||||
withType(JavaCompile::class.java) {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
}
|
||||
|
||||
configure<JavaPluginConvention> {
|
||||
targetCompatibility = JavaVersion.VERSION_1_8
|
||||
sourceCompatibility = JavaVersion.VERSION_1_8
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Sets up this root project to depend on all the implementations supported.
|
||||
// By default, they all already should have shadow relocations and packaging,
|
||||
// and their dependencies should not be leaking into this project.
|
||||
dependencies {
|
||||
compile(bukkit)
|
||||
compile(sponge)
|
||||
compile(bukkit_18)
|
||||
compile(bukkit_112)
|
||||
compile(bukkit_113)
|
||||
compile(sponge_7)
|
||||
}
|
||||
|
||||
// Configure shadow for the root project, we want to relocate bstats-bukkit
|
||||
// and whatever else is configured in the allProjects configuration
|
||||
val shadowJar by tasks.getting(ShadowJar::class) { // Root shadow relocation
|
||||
|
||||
relocate(Shadow.Origin.bstatsBukkit, Shadow.Target.bstatsBukkit)
|
||||
|
||||
baseName = "mcMMO"
|
||||
classifier = "bundle"
|
||||
}
|
||||
|
||||
// Tell the build task to depend on shadowjar.
|
||||
val build by tasks
|
||||
build.dependsOn(shadowJar)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
plugins {
|
||||
`kotlin-dsl`
|
||||
}
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
@file:Suppress("MayBeConstant", "unused")
|
||||
|
||||
import org.gradle.api.Project
|
||||
|
||||
object Plugins {
|
||||
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
|
||||
|
||||
object FG2_3 {
|
||||
const val classpath = "net.minecraftforge.gradle:ForgeGradle:${Versions.fg23}"
|
||||
const val extensionName = "minecraft"
|
||||
const val id = "net.minecraftforge.gradle.forge"
|
||||
}
|
||||
}
|
||||
|
||||
object Repos {
|
||||
const val sk89q = "https://maven.sk89q.com/repo"
|
||||
// bStats
|
||||
const val bstats = "https://repo.codemc.org/repository/maven-public"
|
||||
// configurate
|
||||
const val sponge = "https://repo.spongepowered.org/maven/"
|
||||
const val spigot = "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
|
||||
const val sonatype = "https://oss.sonatype.org/content/repositories/snapshots"
|
||||
const val forge = "https://files.minecraftforge.net/maven/"
|
||||
}
|
||||
|
||||
object Config {
|
||||
|
||||
object Libs {
|
||||
const val configurate = "${Deps.Groups.sponge}:${Deps.Modules.configurate_yaml}:${Versions.configurate}"
|
||||
const val jdbc = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}:${Versions.jdbc}"
|
||||
const val juli = "${Deps.Groups.tomcat}:${Deps.Modules.juli}:${Versions.jdbc}"
|
||||
const val junitDep = "${Deps.Groups.junit}:${Deps.Modules.junit}:${Versions.junit}"
|
||||
const val flowmath = "${Deps.Groups.flowpowered}:${Deps.Modules.flowmath}:${Versions.flowmath}"
|
||||
|
||||
object Bukkit {
|
||||
object `1_8` {
|
||||
const val api = "$bukkit:${Versions.bukkit18}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit18}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit18}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit18}"
|
||||
// only legacy existed at this point, no core.
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg18}"
|
||||
}
|
||||
|
||||
object `1_12` {
|
||||
const val api = "$bukkit:${Versions.bukkit112}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit112}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit112}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit112}"
|
||||
// only legacy existed at this point, no core.
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg112}"
|
||||
}
|
||||
|
||||
object `1_13` {
|
||||
const val api = "$bukkit:${Versions.bukkit113}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit113}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit113}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit113}"
|
||||
const val wgCore = "${Bukkit.wgCore}:${Versions.wg113}"
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg113}"
|
||||
}
|
||||
|
||||
const val bukkit = "${Deps.Groups.bukkit}:${Deps.Modules.bukkit}"
|
||||
const val craftbukkit = "${Deps.Groups.bukkit}:${Deps.Modules.craftbukkit}"
|
||||
const val wgCore = "${Deps.Groups.worldguard}:${Deps.Modules.wgCore}"
|
||||
const val wgLegacy = "${Deps.Groups.worldguard}:${Deps.Modules.wgLegacy}"
|
||||
const val spigotApi = "${Deps.Groups.spigot}:${Deps.Modules.spigotApi}"
|
||||
const val spigot = "${Deps.Groups.spigot}:${Deps.Modules.spigot}"
|
||||
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsBukit}:${Versions.bstats}"
|
||||
}
|
||||
|
||||
object Sponge {
|
||||
object API7 { // All of these are specific to the API7 module, API8 will change
|
||||
const val forgeGradleId = "net.minecraftforge.gradle.forge"
|
||||
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
|
||||
const val spongeGradleVersion = "0.9.0"
|
||||
const val api = "${Sponge.api}:${Versions.sapi7}"
|
||||
const val common = "${Sponge.common}:${Versions.spongeImpl7}"
|
||||
const val forge_version = "14.23.5.2768"
|
||||
const val minecraftVersion = "1.12.2-$forge_version"
|
||||
const val mappings = "snapshot_20180808"
|
||||
}
|
||||
|
||||
object Exclude {
|
||||
const val group = Deps.Groups.sponge
|
||||
const val module = Deps.Modules.spongeAPI
|
||||
}
|
||||
|
||||
const val api = "${Deps.Groups.sponge}:${Deps.Modules.spongeAPI}"
|
||||
const val common = "${Deps.Groups.sponge}:${Deps.Modules.spongecommon}"
|
||||
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsSponge}:${Versions.bstats}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object Deps {
|
||||
object Groups {
|
||||
const val nossr = "com.gmail.nossr50"
|
||||
const val google = "com.google"
|
||||
const val guava = "com.google.guava"
|
||||
const val gson = "com.google.code.gson"
|
||||
const val yaml = "org.yaml"
|
||||
const val sk89q = "com.sk89q"
|
||||
const val apache = "org.apache"
|
||||
const val worldguard = "$sk89q.worldguard"
|
||||
const val worldedit = "$sk89q.worldedit"
|
||||
const val sponge = "org.spongepowered"
|
||||
const val spigot = "org.spigotmc"
|
||||
const val md5 = "net.md_5"
|
||||
const val bukkit = "org.bukkit"
|
||||
const val bstats = "org.bstats"
|
||||
const val tomcat = "org.apache.tomcat"
|
||||
const val junit = "junit"
|
||||
const val checker = "org.checkerframework"
|
||||
const val flowpowered = "com.flowpowered"
|
||||
}
|
||||
|
||||
object Modules {
|
||||
const val guava = "guava"
|
||||
const val gson = "gson"
|
||||
const val snakeyaml = "snakeyaml"
|
||||
const val wgCore = "worldguard-core"
|
||||
const val wgLegacy = "worldguard-legacy"
|
||||
const val bungeecordChat = "bungeecord-chat"
|
||||
const val spongeAPI = "spongeapi"
|
||||
const val spongecommon = "spongecommon"
|
||||
const val spongeforge = "spongeforge"
|
||||
const val spongevanilla = "spongevanilla"
|
||||
const val bukkit = "bukkit"
|
||||
const val craftbukkit = "craftbukkit"
|
||||
const val bstatsBukit = "bstats-bukkit"
|
||||
const val bstatsSponge = "bstats-sponge"
|
||||
const val spigotApi = "spigot-api"
|
||||
const val spigot = "spigot"
|
||||
const val configurate = "configurate"
|
||||
const val configurate_core = "${configurate}-core"
|
||||
const val configurate_yaml = "${configurate}-yaml"
|
||||
const val jdbc = "tomcat-jdbc"
|
||||
const val juli = "tomcat-juli"
|
||||
const val junit = "junit"
|
||||
const val checker = "checker-qual"
|
||||
const val flowmath = "flow-math"
|
||||
}
|
||||
}
|
||||
|
||||
object Projects {
|
||||
var core: Project? = null
|
||||
var bukkit: Project? = null
|
||||
var sponge: Project? = null
|
||||
}
|
||||
|
||||
object Shadow {
|
||||
object Origin {
|
||||
const val juli = "${Deps.Groups.apache}.juli"
|
||||
const val tomcat = "${Deps.Groups.apache}.tomcat"
|
||||
const val apache = "${Deps.Groups.apache}.commons.logging"
|
||||
const val bstatsBukkit = "${Deps.Groups.bstats}.bukkit"
|
||||
const val configurate = "ninja.leaping.configurate"
|
||||
const val checker = "org.checkerframework"
|
||||
}
|
||||
|
||||
object Target {
|
||||
const val juli = "${Deps.Groups.nossr}.database.tomcat.juli"
|
||||
const val tomcat = "${Deps.Groups.nossr}.database.tomcat"
|
||||
const val apache = "${Deps.Groups.nossr}.commons.logging"
|
||||
const val bstatsBukkit = "${Deps.Groups.nossr}.metrics.bstat"
|
||||
const val configurate = "${Deps.Groups.nossr}.${Deps.Modules.configurate}"
|
||||
const val checker = "${Deps.Groups.nossr}.${Deps.Modules.configurate}.checkerframework"
|
||||
}
|
||||
|
||||
object Exclude {
|
||||
const val tomcat = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}"
|
||||
const val juli = "${Deps.Groups.apache}:${Deps.Modules.juli}"
|
||||
const val guava = "${Deps.Groups.guava}:${Deps.Modules.guava}"
|
||||
const val snakeyaml = "${Deps.Groups.yaml}:${Deps.Modules.snakeyaml}"
|
||||
const val bukkit = Deps.Groups.bukkit
|
||||
const val spigot = Deps.Groups.spigot
|
||||
const val sk89q = "com.sk89q"
|
||||
const val wg = "$sk89q.worldguard"
|
||||
const val intake = "$sk89q.intake"
|
||||
const val flyway = "com.flywaydb"
|
||||
const val khelekore = "org.khelekore"
|
||||
const val findbugs = "com.google.code.findbugs"
|
||||
const val bstats = "${Deps.Groups.bstats}"
|
||||
|
||||
object ForgeGradle {
|
||||
const val dummyThing = "dummyThing"
|
||||
const val template = "Version.java.template"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
object Versions {
|
||||
const val configurate = "3.6" // Latest configurate
|
||||
const val flowmath = "1.0.4-SNAPSHOT"
|
||||
const val bukkit18 = "1.8.8-R0.1-SNAPSHOT" // Last bukkit 1.8.8
|
||||
const val bukkit112 = "1.12.2-R0.1-SNAPSHOT" // Last bukkit 1.12.2
|
||||
const val bukkit113 = "1.13.2-R0.1-SNAPSHOT" // Latest bukkit
|
||||
const val sapi7 = "7.1.0" // Latest SpongeAPI stable
|
||||
const val spongeImpl7 = "7.1.5" // Latest SpongeCommon stable
|
||||
const val jdbc = "7.0.52"
|
||||
const val junit = "4.12"
|
||||
const val fg23 = "2.3-SNAPSHOT" // ForgeGradle to support MC 1.12.2
|
||||
const val wg18 = "6.1.2" // Bukkit/CraftBukkit/Spigot 1.8.8 supported build, works on newer, but last one to support 1.8.8
|
||||
const val wg112 = "6.2" // Last WorldGuard to support 1.12
|
||||
const val wg113 = "7.0.0-SNAPSHOT" // Latest WorldGuard to support 1.13.2
|
||||
const val bstats = "1.4" // Supports all backwards compatible. Always relocated
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_12` as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts.
|
||||
|
||||
plugins {
|
||||
java // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.12.2
|
||||
compileOnly(Bukkit.nms) // CraftBukkit for 1.12.2
|
||||
compileOnly(Bukkit.wgLegacy) // WorldGuard for 1.12.2 bukkit
|
||||
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_12;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_12_R1.Chunk;
|
||||
import net.minecraft.server.v1_12_R1.EntityTypes;
|
||||
import net.minecraft.server.v1_12_R1.IBlockData;
|
||||
import net.minecraft.server.v1_12_R1.IBlockState;
|
||||
import net.minecraft.server.v1_12_R1.MinecraftKey;
|
||||
import net.minecraft.server.v1_12_R1.RegistryBlocks;
|
||||
import net.minecraft.server.v1_12_R1.RegistryMaterials;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.CraftChunk;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlockState;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
/**
|
||||
* Static reference to the block registry. Don't really care about the fact that
|
||||
* it is being stored as a reference here, but for imports reasons, it's smaller
|
||||
* line length makes it optimal to read for method usages.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_12_R1.Block> BLOCK_REGISTRY = net.minecraft.server.v1_12_R1.Block.REGISTRY;
|
||||
/**
|
||||
* We can keep track of block state id's by generating them on demand, i.e., when
|
||||
* they're being requested from Blocks, or BlockDatas.
|
||||
*/
|
||||
private static final RegistryMaterials<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final Chunk chunk = ((CraftChunk) block.getChunk()).getHandle();
|
||||
// Get the block state from the underlying chunk (stored by reference in CraftBlock)
|
||||
final IBlockData blockState = chunk.a(block.getX(), block.getY(), block.getZ());
|
||||
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
|
||||
final MinecraftKey key = BLOCK_REGISTRY.b(blockState.getBlock());
|
||||
return key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
|
||||
final net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
||||
// And then... well. we get the string id from the registry, based on the entity class to id mapping in EntityTypes.
|
||||
final MinecraftKey key = EntityTypes.a(nmsEntity);
|
||||
// If the key is null, well, we've got bigger problems...
|
||||
return key == null ? "minecraft:slime" : key.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Since we don't really want to trust what "BlockState" gives us, and the API doesn't give us anything but
|
||||
// what the API wants to give us, we have to dig into internals to get the true BlockState representation
|
||||
final CraftBlockState craftState = (CraftBlockState) block;
|
||||
// Because CraftBlock also stores the chunk reference, we can short cut in to use the chunk, instead of pinging
|
||||
// the chunk map on WorldServer
|
||||
final CraftChunk craftChunk = (CraftChunk) craftState.getChunk();
|
||||
// Then query for the block state from the chunk.
|
||||
final IBlockData nmsState = craftChunk.getHandle().a(block.getX(), block.getY(), block.getZ());
|
||||
// And then we're gucci
|
||||
final net.minecraft.server.v1_12_R1.Block nmsBlock = nmsState.getBlock();
|
||||
final MinecraftKey blockKey = BLOCK_REGISTRY.b(nmsBlock);
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.b(nmsState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.getKey();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.t();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
|
||||
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_13` as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import allows us to "import as" for shorthand
|
||||
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.13.2 - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.nms) // CraftBukkit-1.13.2-R0.1-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgCore) // WorldGuard-core - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgLegacy) // WorldGuard-legacy - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_13;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_13_R2.EntityTypes;
|
||||
import net.minecraft.server.v1_13_R2.IBlockData;
|
||||
import net.minecraft.server.v1_13_R2.IBlockState;
|
||||
import net.minecraft.server.v1_13_R2.IRegistry;
|
||||
import net.minecraft.server.v1_13_R2.MinecraftKey;
|
||||
import net.minecraft.server.v1_13_R2.RegistryMaterials;
|
||||
import net.minecraft.server.v1_13_R2.WorldServer;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlockState;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
|
||||
private static final IRegistry<net.minecraft.server.v1_13_R2.Block> BLOCK_REGISTRY = IRegistry.BLOCK;
|
||||
private static final IRegistry<EntityTypes<?>> ENTITY_REGISTRY = IRegistry.ENTITY_TYPE;
|
||||
/**
|
||||
* We use {@link RegistryMaterials} because we don't want to default to another block state,
|
||||
* if a {@link IBlockData} is not registered, we need to generate an ID and register that key to
|
||||
* that {@link IBlockData}. By default, this should be populated during plugin startup by
|
||||
* calling some init method, but that will be determined later.
|
||||
*/
|
||||
private static final IRegistry<IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final WorldServer world = ((CraftBlock) block).getCraftWorld().getHandle();
|
||||
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
|
||||
final IBlockData blockState = world.getType(((CraftBlock) block).getPosition());
|
||||
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
|
||||
final MinecraftKey key = BLOCK_REGISTRY.getKey(blockState.getBlock());
|
||||
// Sometimes, there's a rare case with mods where the key is going to be null, but should never happen in bukkit/spigot.
|
||||
return key == null ? "minecraft:air" : key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
|
||||
final EntityTypes<?> entityType = ((CraftEntity) entity).getHandle().P();
|
||||
// And then... well. we get the string id from the registry!
|
||||
final MinecraftKey key = ENTITY_REGISTRY.getKey(entityType);
|
||||
// If the key is null, well, we've got bigger problems...
|
||||
return key == null ? "minecraft:slime" : key.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
|
||||
// the world.
|
||||
final CraftBlockState craftState = (CraftBlockState) block;
|
||||
final IBlockData nmsState = craftState.getHandle();
|
||||
final net.minecraft.server.v1_13_R2.Block nmsBlock = nmsState.getBlock();
|
||||
final MinecraftKey blockKey = BLOCK_REGISTRY.getKey(nmsBlock);
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.getKey(nmsState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.getKey();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.getStateMap();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
|
||||
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_8` as Bukkit
|
||||
|
||||
plugins {
|
||||
java
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.8.8 - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.nms) // CraftBukkit-1.8.8-R0.3-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgLegacy) // Old worldguard - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_8;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_8_R3.Blocks;
|
||||
import net.minecraft.server.v1_8_R3.EntityTypes;
|
||||
import net.minecraft.server.v1_8_R3.IBlockData;
|
||||
import net.minecraft.server.v1_8_R3.IBlockState;
|
||||
import net.minecraft.server.v1_8_R3.MinecraftKey;
|
||||
import net.minecraft.server.v1_8_R3.RegistryBlocks;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressWarnings({"unused", "Duplicates"}) // We use reflection to load this handler on 1.8 versions
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
|
||||
/**
|
||||
* Static reference to the block registry. Don't really care about the fact that
|
||||
* it is being stored as a reference here, but for imports reasons, it's smaller
|
||||
* line length makes it optimal to read for method usages.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_8_R3.Block> BLOCK_REGISTRY = net.minecraft.server.v1_8_R3.Block.REGISTRY;
|
||||
/**
|
||||
* We can keep track of block state id's by generating them on demand, i.e., when
|
||||
* they're being requested from Blocks, or BlockDatas.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryBlocks<>(BLOCK_REGISTRY.c(Blocks.AIR)); // Default to AIR
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final net.minecraft.server.v1_8_R3.Block block1 = CraftMagicNumbers.getBlock(block);
|
||||
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
|
||||
final MinecraftKey key = BLOCK_REGISTRY.c(block1);
|
||||
return key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// EntityTypes maintains the maps of Class<? extends nms.Entity> to String for id's and to numerical id numbers.
|
||||
// We of course are using the method that gets us the String id of the entity, such as "minecraft:creeper"
|
||||
return EntityTypes.b(((CraftEntity) entity).getHandle());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
|
||||
// the world.
|
||||
final net.minecraft.server.v1_8_R3.Block nmsBlock = net.minecraft.server.v1_8_R3.Block.REGISTRY.a(block.getTypeId());
|
||||
final MinecraftKey blockKey = net.minecraft.server.v1_8_R3.Block.REGISTRY.c(nmsBlock);
|
||||
final IBlockData blockState = nmsBlock.fromLegacyData(block.getRawData());
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.c(blockState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.a();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(blockKey.a()); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState, Comparable> properties = blockState.b();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
for (Map.Entry<IBlockState, Comparable> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, blockState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.gmail.nossr50.platform.bukkit;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.block.CraftBlock;
|
||||
|
||||
public class Testing18 {
|
||||
|
||||
Material material;
|
||||
|
||||
CraftBlock block;
|
||||
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import Config.Libs.Bukkit as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import as allows for shorthand.
|
||||
|
||||
val bukkit: Project = Projects.bukkit!! // Static project references
|
||||
val core: Project = Projects.core!! // Stored by Config.kt and created in <root>/build.gradle.kts
|
||||
|
||||
/* This configures ":bukkit" and it's dependent projects:
|
||||
- ":bukkit:1_8_8"
|
||||
- ":bukkit:1_12"
|
||||
- ":bukkit:1_13"
|
||||
Basically sets up all projects to depend on ":core" and
|
||||
bstats-bukkit. Also sets up shadow to relocate bukkit related
|
||||
packages to limit platform interference
|
||||
*/
|
||||
allprojects {
|
||||
|
||||
dependencies {
|
||||
compile(core) // includes junit for tests
|
||||
implementation(Bukkit.bstats) // Bukkit bstats
|
||||
}
|
||||
|
||||
// TODO dunno if this works yet... project needs to compile.
|
||||
val shadowJar by tasks.getting(ShadowJar::class) {
|
||||
// Relocate bstats for bukkit, as per requirement for bstats
|
||||
relocate(Shadow.Origin.bstatsBukkit, Shadow.Target.bstatsBukkit)
|
||||
// Relocate the bukkit platform classes of mcmmo so we don't
|
||||
// interfere with other platform classes (or core)
|
||||
relocate(Deps.Groups.nossr, "${Deps.Groups.nossr}.bukkit") {
|
||||
exclude("${Deps.Groups.nossr}.core")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Tells all subprojects of ":bukkit" (":bukkit:1_8_8", ":bukkit:1_12",etc.)
|
||||
// to depend on this project (":bukkit") to inherit the dependencies, and
|
||||
// does NOT inherit the same configurations (anything configured outside
|
||||
// here does not persist to child projects).
|
||||
subprojects {
|
||||
dependencies {
|
||||
// Provide the base bukkit plugin dependency for plugin classloading.
|
||||
// All "versioned" implementations will be properly classloaded by the bukkit parent
|
||||
compileOnly(bukkit)
|
||||
}
|
||||
}
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
dependencies {
|
||||
// Temporary dependencies while things are being moved.
|
||||
compileOnly(Bukkit.`1_13`.spigotApi) { // Spigot API for generic usage. Based on 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.api) { // Bukkit API for generic usage. Based on 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.wgCore) { // WorldGuard dependency, again, for 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
exclude(group = Shadow.Exclude.sk89q)
|
||||
exclude(group = Shadow.Exclude.intake, module = "intake")
|
||||
exclude(group = Shadow.Exclude.sk89q, module = "squirrelid")
|
||||
exclude(group = Shadow.Exclude.flyway)
|
||||
exclude(group = Shadow.Exclude.khelekore)
|
||||
exclude(group = Shadow.Exclude.findbugs)
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.wgLegacy) {
|
||||
isTransitive = true // We don't want the dependencies
|
||||
exclude(group = Shadow.Exclude.bukkit)
|
||||
exclude(group = Shadow.Exclude.sk89q, module = "commandbook")
|
||||
exclude(group = Shadow.Exclude.bstats)
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.gmail.nossr50;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class BukkitBlockType {
|
||||
|
||||
private Material material;
|
||||
|
||||
private BlockData blockData;
|
||||
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
package com.gmail.nossr50;
|
||||
|
||||
import com.sk89q.worldedit.extension.platform.NoCapablePlatformException;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
public abstract class VersionedHandler {
|
||||
private static VersionedHandler instance;
|
||||
|
||||
private final mcMMO plugin;
|
||||
|
||||
protected VersionedHandler(mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string value id of the BlockType, note that this is not the
|
||||
* blockstate.
|
||||
*
|
||||
* Examples include: "minecraft:stone", "minecraft:chest", "thaumcraft:log2"
|
||||
* BlockStates are more specific like "minecraft:log[variant=oak,axis=x]"
|
||||
*
|
||||
* This should be casting down and retrieving the id from the block registry maintained by vanilla.
|
||||
*
|
||||
* @param block The block instance (holds byte/numerical id or sometimes block state in newer versions)
|
||||
* @return The string id of the block type
|
||||
*/
|
||||
public abstract String getIdFor(Block block);
|
||||
|
||||
/**
|
||||
* Gets the string value id of the Entity, much like blocks, this is not
|
||||
* the full string representation of the entity, just the string id of the
|
||||
* TYPE.
|
||||
*
|
||||
* Examples include: "minecraft:creeeper", "minecraft:sheep", "thaumcraft:wisp"
|
||||
*
|
||||
* @param entity The entity instance
|
||||
* @return The string id of the entity's registered type.
|
||||
*/
|
||||
public abstract String getIdFor(Entity entity);
|
||||
|
||||
// Technically can be TileEntity snapshot references as well.
|
||||
public abstract String getIdFor(BlockState block);
|
||||
|
||||
/**
|
||||
* Gets the {@link VersionedHandler} instance for this running platform.
|
||||
* Note that all the handler does is perform various operations necessitated
|
||||
* by either a lack of, or bridging an implementation of some API/core aspects
|
||||
* that are not available through Bukkit API (like getting BlockType id's, or
|
||||
* BlockState id's).
|
||||
*
|
||||
* @param plugin The mcmmo plugin
|
||||
* @return The version handler instance
|
||||
*/
|
||||
public VersionedHandler getInstance(mcMMO plugin) {
|
||||
if (instance == null) {
|
||||
final String serverPackage = mcMMO.p.getServer().getClass().getPackage().getName();
|
||||
final String serverVersion = serverPackage.substring(serverPackage.lastIndexOf(".") + 1);
|
||||
try {
|
||||
final Class<?> clazz = Class.forName("com.gmail.nossr50.bukkit." + serverVersion + ".NmsHandler");
|
||||
if (VersionedHandler.class.isAssignableFrom(clazz)) {
|
||||
instance = (VersionedHandler) clazz.getConstructor(mcMMO.class).newInstance(plugin);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new NoCapablePlatformException("Could not discover a valid mcMMO VersionedHandler for version:" + serverVersion);
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.data.database.FlatfileDatabaseManager;
|
||||
import com.gmail.nossr50.core.data.database.SQLDatabaseManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MHDCommand implements TabExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (mcMMO.getDatabaseManager() instanceof SQLDatabaseManager) {
|
||||
SQLDatabaseManager m = (SQLDatabaseManager) mcMMO.getDatabaseManager();
|
||||
m.resetMobHealthSettings();
|
||||
for (McMMOPlayer player : UserManager.getPlayers()) {
|
||||
player.getProfile().setMobHealthbarType(MainConfig.getInstance().getMobHealthbarDefault());
|
||||
}
|
||||
sender.sendMessage("Mob health reset");
|
||||
return true;
|
||||
}
|
||||
if (mcMMO.getDatabaseManager() instanceof FlatfileDatabaseManager) {
|
||||
FlatfileDatabaseManager m = (FlatfileDatabaseManager) mcMMO.getDatabaseManager();
|
||||
m.resetMobHealthSettings();
|
||||
for (McMMOPlayer player : UserManager.getPlayers()) {
|
||||
player.getProfile().setMobHealthbarType(MainConfig.getInstance().getMobHealthbarDefault());
|
||||
}
|
||||
sender.sendMessage("Mob health reset");
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
@@ -1,325 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.skills.ModConfigType;
|
||||
import com.gmail.nossr50.core.util.Misc;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
|
||||
public class McImportCommand implements CommandExecutor {
|
||||
int fileAmount;
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
importModConfig();
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean importModConfig() {
|
||||
String importFilePath = mcMMO.getModDirectory() + File.separator + "import";
|
||||
File importFile = new File(importFilePath, "import.log");
|
||||
mcMMO.p.getLogger().info("Starting import of mod materials...");
|
||||
fileAmount = 0;
|
||||
|
||||
HashMap<ModConfigType, ArrayList<String>> materialNames = new HashMap<ModConfigType, ArrayList<String>>();
|
||||
|
||||
BufferedReader in = null;
|
||||
|
||||
try {
|
||||
// Open the file
|
||||
in = new BufferedReader(new FileReader(importFile));
|
||||
|
||||
String line;
|
||||
String materialName;
|
||||
String modName;
|
||||
|
||||
// While not at the end of the file
|
||||
while ((line = in.readLine()) != null) {
|
||||
String[] split1 = line.split("material ");
|
||||
|
||||
if (split1.length != 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] split2 = split1[1].split(" with");
|
||||
|
||||
if (split2.length != 2) {
|
||||
continue;
|
||||
}
|
||||
|
||||
materialName = split2[0];
|
||||
|
||||
// Categorise each material under a mod config type
|
||||
ModConfigType type = ModConfigType.getModConfigType(materialName);
|
||||
|
||||
if (!materialNames.containsKey(type)) {
|
||||
materialNames.put(type, new ArrayList<String>());
|
||||
}
|
||||
|
||||
materialNames.get(type).add(materialName);
|
||||
continue;
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
mcMMO.p.getLogger().warning("Could not find " + importFile.getAbsolutePath() + " ! (No such file or directory)");
|
||||
mcMMO.p.getLogger().warning("Copy and paste latest.log to " + importFile.getParentFile().getAbsolutePath() + " and rename it to import.log");
|
||||
return false;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return false;
|
||||
} finally {
|
||||
tryClose(in);
|
||||
}
|
||||
|
||||
createOutput(materialNames);
|
||||
|
||||
mcMMO.p.getLogger().info("Import finished! Created " + fileAmount + " files!");
|
||||
return true;
|
||||
}
|
||||
|
||||
private void createOutput(HashMap<ModConfigType, ArrayList<String>> materialNames) {
|
||||
for (ModConfigType modConfigType : materialNames.keySet()) {
|
||||
HashMap<String, ArrayList<String>> materialNamesType = new HashMap<String, ArrayList<String>>();
|
||||
|
||||
for (String materialName : materialNames.get(modConfigType)) {
|
||||
String modName = Misc.getModName(materialName);
|
||||
|
||||
if (!materialNamesType.containsKey(modName)) {
|
||||
materialNamesType.put(modName, new ArrayList<String>());
|
||||
}
|
||||
|
||||
materialNamesType.get(modName).add(materialName);
|
||||
}
|
||||
|
||||
createOutput(modConfigType, materialNamesType);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void tryClose(Closeable c) {
|
||||
if (c == null) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
c.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
private void createOutput(ModConfigType modConfigType, HashMap<String, ArrayList<String>> materialNames) {
|
||||
File outputFilePath = new File(mcMMO.getModDirectory() + File.separator + "output");
|
||||
if (!outputFilePath.exists() && !outputFilePath.mkdirs()) {
|
||||
mcMMO.p.getLogger().severe("Could not create output directory! " + outputFilePath.getAbsolutePath());
|
||||
}
|
||||
|
||||
FileWriter out = null;
|
||||
String type = modConfigType.name().toLowerCase();
|
||||
|
||||
for (String modName : materialNames.keySet()) {
|
||||
File outputFile = new File(outputFilePath, modName + "." + type + ".yml");
|
||||
mcMMO.p.getLogger().info("Creating " + outputFile.getName());
|
||||
try {
|
||||
if (outputFile.exists() && !outputFile.delete()) {
|
||||
mcMMO.p.getLogger().severe("Not able to delete old output file! " + outputFile.getAbsolutePath());
|
||||
}
|
||||
|
||||
if (!outputFile.createNewFile()) {
|
||||
mcMMO.p.getLogger().severe("Could not create output file! " + outputFile.getAbsolutePath());
|
||||
continue;
|
||||
}
|
||||
|
||||
StringBuilder writer = new StringBuilder();
|
||||
HashMap<String, ArrayList<String>> configSections = getConfigSections(modConfigType, modName, materialNames);
|
||||
|
||||
if (configSections == null) {
|
||||
mcMMO.p.getLogger().severe("Something went wrong!! type is " + type);
|
||||
return;
|
||||
}
|
||||
|
||||
// Write the file, go through each skill and write all the materials
|
||||
for (String configSection : configSections.keySet()) {
|
||||
if (configSection.equals("UNIDENTIFIED")) {
|
||||
writer.append("# This isn't a valid config section and all materials in this category need to be").append("\r\n");
|
||||
writer.append("# copy and pasted to a valid section of this config file.").append("\r\n");
|
||||
}
|
||||
writer.append(configSection).append(":").append("\r\n");
|
||||
|
||||
for (String line : configSections.get(configSection)) {
|
||||
writer.append(line).append("\r\n");
|
||||
}
|
||||
|
||||
writer.append("\r\n");
|
||||
}
|
||||
|
||||
out = new FileWriter(outputFile);
|
||||
out.write(writer.toString());
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return;
|
||||
} finally {
|
||||
tryClose(out);
|
||||
fileAmount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private HashMap<String, ArrayList<String>> getConfigSections(ModConfigType type, String modName, HashMap<String, ArrayList<String>> materialNames) {
|
||||
switch (type) {
|
||||
case BLOCKS:
|
||||
return getConfigSectionsBlocks(modName, materialNames);
|
||||
case TOOLS:
|
||||
return getConfigSectionsTools(modName, materialNames);
|
||||
case ARMOR:
|
||||
return getConfigSectionsArmor(modName, materialNames);
|
||||
case UNKNOWN:
|
||||
return getConfigSectionsUnknown(modName, materialNames);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private HashMap<String, ArrayList<String>> getConfigSectionsBlocks(String modName, HashMap<String, ArrayList<String>> materialNames) {
|
||||
HashMap<String, ArrayList<String>> configSections = new HashMap<String, ArrayList<String>>();
|
||||
|
||||
// Go through all the materials and categorise them under a skill
|
||||
for (String materialName : materialNames.get(modName)) {
|
||||
String skillName = "UNIDENTIFIED";
|
||||
if (materialName.contains("ORE")) {
|
||||
skillName = "Mining";
|
||||
} else if (materialName.contains("LOG") || materialName.contains("LEAVES")) {
|
||||
skillName = "Woodcutting";
|
||||
} else if (materialName.contains("GRASS") || materialName.contains("FLOWER") || materialName.contains("CROP")) {
|
||||
skillName = "Herbalism";
|
||||
} else if (materialName.contains("DIRT") || materialName.contains("SAND")) {
|
||||
skillName = "Excavation";
|
||||
}
|
||||
|
||||
if (!configSections.containsKey(skillName)) {
|
||||
configSections.put(skillName, new ArrayList<String>());
|
||||
}
|
||||
|
||||
ArrayList<String> skillContents = configSections.get(skillName);
|
||||
skillContents.add(" " + materialName + "|0:");
|
||||
skillContents.add(" " + " " + "XP_Gain: 99");
|
||||
skillContents.add(" " + " " + "Double_Drops_Enabled: true");
|
||||
|
||||
if (skillName.equals("Mining")) {
|
||||
skillContents.add(" " + " " + "Smelting_XP_Gain: 9");
|
||||
} else if (skillName.equals("Woodcutting")) {
|
||||
skillContents.add(" " + " " + "Is_Log: " + materialName.contains("LOG"));
|
||||
}
|
||||
}
|
||||
|
||||
return configSections;
|
||||
}
|
||||
|
||||
private HashMap<String, ArrayList<String>> getConfigSectionsTools(String modName, HashMap<String, ArrayList<String>> materialNames) {
|
||||
HashMap<String, ArrayList<String>> configSections = new HashMap<String, ArrayList<String>>();
|
||||
|
||||
// Go through all the materials and categorise them under a tool type
|
||||
for (String materialName : materialNames.get(modName)) {
|
||||
String toolType = "UNIDENTIFIED";
|
||||
if (materialName.contains("PICKAXE")) {
|
||||
toolType = "Pickaxes";
|
||||
} else if (materialName.contains("AXE")) {
|
||||
toolType = "Axes";
|
||||
} else if (materialName.contains("BOW")) {
|
||||
toolType = "Bows";
|
||||
} else if (materialName.contains("HOE")) {
|
||||
toolType = "Hoes";
|
||||
} else if (materialName.contains("SHOVEL") || materialName.contains("SPADE")) {
|
||||
toolType = "Shovels";
|
||||
} else if (materialName.contains("SWORD")) {
|
||||
toolType = "Swords";
|
||||
}
|
||||
|
||||
if (!configSections.containsKey(toolType)) {
|
||||
configSections.put(toolType, new ArrayList<String>());
|
||||
}
|
||||
|
||||
ArrayList<String> skillContents = configSections.get(toolType);
|
||||
skillContents.add(" " + materialName + ":");
|
||||
skillContents.add(" " + " " + "XP_Modifier: 1.0");
|
||||
skillContents.add(" " + " " + "Tier: 1");
|
||||
skillContents.add(" " + " " + "Ability_Enabled: true");
|
||||
addRepairableLines(materialName, skillContents);
|
||||
}
|
||||
|
||||
return configSections;
|
||||
}
|
||||
|
||||
private HashMap<String, ArrayList<String>> getConfigSectionsArmor(String modName, HashMap<String, ArrayList<String>> materialNames) {
|
||||
HashMap<String, ArrayList<String>> configSections = new HashMap<String, ArrayList<String>>();
|
||||
|
||||
// Go through all the materials and categorise them under an armor type
|
||||
for (String materialName : materialNames.get(modName)) {
|
||||
String toolType = "UNIDENTIFIED";
|
||||
if (materialName.contains("BOOT") || materialName.contains("SHOE")) {
|
||||
toolType = "Boots";
|
||||
} else if (materialName.contains("CHESTPLATE") || materialName.contains("CHEST")) {
|
||||
toolType = "Chestplates";
|
||||
} else if (materialName.contains("HELM") || materialName.contains("HAT")) {
|
||||
toolType = "Helmets";
|
||||
} else if (materialName.contains("LEGGINGS") || materialName.contains("LEGS") || materialName.contains("PANTS")) {
|
||||
toolType = "Leggings";
|
||||
}
|
||||
|
||||
if (!configSections.containsKey(toolType)) {
|
||||
configSections.put(toolType, new ArrayList<String>());
|
||||
}
|
||||
|
||||
ArrayList<String> skillContents = configSections.get(toolType);
|
||||
skillContents.add(" " + materialName + ":");
|
||||
addRepairableLines(materialName, skillContents);
|
||||
}
|
||||
|
||||
return configSections;
|
||||
}
|
||||
|
||||
private void addRepairableLines(String materialName, ArrayList<String> skillContents) {
|
||||
skillContents.add(" " + " " + "Repairable: true");
|
||||
skillContents.add(" " + " " + "Repair_Material: REPAIR_MATERIAL_NAME");
|
||||
skillContents.add(" " + " " + "Repair_Material_Data_Value: 0");
|
||||
skillContents.add(" " + " " + "Repair_Material_Quantity: 9");
|
||||
skillContents.add(" " + " " + "Repair_Material_Pretty_Name: Repair Item Name");
|
||||
skillContents.add(" " + " " + "Repair_MinimumLevel: 0");
|
||||
skillContents.add(" " + " " + "Repair_XpMultiplier: 1.0");
|
||||
|
||||
Material material = Material.matchMaterial(materialName);
|
||||
short durability = (material == null) ? (short) 9999 : material.getMaxDurability();
|
||||
skillContents.add(" " + " " + "Durability: " + ((durability > 0) ? durability : (short) 9999));
|
||||
}
|
||||
|
||||
private HashMap<String, ArrayList<String>> getConfigSectionsUnknown(String modName, HashMap<String, ArrayList<String>> materialNames) {
|
||||
HashMap<String, ArrayList<String>> configSections = new HashMap<String, ArrayList<String>>();
|
||||
|
||||
// Go through all the materials and print them
|
||||
for (String materialName : materialNames.get(modName)) {
|
||||
String configKey = "UNIDENTIFIED";
|
||||
|
||||
if (!configSections.containsKey(configKey)) {
|
||||
configSections.put(configKey, new ArrayList<String>());
|
||||
}
|
||||
|
||||
ArrayList<String> skillContents = configSections.get(configKey);
|
||||
skillContents.add(" " + materialName);
|
||||
}
|
||||
|
||||
return configSections;
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class McabilityCommand extends ToggleCommand {
|
||||
@Override
|
||||
protected boolean hasOtherPermission(CommandSender sender) {
|
||||
return Permissions.mcabilityOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasSelfPermission(CommandSender sender) {
|
||||
return Permissions.mcability(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
|
||||
mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.Ability." + (mcMMOPlayer.getAbilityUse() ? "Off" : "On")));
|
||||
mcMMOPlayer.toggleAbilityUse();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void sendSuccessMessage(CommandSender sender, String playerName) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Ability.Toggle", playerName));
|
||||
}
|
||||
}
|
||||
@@ -1,29 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class McgodCommand extends ToggleCommand {
|
||||
@Override
|
||||
protected boolean hasOtherPermission(CommandSender sender) {
|
||||
return Permissions.mcgodOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasSelfPermission(CommandSender sender) {
|
||||
return Permissions.mcgod(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
|
||||
mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.GodMode." + (mcMMOPlayer.getGodMode() ? "Disabled" : "Enabled")));
|
||||
mcMMOPlayer.toggleGodMode();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void sendSuccessMessage(CommandSender sender, String playerName) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.GodMode.Toggle", playerName));
|
||||
}
|
||||
}
|
||||
@@ -1,115 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.commands.party.PartySubcommandType;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class McmmoCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
if (!Permissions.mcmmoDescription(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
String description = LocaleLoader.getString("mcMMO.Description");
|
||||
String[] mcSplit = description.split(",");
|
||||
sender.sendMessage(mcSplit);
|
||||
|
||||
if (MainConfig.getInstance().getDonateMessageEnabled()) {
|
||||
sender.sendMessage(LocaleLoader.getString("MOTD.Donate"));
|
||||
sender.sendMessage(ChatColor.GOLD + " - " + ChatColor.GREEN + "com.gmail.nossr50@com.gmail.com" + ChatColor.GOLD + " Paypal");
|
||||
}
|
||||
|
||||
if (Permissions.showversion(sender)) {
|
||||
sender.sendMessage(LocaleLoader.getString("MOTD.Version", mcMMO.p.getDescription().getVersion()));
|
||||
}
|
||||
|
||||
mcMMO.getHolidayManager().anniversaryCheck(sender);
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
if (args[0].equalsIgnoreCase("?") || args[0].equalsIgnoreCase("help") || args[0].equalsIgnoreCase("commands")) {
|
||||
if (!Permissions.mcmmoHelp(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcc.Header"));
|
||||
displayGeneralCommands(sender);
|
||||
displayOtherCommands(sender);
|
||||
displayPartyCommands(sender);
|
||||
}
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private void displayGeneralCommands(CommandSender sender) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /mcstats " + LocaleLoader.getString("Commands.Stats"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /<skill>" + LocaleLoader.getString("Commands.SkillInfo"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /mctop " + LocaleLoader.getString("Commands.Leaderboards"));
|
||||
|
||||
if (Permissions.inspect(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /inspect " + LocaleLoader.getString("Commands.Inspect"));
|
||||
}
|
||||
|
||||
if (Permissions.mcability(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /mcability " + LocaleLoader.getString("Commands.ToggleAbility"));
|
||||
}
|
||||
}
|
||||
|
||||
private void displayOtherCommands(CommandSender sender) {
|
||||
//Don't show them this category if they have none of the permissions
|
||||
if (!Permissions.skillreset(sender) && !Permissions.mmoedit(sender) && !Permissions.adminChat(sender) && !Permissions.mcgod(sender))
|
||||
return;
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Other"));
|
||||
|
||||
if (Permissions.skillreset(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /skillreset <skill|all> " + LocaleLoader.getString("Commands.Reset"));
|
||||
}
|
||||
|
||||
if (Permissions.mmoedit(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /mmoedit " + LocaleLoader.getString("Commands.mmoedit"));
|
||||
}
|
||||
|
||||
if (Permissions.adminChat(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /adminchat " + LocaleLoader.getString("Commands.AdminToggle"));
|
||||
}
|
||||
|
||||
if (Permissions.mcgod(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /mcgod " + LocaleLoader.getString("Commands.mcgod"));
|
||||
}
|
||||
}
|
||||
|
||||
private void displayPartyCommands(CommandSender sender) {
|
||||
if (Permissions.party(sender)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Party.Commands"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party create <" + LocaleLoader.getString("Commands.Usage.PartyName") + "> " + LocaleLoader.getString("Commands.Party1"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party join <" + LocaleLoader.getString("Commands.Usage.Player") + "> " + LocaleLoader.getString("Commands.Party2"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party quit " + LocaleLoader.getString("Commands.Party.Quit"));
|
||||
|
||||
if (Permissions.partyChat(sender)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party chat " + LocaleLoader.getString("Commands.Party.Toggle"));
|
||||
}
|
||||
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party invite <" + LocaleLoader.getString("Commands.Usage.Player") + "> " + LocaleLoader.getString("Commands.Party.Invite"));
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party accept " + LocaleLoader.getString("Commands.Party.Accept"));
|
||||
|
||||
if (Permissions.partySubcommand(sender, PartySubcommandType.TELEPORT)) {
|
||||
sender.sendMessage(ChatColor.DARK_AQUA + " /party teleport <" + LocaleLoader.getString("Commands.Usage.Player") + "> " + LocaleLoader.getString("Commands.Party.Teleport"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class McnotifyCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer((Player) sender);
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Notifications." + (mcMMOPlayer.useChatNotifications() ? "Off" : "On")));
|
||||
mcMMOPlayer.toggleChatNotifications();
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class McrefreshCommand extends ToggleCommand {
|
||||
@Override
|
||||
protected boolean hasOtherPermission(CommandSender sender) {
|
||||
return Permissions.mcrefreshOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasSelfPermission(CommandSender sender) {
|
||||
return Permissions.mcrefresh(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
|
||||
mcMMOPlayer.setRecentlyHurt(0);
|
||||
mcMMOPlayer.resetCooldowns();
|
||||
mcMMOPlayer.resetToolPrepMode();
|
||||
mcMMOPlayer.resetAbilityMode();
|
||||
|
||||
mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Ability.Generic.Refresh"));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void sendSuccessMessage(CommandSender sender, String playerName) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcrefresh.Success", playerName));
|
||||
}
|
||||
}
|
||||
@@ -1,117 +0,0 @@
|
||||
package com.gmail.nossr50.commands;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.core.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.player.NotificationManager;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class XprateCommand implements TabExecutor {
|
||||
private final double ORIGINAL_XP_RATE = ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier();
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
if (!args[0].equalsIgnoreCase("reset") && !args[0].equalsIgnoreCase("clear")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!Permissions.xprateReset(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mcMMO.p.isXPEventEnabled()) {
|
||||
|
||||
if (AdvancedConfig.getInstance().useTitlesForXPEvent()) {
|
||||
NotificationManager.broadcastTitle(mcMMO.p.getServer(),
|
||||
LocaleLoader.getString("Commands.Event.Stop"),
|
||||
LocaleLoader.getString("Commands.Event.Stop.Subtitle"),
|
||||
10, 10 * 20, 20);
|
||||
}
|
||||
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop"));
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Stop.Subtitle"));
|
||||
|
||||
mcMMO.p.toggleXpEventEnabled();
|
||||
}
|
||||
|
||||
ExperienceConfig.getInstance().setExperienceGainsGlobalMultiplier(ORIGINAL_XP_RATE);
|
||||
return true;
|
||||
|
||||
case 2:
|
||||
if (CommandUtils.isInvalidInteger(sender, args[0])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!Permissions.xprateSet(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.shouldDisableToggle(args[1])) {
|
||||
mcMMO.p.setXPEventEnabled(false);
|
||||
} else if (CommandUtils.shouldEnableToggle(args[1])) {
|
||||
mcMMO.p.setXPEventEnabled(true);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
int newXpRate = Integer.parseInt(args[0]);
|
||||
|
||||
if (newXpRate < 0) {
|
||||
sender.sendMessage(ChatColor.RED + LocaleLoader.getString("Commands.NegativeNumberWarn"));
|
||||
return true;
|
||||
}
|
||||
|
||||
ExperienceConfig.getInstance().setExperienceGainsGlobalMultiplier(newXpRate);
|
||||
|
||||
if (mcMMO.p.isXPEventEnabled()) {
|
||||
if (AdvancedConfig.getInstance().useTitlesForXPEvent()) {
|
||||
NotificationManager.broadcastTitle(mcMMO.p.getServer(),
|
||||
LocaleLoader.getString("Commands.Event.Start"),
|
||||
LocaleLoader.getString("Commands.Event.XP", newXpRate),
|
||||
10, 10 * 20, 20);
|
||||
}
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.Start"));
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Commands.Event.XP", newXpRate));
|
||||
} else {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.xprate.modified", newXpRate));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
if (StringUtils.isInt(args[0])) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
|
||||
return StringUtil.copyPartialMatches(args[0], CommandUtils.RESET_OPTIONS, new ArrayList<String>(CommandUtils.RESET_OPTIONS.size()));
|
||||
case 2:
|
||||
return StringUtil.copyPartialMatches(args[1], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.gmail.nossr50.commands.chat;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.chat.ChatMode;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class AdminChatCommand extends ChatCommand {
|
||||
public AdminChatCommand() {
|
||||
super(ChatMode.ADMIN);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleChatSending(CommandSender sender, String[] args) {
|
||||
chatManager.handleChat(sender.getName(), getDisplayName(sender), buildChatMessage(args, 0));
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.gmail.nossr50.commands.chat;
|
||||
|
||||
import com.gmail.nossr50.commands.ToggleCommand;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class McChatSpy extends ToggleCommand {
|
||||
@Override
|
||||
protected boolean hasOtherPermission(CommandSender sender) {
|
||||
return Permissions.adminChatSpyOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean hasSelfPermission(CommandSender sender) {
|
||||
return Permissions.adminChatSpy(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
|
||||
mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.AdminChatSpy." + (mcMMOPlayer.isPartyChatSpying() ? "Disabled" : "Enabled")));
|
||||
mcMMOPlayer.togglePartyChatSpying();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void sendSuccessMessage(CommandSender sender, String playerName) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.AdminChatSpy.Toggle", playerName));
|
||||
}
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
package com.gmail.nossr50.commands.chat;
|
||||
|
||||
import com.gmail.nossr50.core.chat.PartyChatManager;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.chat.ChatMode;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyFeature;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyChatCommand extends ChatCommand {
|
||||
public PartyChatCommand() {
|
||||
super(ChatMode.PARTY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleChatSending(CommandSender sender, String[] args) {
|
||||
Party party;
|
||||
String message;
|
||||
|
||||
if (sender instanceof Player) {
|
||||
party = UserManager.getPlayer((Player) sender).getParty();
|
||||
|
||||
if (party == null) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (party.getLevel() < MainConfig.getInstance().getPartyFeatureUnlockLevel(PartyFeature.CHAT)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.1"));
|
||||
return;
|
||||
}
|
||||
|
||||
message = buildChatMessage(args, 0);
|
||||
} else {
|
||||
if (args.length < 2) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Specify"));
|
||||
return;
|
||||
}
|
||||
|
||||
party = PartyManager.getParty(args[0]);
|
||||
|
||||
if (party == null) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.InvalidName"));
|
||||
return;
|
||||
}
|
||||
|
||||
message = buildChatMessage(args, 1);
|
||||
}
|
||||
|
||||
((PartyChatManager) chatManager).setParty(party);
|
||||
chatManager.handleChat(sender.getName(), getDisplayName(sender), message);
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
package com.gmail.nossr50.commands.database;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManager;
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManagerFactory;
|
||||
import com.gmail.nossr50.core.datatypes.database.DatabaseType;
|
||||
import com.gmail.nossr50.core.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.runnables.database.DatabaseConversionTask;
|
||||
import com.gmail.nossr50.core.runnables.player.PlayerProfileLoadingTask;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ConvertDatabaseCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
DatabaseType previousType = DatabaseType.getDatabaseType(args[1]);
|
||||
DatabaseType newType = mcMMO.getDatabaseManager().getDatabaseType();
|
||||
|
||||
if (previousType == newType || (newType == DatabaseType.CUSTOM && DatabaseManagerFactory.getCustomDatabaseManagerClass().getSimpleName().equalsIgnoreCase(args[1]))) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Same", newType.toString()));
|
||||
return true;
|
||||
}
|
||||
|
||||
DatabaseManager oldDatabase = DatabaseManagerFactory.createDatabaseManager(previousType);
|
||||
|
||||
if (previousType == DatabaseType.CUSTOM) {
|
||||
Class<?> clazz;
|
||||
|
||||
try {
|
||||
clazz = Class.forName(args[1]);
|
||||
|
||||
if (!DatabaseManager.class.isAssignableFrom(clazz)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1]));
|
||||
return true;
|
||||
}
|
||||
|
||||
oldDatabase = DatabaseManagerFactory.createCustomDatabaseManager((Class<? extends DatabaseManager>) clazz);
|
||||
} catch (Throwable e) {
|
||||
e.printStackTrace();
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.InvalidType", args[1]));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Database.Start", previousType.toString(), newType.toString()));
|
||||
|
||||
UserManager.saveAll();
|
||||
UserManager.clearAll();
|
||||
|
||||
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
|
||||
PlayerProfile profile = oldDatabase.loadPlayerProfile(player.getUniqueId());
|
||||
|
||||
if (profile.isLoaded()) {
|
||||
mcMMO.getDatabaseManager().saveUser(profile);
|
||||
}
|
||||
|
||||
new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
|
||||
}
|
||||
|
||||
new DatabaseConversionTask(oldDatabase, sender, previousType.toString(), newType.toString()).runTaskAsynchronously(mcMMO.p);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
package com.gmail.nossr50.commands.database;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class McremoveCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
String playerName = CommandUtils.getMatchedPlayerName(args[0]);
|
||||
|
||||
if (UserManager.getOfflinePlayer(playerName) == null && CommandUtils.unloadedProfile(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mcMMO.getDatabaseManager().removeUser(playerName)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcremove.Success", playerName));
|
||||
} else {
|
||||
sender.sendMessage(playerName + " could not be removed from the database."); // Pretty sure this should NEVER happen.
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
|
||||
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.gmail.nossr50.commands.database;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManagerFactory;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MmoshowdbCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
Class<?> clazz = DatabaseManagerFactory.getCustomDatabaseManagerClass();
|
||||
|
||||
if (clazz != null) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", clazz.getName()));
|
||||
return true;
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mmoshowdb", (MainConfig.getInstance().getUseMySQL() ? "sql" : "flatfile")));
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
package com.gmail.nossr50.commands.experience;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
|
||||
import com.gmail.nossr50.core.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.EventUtils;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class AddlevelsCommand extends ExperienceCommand {
|
||||
@Override
|
||||
protected boolean permissionsCheckSelf(CommandSender sender) {
|
||||
return Permissions.addlevels(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean permissionsCheckOthers(CommandSender sender) {
|
||||
return Permissions.addlevelsOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
|
||||
float xpRemoved = profile.getSkillXpLevelRaw(skill);
|
||||
profile.addLevels(skill, value);
|
||||
|
||||
if (player == null) {
|
||||
profile.scheduleAsyncSave();
|
||||
return;
|
||||
}
|
||||
|
||||
EventUtils.handleLevelChangeEvent(player, skill, value, xpRemoved, true, XPGainReason.COMMAND);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageAll(Player player, int value) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardAll.1", value));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.addlevels.AwardSkill.1", value, skill.getName()));
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
package com.gmail.nossr50.commands.experience;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
|
||||
import com.gmail.nossr50.core.datatypes.experience.XPGainSource;
|
||||
import com.gmail.nossr50.core.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class AddxpCommand extends ExperienceCommand {
|
||||
@Override
|
||||
protected boolean permissionsCheckSelf(CommandSender sender) {
|
||||
return Permissions.addxp(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean permissionsCheckOthers(CommandSender sender) {
|
||||
return Permissions.addxpOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
|
||||
if (player != null) {
|
||||
UserManager.getPlayer(player).applyXpGain(skill, value, XPGainReason.COMMAND, XPGainSource.COMMAND);
|
||||
} else {
|
||||
profile.addXp(skill, value);
|
||||
profile.scheduleAsyncSave();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageAll(Player player, int value) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardAll", value));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.addxp.AwardSkill", value, skill.getName()));
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package com.gmail.nossr50.commands.experience;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.experience.FormulaType;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.runnables.database.FormulaConversionTask;
|
||||
import com.gmail.nossr50.core.runnables.player.PlayerProfileLoadingTask;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class ConvertExperienceCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
FormulaType previousType = mcMMO.getFormulaManager().getPreviousFormulaType();
|
||||
FormulaType newType = FormulaType.getFormulaType(args[1].toUpperCase());
|
||||
|
||||
if (newType == FormulaType.UNKNOWN) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Invalid"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (previousType == newType) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Same", newType.toString()));
|
||||
return true;
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.mcconvert.Experience.Start", previousType.toString(), newType.toString()));
|
||||
|
||||
UserManager.saveAll();
|
||||
UserManager.clearAll();
|
||||
|
||||
new FormulaConversionTask(sender, newType).runTaskLater(mcMMO.p, 1);
|
||||
|
||||
for (Player player : mcMMO.p.getServer().getOnlinePlayers()) {
|
||||
new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
package com.gmail.nossr50.commands.experience;
|
||||
|
||||
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
|
||||
import com.gmail.nossr50.core.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.EventUtils;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class MmoeditCommand extends ExperienceCommand {
|
||||
@Override
|
||||
protected boolean permissionsCheckSelf(CommandSender sender) {
|
||||
return Permissions.mmoedit(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean permissionsCheckOthers(CommandSender sender) {
|
||||
return Permissions.mmoeditOthers(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleCommand(Player player, PlayerProfile profile, PrimarySkillType skill, int value) {
|
||||
int skillLevel = profile.getSkillLevel(skill);
|
||||
float xpRemoved = profile.getSkillXpLevelRaw(skill);
|
||||
|
||||
profile.modifySkill(skill, value);
|
||||
|
||||
if (player == null) {
|
||||
profile.scheduleAsyncSave();
|
||||
return;
|
||||
}
|
||||
|
||||
if (value == skillLevel) {
|
||||
return;
|
||||
}
|
||||
|
||||
EventUtils.handleLevelChangeEvent(player, skill, value, xpRemoved, value > skillLevel, XPGainReason.COMMAND);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageAll(Player player, int value) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.mmoedit.AllSkills.1", value));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handlePlayerMessageSkill(Player player, int value, PrimarySkillType skill) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.mmoedit.Modified.1", skill.getName(), value));
|
||||
}
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.gmail.nossr50.commands.hardcore;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class HardcoreCommand extends HardcoreModeCommand {
|
||||
@Override
|
||||
protected boolean checkTogglePermissions(CommandSender sender) {
|
||||
return Permissions.hardcoreToggle(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkModifyPermissions(CommandSender sender) {
|
||||
return Permissions.hardcoreModify(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkEnabled(PrimarySkillType skill) {
|
||||
if (skill == null) {
|
||||
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
|
||||
if (!primarySkillType.getHardcoreStatLossEnabled()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return skill.getHardcoreStatLossEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void enable(PrimarySkillType skill) {
|
||||
toggle(true, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable(PrimarySkillType skill) {
|
||||
toggle(false, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void modify(CommandSender sender, double newPercentage) {
|
||||
MainConfig.getInstance().setHardcoreDeathStatPenaltyPercentage(newPercentage);
|
||||
sender.sendMessage(LocaleLoader.getString("Hardcore.DeathStatLoss.PercentageChanged", percent.format(newPercentage / 100.0D)));
|
||||
}
|
||||
|
||||
private void toggle(boolean enable, PrimarySkillType skill) {
|
||||
if (skill == null) {
|
||||
for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
|
||||
primarySkillType.setHardcoreStatLossEnabled(enable);
|
||||
}
|
||||
} else {
|
||||
skill.setHardcoreStatLossEnabled(enable);
|
||||
}
|
||||
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.DeathStatLoss.Name"), (skill == null ? "all skills" : skill.getName())));
|
||||
}
|
||||
}
|
||||
@@ -1,134 +0,0 @@
|
||||
package com.gmail.nossr50.commands.hardcore;
|
||||
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public abstract class HardcoreModeCommand implements TabExecutor {
|
||||
protected final DecimalFormat percent = new DecimalFormat("##0.00%");
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
if (!checkTogglePermissions(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (checkEnabled(null)) {
|
||||
disable(null);
|
||||
} else {
|
||||
enable(null);
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
if (CommandUtils.shouldEnableToggle(args[0])) {
|
||||
if (!Permissions.hardcoreToggle(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
enable(null);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.shouldDisableToggle(args[0])) {
|
||||
if (!Permissions.hardcoreToggle(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
disable(null);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.isInvalidDouble(sender, args[0])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!Permissions.hardcoreModify(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
modify(sender, Double.parseDouble(args[0]));
|
||||
return true;
|
||||
|
||||
|
||||
case 2:
|
||||
if (CommandUtils.isInvalidSkill(sender, args[0])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
PrimarySkillType skill = PrimarySkillType.getSkill(args[0]);
|
||||
|
||||
if (!CommandUtils.isChildSkill(sender, skill)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.shouldEnableToggle(args[1])) {
|
||||
if (!Permissions.hardcoreToggle(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
enable(skill);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.shouldDisableToggle(args[1])) {
|
||||
if (!Permissions.hardcoreToggle(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
enable(skill);
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
if (StringUtils.isDouble(args[0])) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
|
||||
return StringUtil.copyPartialMatches(args[0], CommandUtils.TRUE_FALSE_OPTIONS, new ArrayList<String>(CommandUtils.TRUE_FALSE_OPTIONS.size()));
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract boolean checkTogglePermissions(CommandSender sender);
|
||||
|
||||
protected abstract boolean checkModifyPermissions(CommandSender sender);
|
||||
|
||||
protected abstract boolean checkEnabled(PrimarySkillType skill);
|
||||
|
||||
protected abstract void enable(PrimarySkillType skill);
|
||||
|
||||
protected abstract void disable(PrimarySkillType skill);
|
||||
|
||||
protected abstract void modify(CommandSender sender, double newPercentage);
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
package com.gmail.nossr50.commands.hardcore;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class VampirismCommand extends HardcoreModeCommand {
|
||||
@Override
|
||||
protected boolean checkTogglePermissions(CommandSender sender) {
|
||||
return Permissions.vampirismToggle(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkModifyPermissions(CommandSender sender) {
|
||||
return Permissions.vampirismModify(sender);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean checkEnabled(PrimarySkillType skill) {
|
||||
if (skill == null) {
|
||||
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
|
||||
if (!primarySkillType.getHardcoreVampirismEnabled()) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return skill.getHardcoreVampirismEnabled();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void enable(PrimarySkillType skill) {
|
||||
toggle(true, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void disable(PrimarySkillType skill) {
|
||||
toggle(false, skill);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void modify(CommandSender sender, double newPercentage) {
|
||||
MainConfig.getInstance().setHardcoreVampirismStatLeechPercentage(newPercentage);
|
||||
sender.sendMessage(LocaleLoader.getString("Hardcore.Vampirism.PercentageChanged", percent.format(newPercentage / 100.0D)));
|
||||
}
|
||||
|
||||
private void toggle(boolean enable, PrimarySkillType skill) {
|
||||
if (skill == null) {
|
||||
for (PrimarySkillType primarySkillType : PrimarySkillType.NON_CHILD_SKILLS) {
|
||||
primarySkillType.setHardcoreVampirismEnabled(enable);
|
||||
}
|
||||
} else {
|
||||
skill.setHardcoreVampirismEnabled(enable);
|
||||
}
|
||||
|
||||
mcMMO.p.getServer().broadcastMessage(LocaleLoader.getString("Hardcore.Mode." + (enable ? "Enabled" : "Disabled"), LocaleLoader.getString("Hardcore.Vampirism.Name"), (skill == null ? "all skills" : skill)));
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyAcceptCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
if (!mcMMOPlayer.hasPartyInvite()) {
|
||||
sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Changing parties
|
||||
if (!PartyManager.changeOrJoinParty(mcMMOPlayer, mcMMOPlayer.getPartyInvite().getName())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.joinInvitedParty(mcMMOPlayer);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "accept"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyChangeOwnerCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
Party playerParty = UserManager.getPlayer((Player) sender).getParty();
|
||||
String targetName = CommandUtils.getMatchedPlayerName(args[1]);
|
||||
OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName);
|
||||
|
||||
if (!playerParty.hasMember(target.getUniqueId())) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.setPartyLeader(target.getUniqueId(), playerParty);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "owner", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyCreateCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
case 3:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
// Check to see if the party exists, and if it does cancel creating a new party
|
||||
if (PartyManager.checkPartyExistence(player, args[1])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Changing parties
|
||||
if (!PartyManager.changeOrJoinParty(mcMMOPlayer, args[1])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.createParty(mcMMOPlayer, args[1], getPassword(args));
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "create", "<" + LocaleLoader.getString("Commands.Usage.PartyName") + ">", "[" + LocaleLoader.getString("Commands.Usage.Password") + "]"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPassword(String[] args) {
|
||||
if (args.length == 3) {
|
||||
return args[2];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.events.party.McMMOPartyChangeEvent.EventReason;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyDisbandCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
Party playerParty = UserManager.getPlayer((Player) sender).getParty();
|
||||
String partyName = playerParty.getName();
|
||||
|
||||
for (Player member : playerParty.getOnlineMembers()) {
|
||||
if (!PartyManager.handlePartyChangeEvent(member, partyName, null, EventReason.KICKED_FROM_PARTY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
member.sendMessage(LocaleLoader.getString("Party.Disband"));
|
||||
}
|
||||
|
||||
PartyManager.disbandParty(playerParty);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "disband"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class PartyHelpCommand implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.3", "/party join", "/party quit"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.1", "/party create"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.4", "/party <lock|unlock>"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.5", "/party password"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.6", "/party kick"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.7", "/party leader"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.8", "/party disband"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.9", "/party itemshare"));
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Help.10", "/party xpshare"));
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "help"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,128 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyFeature;
|
||||
import com.gmail.nossr50.core.datatypes.party.ShareMode;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PartyInfoCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
case 1:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
Party party = mcMMOPlayer.getParty();
|
||||
|
||||
displayPartyHeader(player, party);
|
||||
displayShareModeInfo(player, party);
|
||||
displayPartyFeatures(player, party);
|
||||
displayMemberInfo(player, mcMMOPlayer, party);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "info"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void displayPartyHeader(Player player, Party party) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Header"));
|
||||
|
||||
StringBuilder status = new StringBuilder();
|
||||
status.append(LocaleLoader.getString("Commands.Party.Status", party.getName(), LocaleLoader.getString("Party.Status." + (party.isLocked() ? "Locked" : "Unlocked")), party.getLevel()));
|
||||
|
||||
if (!party.hasReachedLevelCap()) {
|
||||
status.append(" (").append(party.getXpToLevelPercentage()).append(")");
|
||||
}
|
||||
|
||||
player.sendMessage(status.toString());
|
||||
}
|
||||
|
||||
private void displayPartyFeatures(Player player, Party party) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Features.Header"));
|
||||
|
||||
List<String> unlockedPartyFeatures = new ArrayList<String>();
|
||||
List<String> lockedPartyFeatures = new ArrayList<String>();
|
||||
|
||||
for (PartyFeature partyFeature : PartyFeature.values()) {
|
||||
if (!partyFeature.hasPermission(player)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isUnlockedFeature(party, partyFeature)) {
|
||||
unlockedPartyFeatures.add(partyFeature.getLocaleString());
|
||||
} else {
|
||||
lockedPartyFeatures.add(partyFeature.getFeatureLockedLocaleString());
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.UnlockedFeatures", unlockedPartyFeatures.isEmpty() ? "None" : unlockedPartyFeatures));
|
||||
|
||||
for (String message : lockedPartyFeatures) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
private boolean isUnlockedFeature(Party party, PartyFeature partyFeature) {
|
||||
return party.getLevel() >= MainConfig.getInstance().getPartyFeatureUnlockLevel(partyFeature);
|
||||
}
|
||||
|
||||
private void displayShareModeInfo(Player player, Party party) {
|
||||
boolean xpShareEnabled = isUnlockedFeature(party, PartyFeature.XP_SHARE);
|
||||
boolean itemShareEnabled = isUnlockedFeature(party, PartyFeature.ITEM_SHARE);
|
||||
boolean itemSharingActive = (party.getItemShareMode() != ShareMode.NONE);
|
||||
|
||||
if (!xpShareEnabled && !itemShareEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
String expShareInfo = "";
|
||||
String itemShareInfo = "";
|
||||
String separator = "";
|
||||
|
||||
if (xpShareEnabled) {
|
||||
expShareInfo = LocaleLoader.getString("Commands.Party.ExpShare", party.getXpShareMode().toString());
|
||||
}
|
||||
|
||||
if (itemShareEnabled) {
|
||||
itemShareInfo = LocaleLoader.getString("Commands.Party.ItemShare", party.getItemShareMode().toString());
|
||||
}
|
||||
|
||||
if (xpShareEnabled && itemShareEnabled) {
|
||||
separator = ChatColor.DARK_GRAY + " || ";
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.ShareMode") + expShareInfo + separator + itemShareInfo);
|
||||
|
||||
if (itemSharingActive) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.ItemShareCategories", party.getItemShareCategories()));
|
||||
}
|
||||
}
|
||||
|
||||
private void displayMemberInfo(Player player, McMMOPlayer mcMMOPlayer, Party party) {
|
||||
/*
|
||||
* Only show members of the party that this member can see
|
||||
*/
|
||||
|
||||
List<Player> nearMembers = PartyManager.getNearVisibleMembers(mcMMOPlayer);
|
||||
int membersOnline = party.getVisibleMembers(player).size();
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Members.Header"));
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.MembersNear", nearMembers.size() + 1, membersOnline));
|
||||
player.sendMessage(party.createMembersList(player));
|
||||
}
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyInviteCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
String targetName = CommandUtils.getMatchedPlayerName(args[1]);
|
||||
McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName);
|
||||
|
||||
if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player target = mcMMOTarget.getPlayer();
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
String playerName = player.getName();
|
||||
|
||||
if (player.equals(target)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Invite.Self"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (PartyManager.inSameParty(player, target)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!PartyManager.canInvite(mcMMOPlayer)) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Locked"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Party playerParty = mcMMOPlayer.getParty();
|
||||
|
||||
if (PartyManager.isPartyFull(target, playerParty)) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull.Invite", target.getName(), playerParty.toString(), MainConfig.getInstance().getPartyMaxSize()));
|
||||
return true;
|
||||
}
|
||||
|
||||
mcMMOTarget.setPartyInvite(playerParty);
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success"));
|
||||
target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.0", playerParty.getName(), playerName));
|
||||
target.sendMessage(LocaleLoader.getString("Commands.Party.Invite.1"));
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.ItemShareType;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyFeature;
|
||||
import com.gmail.nossr50.core.datatypes.party.ShareMode;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyItemShareCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
Party party = UserManager.getPlayer((Player) sender).getParty();
|
||||
|
||||
if (party.getLevel() < MainConfig.getInstance().getPartyFeatureUnlockLevel(PartyFeature.ITEM_SHARE)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.4"));
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
ShareMode mode = ShareMode.getShareMode(args[1].toUpperCase());
|
||||
|
||||
if (mode == null) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<NONE | EQUAL | RANDOM>"));
|
||||
return true;
|
||||
}
|
||||
|
||||
handleChangingShareMode(party, mode);
|
||||
return true;
|
||||
|
||||
case 3:
|
||||
boolean toggle;
|
||||
|
||||
if (CommandUtils.shouldEnableToggle(args[2])) {
|
||||
toggle = true;
|
||||
} else if (CommandUtils.shouldDisableToggle(args[2])) {
|
||||
toggle = false;
|
||||
} else {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<loot | mining | herbalism | woodcutting | misc> <true | false>"));
|
||||
return true;
|
||||
}
|
||||
|
||||
try {
|
||||
handleToggleItemShareCategory(party, ItemShareType.valueOf(args[1].toUpperCase()), toggle);
|
||||
} catch (IllegalArgumentException ex) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<loot | mining | herbalism | woodcutting | misc> <true | false>"));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<NONE | EQUAL | RANDOM>"));
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "itemshare", "<loot | mining | herbalism | woodcutting | misc> <true | false>"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleChangingShareMode(Party party, ShareMode mode) {
|
||||
party.setItemShareMode(mode);
|
||||
|
||||
String changeModeMessage = LocaleLoader.getString("Commands.Party.SetSharing", LocaleLoader.getString("Party.ShareType.Item"), LocaleLoader.getString("Party.ShareMode." + StringUtils.getCapitalized(mode.toString())));
|
||||
|
||||
for (Player member : party.getOnlineMembers()) {
|
||||
member.sendMessage(changeModeMessage);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleToggleItemShareCategory(Party party, ItemShareType type, boolean toggle) {
|
||||
party.setSharingDrops(type, toggle);
|
||||
|
||||
String toggleMessage = LocaleLoader.getString("Commands.Party.ToggleShareCategory", StringUtils.getCapitalized(type.toString()), toggle ? "enabled" : "disabled");
|
||||
|
||||
for (Player member : party.getOnlineMembers()) {
|
||||
member.sendMessage(toggleMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,79 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyJoinCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
case 3:
|
||||
String targetName = CommandUtils.getMatchedPlayerName(args[1]);
|
||||
McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
|
||||
|
||||
if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Player target = mcMMOTarget.getPlayer();
|
||||
|
||||
if (!mcMMOTarget.inParty()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
Party targetParty = mcMMOTarget.getParty();
|
||||
|
||||
if (player.equals(target) || (mcMMOPlayer.inParty() && mcMMOPlayer.getParty().equals(targetParty))) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Join.Self"));
|
||||
return true;
|
||||
}
|
||||
|
||||
String password = getPassword(args);
|
||||
|
||||
// Make sure party passwords match
|
||||
if (!PartyManager.checkPartyPassword(player, targetParty, password)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String partyName = targetParty.getName();
|
||||
|
||||
// Changing parties
|
||||
if (!PartyManager.changeOrJoinParty(mcMMOPlayer, partyName)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (PartyManager.isPartyFull(player, targetParty)) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.PartyFull", targetParty.toString()));
|
||||
return true;
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Join", partyName));
|
||||
PartyManager.addToParty(mcMMOPlayer, targetParty);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "join", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">", "[" + LocaleLoader.getString("Commands.Usage.Password") + "]"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPassword(String[] args) {
|
||||
if (args.length == 3) {
|
||||
return args[2];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.events.party.McMMOPartyChangeEvent.EventReason;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyKickCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
Party playerParty = UserManager.getPlayer((Player) sender).getParty();
|
||||
String targetName = CommandUtils.getMatchedPlayerName(args[1]);
|
||||
|
||||
if (!playerParty.hasMember(targetName)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
OfflinePlayer target = mcMMO.p.getServer().getOfflinePlayer(targetName);
|
||||
|
||||
if (target.isOnline()) {
|
||||
Player onlineTarget = target.getPlayer();
|
||||
String partyName = playerParty.getName();
|
||||
|
||||
if (!PartyManager.handlePartyChangeEvent(onlineTarget, partyName, null, EventReason.KICKED_FROM_PARTY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.processPartyLeaving(UserManager.getPlayer(onlineTarget));
|
||||
onlineTarget.sendMessage(LocaleLoader.getString("Commands.Party.Kick", partyName));
|
||||
}
|
||||
|
||||
PartyManager.removeFromParty(target, playerParty);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "kick", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,36 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.events.party.McMMOPartyChangeEvent.EventReason;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyQuitCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
Party playerParty = mcMMOPlayer.getParty();
|
||||
|
||||
if (!PartyManager.handlePartyChangeEvent(player, playerParty.getName(), null, EventReason.LEFT_PARTY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.removeFromParty(mcMMOPlayer);
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Party.Leave"));
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.1", "party", "quit"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,53 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyFeature;
|
||||
import com.gmail.nossr50.core.datatypes.party.ShareMode;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyXpShareCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
Party party = UserManager.getPlayer((Player) sender).getParty();
|
||||
|
||||
if (party.getLevel() < MainConfig.getInstance().getPartyFeatureUnlockLevel(PartyFeature.XP_SHARE)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.5"));
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
if (args[1].equalsIgnoreCase("none") || CommandUtils.shouldDisableToggle(args[1])) {
|
||||
handleChangingShareMode(party, ShareMode.NONE);
|
||||
} else if (args[1].equalsIgnoreCase("equal") || args[1].equalsIgnoreCase("even") || CommandUtils.shouldEnableToggle(args[1])) {
|
||||
handleChangingShareMode(party, ShareMode.EQUAL);
|
||||
} else {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "<NONE | EQUAL>"));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "xpshare", "<NONE | EQUAL>"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private void handleChangingShareMode(Party party, ShareMode mode) {
|
||||
party.setXpShareMode(mode);
|
||||
|
||||
String changeModeMessage = LocaleLoader.getString("Commands.Party.SetSharing", LocaleLoader.getString("Party.ShareType.Xp"), LocaleLoader.getString("Party.ShareMode." + StringUtils.getCapitalized(mode.toString())));
|
||||
|
||||
for (Player member : party.getOnlineMembers()) {
|
||||
member.sendMessage(changeModeMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.alliance;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyAllianceAcceptCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
if (!mcMMOPlayer.hasPartyAllianceInvite()) {
|
||||
sender.sendMessage(LocaleLoader.getString("mcMMO.NoInvites"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mcMMOPlayer.getParty().getAlly() != null) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies"));
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.acceptAllianceInvite(mcMMOPlayer);
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "accept"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,35 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.alliance;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyAllianceDisbandCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 2:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
Party party = mcMMOPlayer.getParty();
|
||||
|
||||
if (party.getAlly() == null) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.None"));
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyManager.disbandAlliance(player, party, party.getAlly());
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.2", "party", "alliance", "disband"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,70 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.alliance;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PartyAllianceInviteCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 3:
|
||||
String targetName = CommandUtils.getMatchedPlayerName(args[2]);
|
||||
McMMOPlayer mcMMOTarget = UserManager.getOfflinePlayer(targetName);
|
||||
|
||||
if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player target = mcMMOTarget.getPlayer();
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
String playerName = player.getName();
|
||||
|
||||
if (player.equals(target)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Invite.Self"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!mcMMOTarget.inParty()) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.PlayerNotInParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (PartyManager.inSameParty(player, target)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Player.InSameParty", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!mcMMOTarget.getParty().getLeader().getUniqueId().equals(target.getUniqueId())) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Target.NotOwner", targetName));
|
||||
return true;
|
||||
}
|
||||
|
||||
Party playerParty = mcMMOPlayer.getParty();
|
||||
|
||||
if (playerParty.getAlly() != null) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.AlreadyAllies"));
|
||||
return true;
|
||||
}
|
||||
|
||||
mcMMOTarget.setPartyAllianceInvite(playerParty);
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Invite.Success"));
|
||||
target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.0", playerParty.getName(), playerName));
|
||||
target.sendMessage(LocaleLoader.getString("Commands.Party.Alliance.Invite.1"));
|
||||
return true;
|
||||
|
||||
default:
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Usage.3", "party", "alliance", "invite", "<" + LocaleLoader.getString("Commands.Usage.Player") + ">"));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.teleport;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyTeleportRecord;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class PtpAcceptAnyCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!Permissions.partyTeleportAcceptAll(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyTeleportRecord ptpRecord = UserManager.getPlayer(sender.getName()).getPartyTeleportRecord();
|
||||
|
||||
if (ptpRecord.isConfirmRequired()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Disabled"));
|
||||
} else {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.ptp.AcceptAny.Enabled"));
|
||||
}
|
||||
|
||||
ptpRecord.toggleConfirmRequired();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,62 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.teleport;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyTeleportRecord;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.skills.SkillUtils;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class PtpAcceptCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!Permissions.partyTeleportAccept(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
PartyTeleportRecord ptpRecord = UserManager.getPlayer(player).getPartyTeleportRecord();
|
||||
|
||||
if (!ptpRecord.hasRequest()) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.ptp.NoRequests"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (SkillUtils.cooldownExpired(ptpRecord.getTimeout(), MainConfig.getInstance().getPTPCommandTimeout())) {
|
||||
ptpRecord.removeRequest();
|
||||
player.sendMessage(LocaleLoader.getString("Commands.ptp.RequestExpired"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player target = ptpRecord.getRequestor();
|
||||
ptpRecord.removeRequest();
|
||||
|
||||
if (!PtpCommand.canTeleport(sender, player, target.getName())) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getPTPCommandWorldPermissions()) {
|
||||
World targetWorld = target.getWorld();
|
||||
World playerWorld = player.getWorld();
|
||||
|
||||
if (!Permissions.partyTeleportAllWorlds(target)) {
|
||||
if (!Permissions.partyTeleportWorld(target, targetWorld)) {
|
||||
target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", targetWorld.getName()));
|
||||
return true;
|
||||
} else if (targetWorld != playerWorld && !Permissions.partyTeleportWorld(target, playerWorld)) {
|
||||
target.sendMessage(LocaleLoader.getString("Commands.ptp.NoWorldPermissions", playerWorld.getName()));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PtpCommand.handleTeleportWarmup(target, player);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,221 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.teleport;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.config.WorldBlacklist;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyFeature;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyTeleportRecord;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.runnables.items.TeleportationWarmup;
|
||||
import com.gmail.nossr50.core.util.EventUtils;
|
||||
import com.gmail.nossr50.core.util.Misc;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillUtils;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PtpCommand implements TabExecutor {
|
||||
public static final List<String> TELEPORT_SUBCOMMANDS = ImmutableList.of("toggle", "accept", "acceptany", "acceptall");
|
||||
|
||||
private CommandExecutor ptpToggleCommand = new PtpToggleCommand();
|
||||
private CommandExecutor ptpAcceptAnyCommand = new PtpAcceptAnyCommand();
|
||||
private CommandExecutor ptpAcceptCommand = new PtpAcceptCommand();
|
||||
|
||||
protected static boolean canTeleport(CommandSender sender, Player player, String targetName) {
|
||||
McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
|
||||
|
||||
if (!CommandUtils.checkPlayerExistence(sender, targetName, mcMMOTarget)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
Player target = mcMMOTarget.getPlayer();
|
||||
|
||||
if (player.equals(target)) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Teleport.Self"));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!PartyManager.inSameParty(player, target)) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.NotInYourParty", targetName));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!mcMMOTarget.getPartyTeleportRecord().isEnabled()) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Teleport.Disabled", targetName));
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!target.isValid()) {
|
||||
player.sendMessage(LocaleLoader.getString("Party.Teleport.Dead"));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected static void handleTeleportWarmup(Player teleportingPlayer, Player targetPlayer) {
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(teleportingPlayer);
|
||||
McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetPlayer);
|
||||
|
||||
long warmup = MainConfig.getInstance().getPTPCommandWarmup();
|
||||
|
||||
mcMMOPlayer.actualizeTeleportCommenceLocation(teleportingPlayer);
|
||||
|
||||
if (warmup > 0) {
|
||||
teleportingPlayer.sendMessage(LocaleLoader.getString("Teleport.Commencing", warmup));
|
||||
new TeleportationWarmup(mcMMOPlayer, mcMMOTarget).runTaskLater(mcMMO.p, 20 * warmup);
|
||||
} else {
|
||||
EventUtils.handlePartyTeleportEvent(teleportingPlayer, targetPlayer);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return true;
|
||||
}
|
||||
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(player.getWorld()))
|
||||
return true;
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
if (!mcMMOPlayer.inParty()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Party.None"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Party party = mcMMOPlayer.getParty();
|
||||
|
||||
if (party.getLevel() < MainConfig.getInstance().getPartyFeatureUnlockLevel(PartyFeature.TELEPORT)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Party.Feature.Disabled.2"));
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
if (args[0].equalsIgnoreCase("toggle")) {
|
||||
return ptpToggleCommand.onCommand(sender, command, label, args);
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("acceptany") || args[0].equalsIgnoreCase("acceptall")) {
|
||||
return ptpAcceptAnyCommand.onCommand(sender, command, label, args);
|
||||
}
|
||||
|
||||
long recentlyHurt = mcMMOPlayer.getRecentlyHurt();
|
||||
int hurtCooldown = MainConfig.getInstance().getPTPCommandRecentlyHurtCooldown();
|
||||
|
||||
if (hurtCooldown > 0) {
|
||||
int timeRemaining = SkillUtils.calculateTimeLeft(recentlyHurt * Misc.TIME_CONVERSION_FACTOR, hurtCooldown, player);
|
||||
|
||||
if (timeRemaining > 0) {
|
||||
player.sendMessage(LocaleLoader.getString("Item.Injured.Wait", timeRemaining));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (args[0].equalsIgnoreCase("accept")) {
|
||||
return ptpAcceptCommand.onCommand(sender, command, label, args);
|
||||
}
|
||||
|
||||
if (!Permissions.partyTeleportSend(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
int ptpCooldown = MainConfig.getInstance().getPTPCommandCooldown();
|
||||
long ptpLastUse = mcMMOPlayer.getPartyTeleportRecord().getLastUse();
|
||||
|
||||
if (ptpCooldown > 0) {
|
||||
int timeRemaining = SkillUtils.calculateTimeLeft(ptpLastUse * Misc.TIME_CONVERSION_FACTOR, ptpCooldown, player);
|
||||
|
||||
if (timeRemaining > 0) {
|
||||
player.sendMessage(LocaleLoader.getString("Item.Generic.Wait", timeRemaining));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
sendTeleportRequest(sender, player, CommandUtils.getMatchedPlayerName(args[0]));
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
List<String> matches = StringUtil.copyPartialMatches(args[0], TELEPORT_SUBCOMMANDS, new ArrayList<String>(TELEPORT_SUBCOMMANDS.size()));
|
||||
|
||||
if (matches.size() == 0) {
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
if (!mcMMOPlayer.inParty()) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
|
||||
List<String> playerNames = mcMMOPlayer.getParty().getOnlinePlayerNames(player);
|
||||
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
|
||||
}
|
||||
|
||||
return matches;
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
|
||||
private void sendTeleportRequest(CommandSender sender, Player player, String targetName) {
|
||||
if (!canTeleport(sender, player, targetName)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOTarget = UserManager.getPlayer(targetName);
|
||||
Player target = mcMMOTarget.getPlayer();
|
||||
|
||||
PartyTeleportRecord ptpRecord = mcMMOTarget.getPartyTeleportRecord();
|
||||
|
||||
if (!ptpRecord.isConfirmRequired()) {
|
||||
handleTeleportWarmup(player, target);
|
||||
return;
|
||||
}
|
||||
|
||||
ptpRecord.setRequestor(player);
|
||||
ptpRecord.actualizeTimeout();
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Invite.Success"));
|
||||
|
||||
target.sendMessage(LocaleLoader.getString("Commands.ptp.Request1", player.getName()));
|
||||
target.sendMessage(LocaleLoader.getString("Commands.ptp.Request2", MainConfig.getInstance().getPTPCommandTimeout()));
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
package com.gmail.nossr50.commands.party.teleport;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.party.PartyTeleportRecord;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
public class PtpToggleCommand implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!Permissions.partyTeleportToggle(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
PartyTeleportRecord ptpRecord = UserManager.getPlayer(sender.getName()).getPartyTeleportRecord();
|
||||
|
||||
if (ptpRecord.isEnabled()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.ptp.Disabled"));
|
||||
} else {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.ptp.Enabled"));
|
||||
}
|
||||
|
||||
ptpRecord.toggleEnabled();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
package com.gmail.nossr50.commands.player;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.datatypes.player.PlayerProfile;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class InspectCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
String playerName = CommandUtils.getMatchedPlayerName(args[0]);
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName);
|
||||
|
||||
// If the mcMMOPlayer doesn't exist, create a temporary profile and check if it's present in the database. If it's not, abort the process.
|
||||
if (mcMMOPlayer == null) {
|
||||
PlayerProfile profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false); // Temporary Profile
|
||||
|
||||
if (!CommandUtils.isLoaded(sender, profile)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (CommandUtils.inspectOffline(sender, profile, Permissions.inspectOffline(sender))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled() && sender instanceof Player && MainConfig.getInstance().getInspectUseBoard()) {
|
||||
ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, profile);
|
||||
|
||||
if (!MainConfig.getInstance().getInspectUseChat()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Inspect.OfflineStats", playerName));
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Stats.Header.Gathering"));
|
||||
for (PrimarySkillType skill : PrimarySkillType.GATHERING_SKILLS) {
|
||||
sender.sendMessage(CommandUtils.displaySkill(profile, skill));
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Stats.Header.Combat"));
|
||||
for (PrimarySkillType skill : PrimarySkillType.COMBAT_SKILLS) {
|
||||
sender.sendMessage(CommandUtils.displaySkill(profile, skill));
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Stats.Header.Misc"));
|
||||
for (PrimarySkillType skill : PrimarySkillType.MISC_SKILLS) {
|
||||
sender.sendMessage(CommandUtils.displaySkill(profile, skill));
|
||||
}
|
||||
|
||||
} else {
|
||||
Player target = mcMMOPlayer.getPlayer();
|
||||
|
||||
if (CommandUtils.hidden(sender, target, Permissions.inspectHidden(sender))) {
|
||||
if (!Permissions.inspectOffline(sender)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Inspect.Offline"));
|
||||
return true;
|
||||
}
|
||||
} else if (CommandUtils.tooFar(sender, target, Permissions.inspectFar(sender))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled() && sender instanceof Player && MainConfig.getInstance().getInspectUseBoard()) {
|
||||
ScoreboardManager.enablePlayerInspectScoreboard((Player) sender, mcMMOPlayer.getProfile());
|
||||
|
||||
if (!MainConfig.getInstance().getInspectUseChat()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
sender.sendMessage(LocaleLoader.getString("Inspect.Stats", target.getName()));
|
||||
CommandUtils.printGatheringSkills(target, sender);
|
||||
CommandUtils.printCombatSkills(target, sender);
|
||||
CommandUtils.printMiscSkills(target, sender);
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.PowerLevel", mcMMOPlayer.getPowerLevel()));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
|
||||
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,71 +0,0 @@
|
||||
package com.gmail.nossr50.commands.player;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.SuperAbilityType;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class MccooldownCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CommandUtils.hasPlayerDataKey(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
Player player = (Player) sender;
|
||||
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled() && MainConfig.getInstance().getCooldownUseBoard()) {
|
||||
ScoreboardManager.enablePlayerCooldownScoreboard(player);
|
||||
|
||||
if (!MainConfig.getInstance().getCooldownUseChat()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Header"));
|
||||
player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
|
||||
|
||||
for (SuperAbilityType ability : SuperAbilityType.values()) {
|
||||
if (!ability.getPermissions(player)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
int seconds = mcMMOPlayer.calculateTimeRemaining(ability);
|
||||
|
||||
if (seconds <= 0) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.Y", ability.getName()));
|
||||
} else {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Cooldowns.Row.N", ability.getName(), seconds));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
@@ -1,112 +0,0 @@
|
||||
package com.gmail.nossr50.commands.player;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.runnables.commands.McrankCommandAsyncTask;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.util.StringUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class McrankCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!Permissions.mcrank(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CommandUtils.hasPlayerDataKey(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
display(sender, sender.getName());
|
||||
|
||||
return true;
|
||||
|
||||
case 1:
|
||||
if (!Permissions.mcrankOthers(sender)) {
|
||||
sender.sendMessage(command.getPermissionMessage());
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CommandUtils.hasPlayerDataKey(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
String playerName = CommandUtils.getMatchedPlayerName(args[0]);
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(playerName);
|
||||
|
||||
if (mcMMOPlayer != null) {
|
||||
Player player = mcMMOPlayer.getPlayer();
|
||||
playerName = player.getName();
|
||||
|
||||
if (CommandUtils.tooFar(sender, player, Permissions.mcrankFar(sender))) {
|
||||
return true;
|
||||
}
|
||||
} else if (CommandUtils.inspectOffline(sender, mcMMO.getDatabaseManager().loadPlayerProfile(playerName, false), Permissions.mcrankOffline(sender))) {
|
||||
return true;
|
||||
}
|
||||
|
||||
display(sender, playerName);
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
List<String> playerNames = CommandUtils.getOnlinePlayerNames(sender);
|
||||
return StringUtil.copyPartialMatches(args[0], playerNames, new ArrayList<String>(playerNames.size()));
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
|
||||
private void display(CommandSender sender, String playerName) {
|
||||
if (sender instanceof Player) {
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(sender.getName());
|
||||
long cooldownMillis = Math.max(MainConfig.getInstance().getDatabasePlayerCooldown(), 1750);
|
||||
|
||||
if (mcMMOPlayer.getDatabaseATS() + cooldownMillis > System.currentTimeMillis()) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Database.Cooldown"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (((Player) sender).hasMetadata(mcMMO.databaseCommandKey)) {
|
||||
sender.sendMessage(LocaleLoader.getString("Commands.Database.Processing"));
|
||||
return;
|
||||
} else {
|
||||
((Player) sender).setMetadata(mcMMO.databaseCommandKey, new FixedMetadataValue(mcMMO.p, null));
|
||||
}
|
||||
|
||||
mcMMOPlayer.actualizeDatabaseATS();
|
||||
}
|
||||
|
||||
boolean useBoard = MainConfig.getInstance().getScoreboardsEnabled() && (sender instanceof Player) && (MainConfig.getInstance().getRankUseBoard());
|
||||
boolean useChat = !useBoard || MainConfig.getInstance().getRankUseChat();
|
||||
|
||||
new McrankCommandAsyncTask(playerName, sender, useBoard, useChat).runTaskAsynchronously(mcMMO.p);
|
||||
}
|
||||
}
|
||||
@@ -1,65 +0,0 @@
|
||||
package com.gmail.nossr50.commands.player;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class McstatsCommand implements TabExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CommandUtils.hasPlayerDataKey(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
Player player = (Player) sender;
|
||||
|
||||
if (MainConfig.getInstance().getStatsUseBoard() && MainConfig.getInstance().getScoreboardsEnabled()) {
|
||||
ScoreboardManager.enablePlayerStatsScoreboard(player);
|
||||
|
||||
if (!MainConfig.getInstance().getStatsUseChat()) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Stats.Own.Stats"));
|
||||
player.sendMessage(LocaleLoader.getString("mcMMO.NoSkillNote"));
|
||||
|
||||
CommandUtils.printGatheringSkills(player);
|
||||
CommandUtils.printCombatSkills(player);
|
||||
CommandUtils.printMiscSkills(player);
|
||||
|
||||
int powerLevelCap = MainConfig.getInstance().getPowerLevelCap();
|
||||
|
||||
if (powerLevelCap != Integer.MAX_VALUE) {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.PowerLevel.Capped", UserManager.getPlayer(player).getPowerLevel(), powerLevelCap));
|
||||
} else {
|
||||
player.sendMessage(LocaleLoader.getString("Commands.PowerLevel", UserManager.getPlayer(player).getPowerLevel()));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
package com.gmail.nossr50.commands.server;
|
||||
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
|
||||
/**
|
||||
* This command facilitates switching the skill system scale between classic and modern scale
|
||||
*/
|
||||
public class Mcmmoupgrade implements CommandExecutor {
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -1,96 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.alchemy.AlchemyManager;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AlchemyCommand extends SkillCommand {
|
||||
private String brewSpeed;
|
||||
private String brewSpeedLucky;
|
||||
|
||||
private int tier;
|
||||
private int ingredientCount;
|
||||
private String ingredientList;
|
||||
|
||||
private boolean canCatalysis;
|
||||
private boolean canConcoctions;
|
||||
|
||||
public AlchemyCommand() {
|
||||
super(PrimarySkillType.ALCHEMY);
|
||||
}
|
||||
|
||||
protected String[] calculateAbilityDisplayValues(Player player) {
|
||||
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
|
||||
String[] displayValues = new String[2];
|
||||
|
||||
boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY);
|
||||
|
||||
displayValues[0] = decimal.format(alchemyManager.calculateBrewSpeed(false)) + "x";
|
||||
displayValues[1] = isLucky ? decimal.format(alchemyManager.calculateBrewSpeed(true)) + "x" : null;
|
||||
|
||||
return displayValues;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// ALCHEMY_CATALYSIS
|
||||
if (canCatalysis) {
|
||||
String[] catalysisStrings = calculateAbilityDisplayValues(player);
|
||||
brewSpeed = catalysisStrings[0];
|
||||
brewSpeedLucky = catalysisStrings[1];
|
||||
}
|
||||
|
||||
// ALCHEMY_CONCOCTIONS
|
||||
if (canConcoctions) {
|
||||
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
|
||||
tier = alchemyManager.getTier();
|
||||
ingredientCount = alchemyManager.getIngredients().size();
|
||||
ingredientList = alchemyManager.getIngredientList();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canCatalysis = canUseSubskill(player, SubSkillType.ALCHEMY_CATALYSIS);
|
||||
canConcoctions = canUseSubskill(player, SubSkillType.ALCHEMY_CONCOCTIONS);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canCatalysis) {
|
||||
messages.add(getStatMessage(SubSkillType.ALCHEMY_CATALYSIS, brewSpeed)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", brewSpeedLucky) : ""));
|
||||
}
|
||||
|
||||
if (canConcoctions) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(tier), String.valueOf(RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS))));
|
||||
messages.add(getStatMessage(true, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(ingredientCount), ingredientList));
|
||||
|
||||
//messages.add(LocaleLoader.getString("Alchemy.Concoctions.Rank", tier, RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS)));
|
||||
//messages.add(LocaleLoader.getString("Alchemy.Concoctions.Ingredients", ingredientCount, ingredientList));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,202 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.util.HolidayManager.FakeSkillType;
|
||||
import com.gmail.nossr50.core.util.Misc;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AprilCommand implements TabExecutor {
|
||||
protected DecimalFormat percent = new DecimalFormat("##0.00%");
|
||||
protected DecimalFormat decimal = new DecimalFormat("##0.00");
|
||||
private String skillName;
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
skillName = StringUtils.getCapitalized(label);
|
||||
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
Player player = (Player) sender;
|
||||
FakeSkillType fakeSkillType = FakeSkillType.getByName(skillName);
|
||||
|
||||
float skillValue = Misc.getRandom().nextInt(99);
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
|
||||
player.sendMessage(LocaleLoader.getString("Commands.XPGain", getXPGainString(fakeSkillType)));
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Level", (int) skillValue, Misc.getRandom().nextInt(1000), 1000 + Misc.getRandom().nextInt(1000)));
|
||||
|
||||
|
||||
List<String> effectMessages = effectsDisplay(fakeSkillType);
|
||||
|
||||
if (!effectMessages.isEmpty()) {
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Effects.Effects")));
|
||||
|
||||
for (String message : effectMessages) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
List<String> statsMessages = statsDisplay(fakeSkillType);
|
||||
|
||||
if (!statsMessages.isEmpty()) {
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Commands.Stats.Self")));
|
||||
|
||||
for (String message : statsMessages) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.formatString("[[DARK_AQUA]]Guide for {0} available - type /APRIL FOOLS ! :D", skillName));
|
||||
return true;
|
||||
|
||||
default:
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private String getXPGainString(FakeSkillType fakeSkillType) {
|
||||
switch (fakeSkillType) {
|
||||
case MACHO:
|
||||
return "Get beaten up";
|
||||
case JUMPING:
|
||||
return "Kris Kross will make ya Jump Jump";
|
||||
case THROWING:
|
||||
return "Chuck your items on the floor";
|
||||
case WRECKING:
|
||||
return "I'M GONNA WRECK IT!";
|
||||
case CRAFTING:
|
||||
return "Craft apple pies";
|
||||
case WALKING:
|
||||
return "Walk around the park";
|
||||
case SWIMMING:
|
||||
return "Like a fish on a bicycle";
|
||||
case FALLING:
|
||||
return "Faceplant the floor, headbutt the ground";
|
||||
case CLIMBING:
|
||||
return "Climb the highest mountain";
|
||||
case FLYING:
|
||||
return "I believe I can fly";
|
||||
case DIVING:
|
||||
return "Scuba club 4000";
|
||||
case PIGGY:
|
||||
return "OINK! OINK!";
|
||||
default:
|
||||
return "Sit and wait?";
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
return ImmutableList.of("?");
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
|
||||
private List<String> effectsDisplay(FakeSkillType fakeSkillType) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
switch (fakeSkillType) {
|
||||
case MACHO:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Punching bag", "Absorb damage, like a bag of sand"));
|
||||
break;
|
||||
case JUMPING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Jump", "PRESS SPACE TO JUMP"));
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Jump Twice", "PRESS SPACE TWICE TO JUMP TWICE"));
|
||||
break;
|
||||
case THROWING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Drop Item", "Randomly drop items, at random"));
|
||||
break;
|
||||
case WRECKING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Ralphinator", "Smash windows with your fists"));
|
||||
break;
|
||||
case CRAFTING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Crafting", "Chance of successful craft"));
|
||||
break;
|
||||
case WALKING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Walk", "Traveling gracefully by foot"));
|
||||
break;
|
||||
case SWIMMING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Swim", "Just keep swimming, swimming, swimming"));
|
||||
break;
|
||||
case FALLING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Skydiving", "Go jump of a cliff. No, seriously."));
|
||||
break;
|
||||
case CLIMBING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Rock Climber", "Use string to climb mountains faster"));
|
||||
break;
|
||||
case FLYING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Fly", "Throw yourself at the ground and miss"));
|
||||
break;
|
||||
case DIVING:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Hold Breath", "Press shift to hold your breath longer"));
|
||||
break;
|
||||
case PIGGY:
|
||||
messages.add(LocaleLoader.getString("Effects.Template", "Carrot Turbo", "Supercharge your pigs with carrots"));
|
||||
break;
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
private List<String> statsDisplay(FakeSkillType fakeSkillType) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
switch (fakeSkillType) {
|
||||
case MACHO:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Damage Taken: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(77))));
|
||||
break;
|
||||
case JUMPING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Double Jump Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case THROWING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Drop Item Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(87))));
|
||||
break;
|
||||
case WRECKING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Wrecking Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(14))));
|
||||
break;
|
||||
case CRAFTING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Crafting Success: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case WALKING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Walk Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case SWIMMING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Swim Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case FALLING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Skydiving Success: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(37))));
|
||||
break;
|
||||
case CLIMBING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Rock Climber Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case FLYING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Fly Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case DIVING:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Hold Breath Chance: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(27))));
|
||||
break;
|
||||
case PIGGY:
|
||||
messages.add(LocaleLoader.formatString("[[RED]]Carrot Turbo Boost: [[YELLOW]]{0}%", decimal.format(Misc.getRandom().nextInt(80)) + 10));
|
||||
break;
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.archery.Archery;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ArcheryCommand extends SkillCommand {
|
||||
private String skillShotBonus;
|
||||
private String dazeChance;
|
||||
private String dazeChanceLucky;
|
||||
private String retrieveChance;
|
||||
private String retrieveChanceLucky;
|
||||
|
||||
private boolean canSkillShot;
|
||||
private boolean canDaze;
|
||||
private boolean canRetrieve;
|
||||
|
||||
public ArcheryCommand() {
|
||||
super(PrimarySkillType.ARCHERY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// ARCHERY_ARROW_RETRIEVAL
|
||||
if (canRetrieve) {
|
||||
String[] retrieveStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
|
||||
retrieveChance = retrieveStrings[0];
|
||||
retrieveChanceLucky = retrieveStrings[1];
|
||||
}
|
||||
|
||||
// ARCHERY_DAZE
|
||||
if (canDaze) {
|
||||
String[] dazeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_DAZE);
|
||||
dazeChance = dazeStrings[0];
|
||||
dazeChanceLucky = dazeStrings[1];
|
||||
}
|
||||
|
||||
// SKILL SHOT
|
||||
if (canSkillShot) {
|
||||
skillShotBonus = percent.format(Archery.getDamageBonusPercent(player));
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canSkillShot = canUseSubskill(player, SubSkillType.ARCHERY_SKILL_SHOT);
|
||||
canDaze = canUseSubskill(player, SubSkillType.ARCHERY_DAZE);
|
||||
canRetrieve = canUseSubskill(player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canRetrieve) {
|
||||
messages.add(getStatMessage(SubSkillType.ARCHERY_ARROW_RETRIEVAL, retrieveChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", retrieveChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canDaze) {
|
||||
messages.add(getStatMessage(SubSkillType.ARCHERY_DAZE, dazeChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", dazeChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canSkillShot) {
|
||||
messages.add(getStatMessage(SubSkillType.ARCHERY_SKILL_SHOT, skillShotBonus));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ARCHERY);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,109 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.axes.Axes;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class AxesCommand extends SkillCommand {
|
||||
private String critChance;
|
||||
private String critChanceLucky;
|
||||
private double axeMasteryDamage;
|
||||
private double impactDamage;
|
||||
private String skullSplitterLength;
|
||||
private String skullSplitterLengthEndurance;
|
||||
|
||||
private boolean canSkullSplitter;
|
||||
private boolean canCritical;
|
||||
private boolean canAxeMastery;
|
||||
private boolean canImpact;
|
||||
private boolean canGreaterImpact;
|
||||
|
||||
public AxesCommand() {
|
||||
super(PrimarySkillType.AXES);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// ARMOR IMPACT
|
||||
if (canImpact) {
|
||||
impactDamage = UserManager.getPlayer(player).getAxesManager().getImpactDurabilityDamage();
|
||||
}
|
||||
|
||||
// AXE MASTERY
|
||||
if (canAxeMastery) {
|
||||
axeMasteryDamage = Axes.getAxeMasteryBonusDamage(player);
|
||||
}
|
||||
|
||||
// CRITICAL HIT
|
||||
if (canCritical) {
|
||||
String[] criticalHitStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.AXES_CRITICAL_STRIKES);
|
||||
critChance = criticalHitStrings[0];
|
||||
critChanceLucky = criticalHitStrings[1];
|
||||
}
|
||||
|
||||
// SKULL SPLITTER
|
||||
if (canSkullSplitter) {
|
||||
String[] skullSplitterStrings = calculateLengthDisplayValues(player, skillValue);
|
||||
skullSplitterLength = skullSplitterStrings[0];
|
||||
skullSplitterLengthEndurance = skullSplitterStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canSkullSplitter = Permissions.skullSplitter(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.AXES_SKULL_SPLITTER);
|
||||
canCritical = canUseSubskill(player, SubSkillType.AXES_CRITICAL_STRIKES);
|
||||
canAxeMastery = canUseSubskill(player, SubSkillType.AXES_AXE_MASTERY);
|
||||
canImpact = canUseSubskill(player, SubSkillType.AXES_ARMOR_IMPACT);
|
||||
canGreaterImpact = canUseSubskill(player, SubSkillType.AXES_GREATER_IMPACT);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canImpact) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.2"), LocaleLoader.getString("Axes.Ability.Bonus.3", impactDamage)));
|
||||
}
|
||||
|
||||
if (canAxeMastery) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.0"), LocaleLoader.getString("Axes.Ability.Bonus.1", axeMasteryDamage)));
|
||||
}
|
||||
|
||||
if (canCritical) {
|
||||
messages.add(getStatMessage(SubSkillType.AXES_CRITICAL_STRIKES, critChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", critChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canGreaterImpact) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.4"), LocaleLoader.getString("Axes.Ability.Bonus.5", Axes.greaterImpactBonusDamage)));
|
||||
}
|
||||
|
||||
if (canSkullSplitter) {
|
||||
messages.add(getStatMessage(SubSkillType.AXES_SKULL_SPLITTER, skullSplitterLength)
|
||||
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", skullSplitterLengthEndurance) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.AXES);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,64 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ExcavationCommand extends SkillCommand {
|
||||
private String gigaDrillBreakerLength;
|
||||
private String gigaDrillBreakerLengthEndurance;
|
||||
|
||||
private boolean canGigaDrill;
|
||||
private boolean canTreasureHunt;
|
||||
|
||||
public ExcavationCommand() {
|
||||
super(PrimarySkillType.EXCAVATION);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// GIGA DRILL BREAKER
|
||||
if (canGigaDrill) {
|
||||
String gigaDrillStrings[] = calculateLengthDisplayValues(player, skillValue);
|
||||
gigaDrillBreakerLength = gigaDrillStrings[0];
|
||||
gigaDrillBreakerLengthEndurance = gigaDrillStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canGigaDrill = Permissions.gigaDrillBreaker(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER);
|
||||
canTreasureHunt = canUseSubskill(player, SubSkillType.EXCAVATION_ARCHAEOLOGY);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canGigaDrill) {
|
||||
messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength)
|
||||
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
|
||||
|
||||
//messages.add(LocaleLoader.getString("Excavation.Effect.Length", gigaDrillBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.EXCAVATION);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,177 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.core.config.treasure.TreasureConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.fishing.Fishing;
|
||||
import com.gmail.nossr50.core.skills.primary.fishing.FishingManager;
|
||||
import com.gmail.nossr50.core.skills.treasure.Rarity;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.random.RandomChanceUtil;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FishingCommand extends SkillCommand {
|
||||
private int lootTier;
|
||||
private String shakeChance;
|
||||
private String shakeChanceLucky;
|
||||
private int fishermansDietRank;
|
||||
private String biteChance;
|
||||
|
||||
private String trapTreasure;
|
||||
private String commonTreasure;
|
||||
private String uncommonTreasure;
|
||||
private String rareTreasure;
|
||||
private String epicTreasure;
|
||||
private String legendaryTreasure;
|
||||
private String recordTreasure;
|
||||
|
||||
private String magicChance;
|
||||
|
||||
private boolean canTreasureHunt;
|
||||
private boolean canMagicHunt;
|
||||
private boolean canShake;
|
||||
private boolean canFishermansDiet;
|
||||
private boolean canMasterAngler;
|
||||
private boolean canIceFish;
|
||||
|
||||
public FishingCommand() {
|
||||
super(PrimarySkillType.FISHING);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
|
||||
|
||||
// TREASURE HUNTER
|
||||
if (canTreasureHunt) {
|
||||
lootTier = fishingManager.getLootTier();
|
||||
|
||||
// ItemStack drop rates
|
||||
commonTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.COMMON) / 100.0);
|
||||
uncommonTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.UNCOMMON) / 100.0);
|
||||
rareTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE) / 100.0);
|
||||
epicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC) / 100.0);
|
||||
legendaryTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY) / 100.0);
|
||||
recordTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RECORD) / 100.0);
|
||||
|
||||
// Magic hunter drop rates
|
||||
double totalEnchantChance = 0;
|
||||
|
||||
for (Rarity rarity : Rarity.values()) {
|
||||
if (rarity != Rarity.RECORD) {
|
||||
totalEnchantChance += TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity);
|
||||
}
|
||||
}
|
||||
|
||||
if (totalEnchantChance >= 1)
|
||||
magicChance = percent.format(totalEnchantChance / 100.0);
|
||||
else
|
||||
magicChance = percent.format(0);
|
||||
}
|
||||
|
||||
// FISHING_SHAKE
|
||||
if (canShake) {
|
||||
String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
|
||||
shakeChance = shakeStrings[0];
|
||||
shakeChanceLucky = shakeStrings[1];
|
||||
}
|
||||
|
||||
// FISHERMAN'S DIET
|
||||
if (canFishermansDiet) {
|
||||
fishermansDietRank = calculateRank(skillValue, Fishing.fishermansDietMaxLevel, Fishing.fishermansDietRankLevel1);
|
||||
}
|
||||
|
||||
// MASTER ANGLER
|
||||
if (canMasterAngler) {
|
||||
double rawBiteChance = 1.0 / (player.getWorld().hasStorm() ? 300 : 500);
|
||||
|
||||
Location location = fishingManager.getHookLocation();
|
||||
|
||||
if (location == null) {
|
||||
location = player.getLocation();
|
||||
}
|
||||
|
||||
if (Fishing.masterAnglerBiomes.contains(location.getBlock().getBiome())) {
|
||||
rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier();
|
||||
}
|
||||
|
||||
if (player.isInsideVehicle() && player.getVehicle().getType() == EntityType.BOAT) {
|
||||
rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBoatModifier();
|
||||
}
|
||||
|
||||
double luckyModifier = Permissions.lucky(player, PrimarySkillType.FISHING) ? 1.333D : 1.0D;
|
||||
|
||||
biteChance = percent.format((rawBiteChance * 100.0D) * luckyModifier);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canTreasureHunt = canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
|
||||
canMagicHunt = canUseSubskill(player, SubSkillType.FISHING_MAGIC_HUNTER) && canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
|
||||
canShake = canUseSubskill(player, SubSkillType.FISHING_SHAKE);
|
||||
canFishermansDiet = canUseSubskill(player, SubSkillType.FISHING_FISHERMANS_DIET);
|
||||
canMasterAngler = canUseSubskill(player, SubSkillType.FISHING_MASTER_ANGLER);
|
||||
canIceFish = canUseSubskill(player, SubSkillType.FISHING_ICE_FISHING);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canFishermansDiet) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.FISHING_FISHERMANS_DIET, String.valueOf(fishermansDietRank)));
|
||||
}
|
||||
|
||||
if (canIceFish) {
|
||||
messages.add(getStatMessage(SubSkillType.FISHING_ICE_FISHING, SubSkillType.FISHING_ICE_FISHING.getLocaleStatDescription()));
|
||||
}
|
||||
|
||||
if (canMagicHunt) {
|
||||
messages.add(getStatMessage(SubSkillType.FISHING_MAGIC_HUNTER, magicChance));
|
||||
}
|
||||
|
||||
if (canMasterAngler) {
|
||||
//TODO: Update this with more details
|
||||
messages.add(getStatMessage(false, true, SubSkillType.FISHING_MASTER_ANGLER, biteChance));
|
||||
}
|
||||
|
||||
if (canShake) {
|
||||
messages.add(getStatMessage(SubSkillType.FISHING_SHAKE, shakeChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shakeChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canTreasureHunt) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.FISHING_TREASURE_HUNTER, String.valueOf(lootTier), String.valueOf(RankUtils.getHighestRank(SubSkillType.FISHING_TREASURE_HUNTER))));
|
||||
messages.add(getStatMessage(true, true, SubSkillType.FISHING_TREASURE_HUNTER,
|
||||
String.valueOf(commonTreasure),
|
||||
String.valueOf(uncommonTreasure),
|
||||
String.valueOf(rareTreasure),
|
||||
String.valueOf(epicTreasure),
|
||||
String.valueOf(legendaryTreasure),
|
||||
String.valueOf(recordTreasure)));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.FISHING);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,121 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MiningCommand extends SkillCommand {
|
||||
private String doubleDropChance;
|
||||
private String doubleDropChanceLucky;
|
||||
private String superBreakerLength;
|
||||
private String superBreakerLengthEndurance;
|
||||
|
||||
private int blastMiningRank;
|
||||
private int bonusTNTDrops;
|
||||
private double blastRadiusIncrease;
|
||||
private String oreBonus;
|
||||
private String debrisReduction;
|
||||
private String blastDamageDecrease;
|
||||
|
||||
private boolean canSuperBreaker;
|
||||
private boolean canDoubleDrop;
|
||||
private boolean canBlast;
|
||||
private boolean canBiggerBombs;
|
||||
private boolean canDemoExpert;
|
||||
|
||||
public MiningCommand() {
|
||||
super(PrimarySkillType.MINING);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// BLAST MINING
|
||||
if (canBlast || canDemoExpert || canBiggerBombs) {
|
||||
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
|
||||
|
||||
blastMiningRank = miningManager.getBlastMiningTier();
|
||||
bonusTNTDrops = miningManager.getDropMultiplier();
|
||||
oreBonus = percent.format(miningManager.getOreBonus() / 30.0D); // Base received in TNT is 30%
|
||||
debrisReduction = percent.format(miningManager.getDebrisReduction() / 30.0D); // Base received in TNT is 30%
|
||||
blastDamageDecrease = percent.format(miningManager.getBlastDamageModifier() / 100.0D);
|
||||
blastRadiusIncrease = miningManager.getBlastRadiusModifier();
|
||||
}
|
||||
|
||||
// DOUBLE DROPS
|
||||
if (canDoubleDrop) {
|
||||
String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.MINING_DOUBLE_DROPS);
|
||||
doubleDropChance = doubleDropStrings[0];
|
||||
doubleDropChanceLucky = doubleDropStrings[1];
|
||||
}
|
||||
|
||||
// SUPER BREAKER
|
||||
if (canSuperBreaker) {
|
||||
String[] superBreakerStrings = calculateLengthDisplayValues(player, skillValue);
|
||||
superBreakerLength = superBreakerStrings[0];
|
||||
superBreakerLengthEndurance = superBreakerStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canBiggerBombs = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BIGGER_BOMBS) && Permissions.biggerBombs(player);
|
||||
canBlast = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BLAST_MINING) && Permissions.remoteDetonation(player);
|
||||
canDemoExpert = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_DEMOLITIONS_EXPERTISE) && Permissions.demolitionsExpertise(player);
|
||||
canDoubleDrop = Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS) && !skill.getDoubleDropsDisabled();
|
||||
canSuperBreaker = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_SUPER_BREAKER) && Permissions.superBreaker(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canBiggerBombs) {
|
||||
messages.add(getStatMessage(true, true, SubSkillType.MINING_BLAST_MINING, String.valueOf(blastRadiusIncrease)));
|
||||
//messages.add(LocaleLoader.getString("Mining.Blast.Radius.Increase", blastRadiusIncrease));
|
||||
}
|
||||
|
||||
if (canBlast) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.MINING_BLAST_MINING, String.valueOf(blastMiningRank), String.valueOf(RankUtils.getHighestRank(SubSkillType.MINING_BLAST_MINING)), LocaleLoader.getString("Mining.Blast.Effect", oreBonus, debrisReduction, bonusTNTDrops)));
|
||||
//messages.add(LocaleLoader.getString("Mining.Blast.Rank", blastMiningRank, RankUtils.getHighestRank(SubSkillType.MINING_BLAST_MINING), LocaleLoader.getString("Mining.Blast.Effect", oreBonus, debrisReduction, bonusTNTDrops)));
|
||||
}
|
||||
|
||||
if (canDemoExpert) {
|
||||
messages.add(getStatMessage(SubSkillType.MINING_DEMOLITIONS_EXPERTISE, blastDamageDecrease));
|
||||
//messages.add(LocaleLoader.getString("Mining.Effect.Decrease", blastDamageDecrease));
|
||||
}
|
||||
|
||||
if (canDoubleDrop) {
|
||||
messages.add(getStatMessage(SubSkillType.HERBALISM_DOUBLE_DROPS, doubleDropChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
|
||||
//messages.add(LocaleLoader.getString("Mining.Effect.DropChance", doubleDropChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canSuperBreaker) {
|
||||
messages.add(getStatMessage(SubSkillType.MINING_SUPER_BREAKER, superBreakerLength)
|
||||
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", superBreakerLengthEndurance) : ""));
|
||||
//messages.add(LocaleLoader.getString("Mining.Ability.Length", superBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", superBreakerLengthEndurance) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.MINING);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,131 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.MaterialType;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.ArcaneForging;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.Repair;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.RepairManager;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.repairables.Repairable;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class RepairCommand extends SkillCommand {
|
||||
private String repairMasteryBonus;
|
||||
private String superRepairChance;
|
||||
private String superRepairChanceLucky;
|
||||
|
||||
private boolean canSuperRepair;
|
||||
private boolean canMasterRepair;
|
||||
private boolean canArcaneForge;
|
||||
private boolean canRepairStone;
|
||||
private boolean canRepairIron;
|
||||
private boolean canRepairGold;
|
||||
private boolean canRepairDiamond;
|
||||
private boolean canRepairString;
|
||||
private boolean canRepairLeather;
|
||||
private boolean canRepairWood;
|
||||
private boolean arcaneBypass;
|
||||
|
||||
private int diamondLevel;
|
||||
private int goldLevel;
|
||||
private int ironLevel;
|
||||
private int stoneLevel;
|
||||
|
||||
public RepairCommand() {
|
||||
super(PrimarySkillType.REPAIR);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// We're using pickaxes here, not the best but it works
|
||||
Repairable diamondRepairable = mcMMO.getRepairableManager().getRepairable(Material.DIAMOND_PICKAXE);
|
||||
Repairable goldRepairable = mcMMO.getRepairableManager().getRepairable(Material.GOLDEN_PICKAXE);
|
||||
Repairable ironRepairable = mcMMO.getRepairableManager().getRepairable(Material.IRON_PICKAXE);
|
||||
Repairable stoneRepairable = mcMMO.getRepairableManager().getRepairable(Material.STONE_PICKAXE);
|
||||
|
||||
// TODO: This isn't really accurate - if they don't have pickaxes loaded it doesn't always mean the repair level is 0
|
||||
diamondLevel = (diamondRepairable == null) ? 0 : diamondRepairable.getMinimumLevel();
|
||||
goldLevel = (goldRepairable == null) ? 0 : goldRepairable.getMinimumLevel();
|
||||
ironLevel = (ironRepairable == null) ? 0 : ironRepairable.getMinimumLevel();
|
||||
stoneLevel = (stoneRepairable == null) ? 0 : stoneRepairable.getMinimumLevel();
|
||||
|
||||
// REPAIR MASTERY
|
||||
if (canMasterRepair) {
|
||||
repairMasteryBonus = percent.format(Math.min(((Repair.repairMasteryMaxBonus / Repair.repairMasteryMaxBonusLevel) * skillValue), Repair.repairMasteryMaxBonus) / 100D);
|
||||
}
|
||||
|
||||
// SUPER REPAIR
|
||||
if (canSuperRepair) {
|
||||
String[] superRepairStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.REPAIR_SUPER_REPAIR);
|
||||
superRepairChance = superRepairStrings[0];
|
||||
superRepairChanceLucky = superRepairStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canSuperRepair = canUseSubskill(player, SubSkillType.REPAIR_SUPER_REPAIR);
|
||||
canMasterRepair = canUseSubskill(player, SubSkillType.REPAIR_REPAIR_MASTERY);
|
||||
canArcaneForge = canUseSubskill(player, SubSkillType.REPAIR_ARCANE_FORGING);
|
||||
canRepairDiamond = Permissions.repairMaterialType(player, MaterialType.DIAMOND);
|
||||
canRepairGold = Permissions.repairMaterialType(player, MaterialType.GOLD);
|
||||
canRepairIron = Permissions.repairMaterialType(player, MaterialType.IRON);
|
||||
canRepairStone = Permissions.repairMaterialType(player, MaterialType.STONE);
|
||||
canRepairString = Permissions.repairMaterialType(player, MaterialType.STRING);
|
||||
canRepairLeather = Permissions.repairMaterialType(player, MaterialType.LEATHER);
|
||||
canRepairWood = Permissions.repairMaterialType(player, MaterialType.WOOD);
|
||||
arcaneBypass = Permissions.arcaneBypass(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canArcaneForge) {
|
||||
RepairManager repairManager = UserManager.getPlayer(player).getRepairManager();
|
||||
|
||||
messages.add(getStatMessage(false, true,
|
||||
SubSkillType.REPAIR_ARCANE_FORGING,
|
||||
String.valueOf(RankUtils.getRank(player, SubSkillType.REPAIR_ARCANE_FORGING)),
|
||||
RankUtils.getHighestRankStr(SubSkillType.REPAIR_ARCANE_FORGING)));
|
||||
|
||||
if (ArcaneForging.arcaneForgingEnchantLoss || ArcaneForging.arcaneForgingDowngrades) {
|
||||
messages.add(getStatMessage(true, true, SubSkillType.REPAIR_ARCANE_FORGING,
|
||||
String.valueOf(arcaneBypass ? 100 : repairManager.getKeepEnchantChance()),
|
||||
String.valueOf(arcaneBypass ? 0 : repairManager.getDowngradeEnchantChance()))); //Jesus those parentheses
|
||||
}
|
||||
}
|
||||
|
||||
if (canMasterRepair) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.REPAIR_REPAIR_MASTERY, repairMasteryBonus));
|
||||
}
|
||||
|
||||
if (canSuperRepair) {
|
||||
messages.add(getStatMessage(SubSkillType.REPAIR_SUPER_REPAIR, superRepairChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", superRepairChanceLucky) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.REPAIR);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.Salvage;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.SalvageManager;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SalvageCommand extends SkillCommand {
|
||||
private boolean canAdvancedSalvage;
|
||||
private boolean canArcaneSalvage;
|
||||
|
||||
public SalvageCommand() {
|
||||
super(PrimarySkillType.SALVAGE);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// TODO Auto-generated method stub
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canAdvancedSalvage = canUseSubskill(player, SubSkillType.SALVAGE_ADVANCED_SALVAGE);
|
||||
canArcaneSalvage = canUseSubskill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager();
|
||||
|
||||
if (canAdvancedSalvage) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Ability.Bonus.0"),
|
||||
LocaleLoader.getString("Salvage.Ability.Bonus.1", salvageManager.getSalvageableAmount())));
|
||||
}
|
||||
|
||||
if (canArcaneSalvage) {
|
||||
messages.add(getStatMessage(false, true, SubSkillType.SALVAGE_ARCANE_SALVAGE,
|
||||
String.valueOf(salvageManager.getArcaneSalvageRank()),
|
||||
String.valueOf(RankUtils.getHighestRank(SubSkillType.SALVAGE_ARCANE_SALVAGE))));
|
||||
|
||||
if (Salvage.arcaneSalvageEnchantLoss) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Arcane.ExtractFull"), percent.format(salvageManager.getExtractFullEnchantChance() / 100)));
|
||||
}
|
||||
|
||||
if (Salvage.arcaneSalvageDowngrades) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Arcane.ExtractPartial"), percent.format(salvageManager.getExtractPartialEnchantChance() / 100)));
|
||||
}
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SALVAGE);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,290 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.child.FamilyTree;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.StringUtils;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.commands.CommandUtils;
|
||||
import com.gmail.nossr50.core.util.random.RandomChanceUtil;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.gmail.nossr50.core.util.skills.PerksUtils;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.command.TabExecutor;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class SkillCommand implements TabExecutor {
|
||||
protected PrimarySkillType skill;
|
||||
protected DecimalFormat percent = new DecimalFormat("##0.00%");
|
||||
protected DecimalFormat decimal = new DecimalFormat("##0.00");
|
||||
private String skillName;
|
||||
private CommandExecutor skillGuideCommand;
|
||||
|
||||
public SkillCommand(PrimarySkillType skill) {
|
||||
this.skill = skill;
|
||||
skillName = skill.getName();
|
||||
skillGuideCommand = new SkillGuideCommand(skill);
|
||||
}
|
||||
|
||||
public static String[] addItemToFirstPositionOfArray(String itemToAdd, String... existingArray) {
|
||||
String[] newArray = new String[existingArray.length + 1];
|
||||
newArray[0] = itemToAdd;
|
||||
|
||||
System.arraycopy(existingArray, 0, newArray, 1, existingArray.length);
|
||||
|
||||
return newArray;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (CommandUtils.noConsoleUsage(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!CommandUtils.hasPlayerDataKey(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (args.length) {
|
||||
case 0:
|
||||
Player player = (Player) sender;
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
boolean isLucky = Permissions.lucky(player, skill);
|
||||
boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
|
||||
float skillValue = mcMMOPlayer.getSkillLevel(skill);
|
||||
|
||||
//Send the players a few blank lines to make finding the top of the skill command easier
|
||||
if (AdvancedConfig.getInstance().doesSkillCommandSendBlankLines())
|
||||
for (int i = 0; i < 2; i++) {
|
||||
player.sendMessage("");
|
||||
}
|
||||
|
||||
permissionsCheck(player);
|
||||
dataCalculations(player, skillValue);
|
||||
|
||||
sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
|
||||
|
||||
//Make JSON text components
|
||||
List<TextComponent> subskillTextComponents = getTextComponents(player);
|
||||
|
||||
//Subskills Header
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul")));
|
||||
|
||||
//Send JSON text components
|
||||
|
||||
TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents);
|
||||
|
||||
/*for(TextComponent tc : subskillTextComponents)
|
||||
{
|
||||
player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")});
|
||||
}*/
|
||||
|
||||
//Stats
|
||||
getStatMessages(player, isLucky, hasEndurance, skillValue);
|
||||
|
||||
//Header
|
||||
|
||||
|
||||
//Link Header
|
||||
if (MainConfig.getInstance().getUrlLinksEnabled()) {
|
||||
player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header"));
|
||||
TextComponentFactory.sendPlayerUrlHeader(player);
|
||||
}
|
||||
|
||||
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled() && MainConfig.getInstance().getSkillUseBoard()) {
|
||||
ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
|
||||
}
|
||||
|
||||
return true;
|
||||
default:
|
||||
return skillGuideCommand.onCommand(sender, command, label, args);
|
||||
}
|
||||
}
|
||||
|
||||
private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) {
|
||||
List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
|
||||
|
||||
if (!statsMessages.isEmpty()) {
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
|
||||
|
||||
for (String message : statsMessages) {
|
||||
player.sendMessage(message);
|
||||
}
|
||||
}
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase()));
|
||||
}
|
||||
|
||||
private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
|
||||
ChatColor hd1 = ChatColor.DARK_AQUA;
|
||||
ChatColor c1 = ChatColor.GOLD;
|
||||
ChatColor c2 = ChatColor.RED;
|
||||
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
|
||||
|
||||
if (!skill.isChildSkill()) {
|
||||
/*
|
||||
* NON-CHILD SKILLS
|
||||
*/
|
||||
|
||||
//XP GAIN METHOD
|
||||
player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
|
||||
|
||||
//LEVEL
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
|
||||
|
||||
} else {
|
||||
/*
|
||||
* CHILD SKILLS
|
||||
*/
|
||||
|
||||
|
||||
Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
|
||||
ArrayList<PrimarySkillType> parentList = new ArrayList<>();
|
||||
|
||||
//TODO: Add JSON here
|
||||
for (PrimarySkillType parent : parents) {
|
||||
parentList.add(parent);
|
||||
/*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/
|
||||
;
|
||||
}
|
||||
|
||||
String parentMessage = "";
|
||||
|
||||
for (int i = 0; i < parentList.size(); i++) {
|
||||
if (i + 1 < parentList.size()) {
|
||||
parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
|
||||
parentMessage += ChatColor.GRAY + ", ";
|
||||
} else {
|
||||
parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
|
||||
}
|
||||
}
|
||||
|
||||
//XP GAIN METHOD
|
||||
player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage));
|
||||
//LEVEL
|
||||
//player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue));
|
||||
|
||||
}
|
||||
/*
|
||||
if (!skill.isChildSkill()) {
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
|
||||
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Level", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
|
||||
} else {
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
|
||||
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
|
||||
player.sendMessage(LocaleLoader.getString("Effects.Child", skillValue));
|
||||
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
|
||||
Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
|
||||
|
||||
for (PrimarySkillType parent : parents) {
|
||||
player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)));
|
||||
}
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
|
||||
switch (args.length) {
|
||||
case 1:
|
||||
return ImmutableList.of("?");
|
||||
default:
|
||||
return ImmutableList.of();
|
||||
}
|
||||
}
|
||||
|
||||
protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) {
|
||||
return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
|
||||
}
|
||||
|
||||
protected String[] getAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkill) {
|
||||
return RandomChanceUtil.calculateAbilityDisplayValues(skillActivationType, player, subSkill);
|
||||
}
|
||||
|
||||
protected String[] calculateLengthDisplayValues(Player player, float skillValue) {
|
||||
int maxLength = skill.getAbility().getMaxLength();
|
||||
int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
|
||||
int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
|
||||
|
||||
int length;
|
||||
|
||||
if (abilityLengthCap <= 0) {
|
||||
length = 2 + (int) (skillValue / abilityLengthVar);
|
||||
} else {
|
||||
length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar);
|
||||
}
|
||||
|
||||
int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
|
||||
|
||||
if (maxLength != 0) {
|
||||
length = Math.min(length, maxLength);
|
||||
}
|
||||
|
||||
return new String[]{String.valueOf(length), String.valueOf(enduranceLength)};
|
||||
}
|
||||
|
||||
protected String getStatMessage(SubSkillType subSkillType, String... vars) {
|
||||
return getStatMessage(false, false, subSkillType, vars);
|
||||
}
|
||||
|
||||
protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) {
|
||||
String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
|
||||
String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
|
||||
|
||||
if (isCustom)
|
||||
//Cast to Object[] to suppress warnings
|
||||
return LocaleLoader.getString(templateKey, LocaleLoader.getString(statDescriptionKey, (Object[]) vars));
|
||||
else {
|
||||
String[] mergedList = addItemToFirstPositionOfArray(LocaleLoader.getString(statDescriptionKey), vars);
|
||||
//Cast to Object[] to suppress warnings
|
||||
return LocaleLoader.getString(templateKey, (Object[]) mergedList);
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract void dataCalculations(Player player, float skillValue);
|
||||
|
||||
protected abstract void permissionsCheck(Player player);
|
||||
|
||||
//protected abstract List<String> effectsDisplay();
|
||||
|
||||
protected abstract List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky);
|
||||
|
||||
protected abstract List<TextComponent> getTextComponents(Player player);
|
||||
|
||||
/**
|
||||
* Checks if a player can use a skill
|
||||
*
|
||||
* @param player target player
|
||||
* @param subSkillType target subskill
|
||||
* @return true if the player has permission and has the skill unlocked
|
||||
*/
|
||||
protected boolean canUseSubskill(Player player, SubSkillType subSkillType) {
|
||||
return Permissions.isSubSkillEnabled(player, subSkillType) && RankUtils.hasUnlockedSubskill(player, subSkillType);
|
||||
}
|
||||
}
|
||||
@@ -1,108 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class SwordsCommand extends SkillCommand {
|
||||
private String counterChance;
|
||||
private String counterChanceLucky;
|
||||
private int bleedLength;
|
||||
private String bleedChance;
|
||||
private String bleedChanceLucky;
|
||||
private String serratedStrikesLength;
|
||||
private String serratedStrikesLengthEndurance;
|
||||
|
||||
private boolean canCounter;
|
||||
private boolean canSerratedStrike;
|
||||
private boolean canBleed;
|
||||
|
||||
public SwordsCommand() {
|
||||
super(PrimarySkillType.SWORDS);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// SWORDS_COUNTER_ATTACK
|
||||
if (canCounter) {
|
||||
String[] counterStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_COUNTER_ATTACK);
|
||||
counterChance = counterStrings[0];
|
||||
counterChanceLucky = counterStrings[1];
|
||||
}
|
||||
|
||||
// SWORDS_RUPTURE
|
||||
if (canBleed) {
|
||||
bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
|
||||
|
||||
String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE);
|
||||
bleedChance = bleedStrings[0];
|
||||
bleedChanceLucky = bleedStrings[1];
|
||||
}
|
||||
|
||||
// SERRATED STRIKES
|
||||
if (canSerratedStrike) {
|
||||
String[] serratedStrikesStrings = calculateLengthDisplayValues(player, skillValue);
|
||||
serratedStrikesLength = serratedStrikesStrings[0];
|
||||
serratedStrikesLengthEndurance = serratedStrikesStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE);
|
||||
canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK);
|
||||
canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
|
||||
double ruptureDamagePlayers = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer();
|
||||
double ruptureDamageMobs = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs();
|
||||
|
||||
if (canCounter) {
|
||||
messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canBleed) {
|
||||
messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : ""));
|
||||
messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE,
|
||||
String.valueOf(ruptureTicks),
|
||||
String.valueOf(ruptureDamagePlayers),
|
||||
String.valueOf(ruptureDamageMobs)));
|
||||
|
||||
messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note"));
|
||||
}
|
||||
|
||||
if (canSerratedStrike) {
|
||||
messages.add(getStatMessage(SubSkillType.SWORDS_SERRATED_STRIKES, serratedStrikesLength)
|
||||
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", serratedStrikesLengthEndurance) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SWORDS);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,102 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.taming.Taming;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class TamingCommand extends SkillCommand {
|
||||
private String goreChance;
|
||||
private String goreChanceLucky;
|
||||
|
||||
private boolean canBeastLore;
|
||||
private boolean canGore;
|
||||
private boolean canSharpenedClaws;
|
||||
private boolean canEnvironmentallyAware;
|
||||
private boolean canThickFur;
|
||||
private boolean canShockProof;
|
||||
private boolean canCallWild;
|
||||
private boolean canFastFood;
|
||||
private boolean canHolyHound;
|
||||
|
||||
public TamingCommand() {
|
||||
super(PrimarySkillType.TAMING);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
if (canGore) {
|
||||
String[] goreStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.TAMING_GORE);
|
||||
goreChance = goreStrings[0];
|
||||
goreChanceLucky = goreStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canBeastLore = canUseSubskill(player, SubSkillType.TAMING_BEAST_LORE);
|
||||
canCallWild = Permissions.callOfTheWild(player, EntityType.HORSE) || Permissions.callOfTheWild(player, EntityType.WOLF) || Permissions.callOfTheWild(player, EntityType.OCELOT);
|
||||
canEnvironmentallyAware = canUseSubskill(player, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE);
|
||||
canFastFood = canUseSubskill(player, SubSkillType.TAMING_FAST_FOOD_SERVICE);
|
||||
canGore = canUseSubskill(player, SubSkillType.TAMING_GORE);
|
||||
canSharpenedClaws = canUseSubskill(player, SubSkillType.TAMING_SHARPENED_CLAWS);
|
||||
canShockProof = canUseSubskill(player, SubSkillType.TAMING_SHOCK_PROOF);
|
||||
canThickFur = canUseSubskill(player, SubSkillType.TAMING_THICK_FUR);
|
||||
canHolyHound = canUseSubskill(player, SubSkillType.TAMING_HOLY_HOUND);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canEnvironmentallyAware) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.0"), LocaleLoader.getString("Taming.Ability.Bonus.1")));
|
||||
}
|
||||
|
||||
if (canFastFood) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.8"), LocaleLoader.getString("Taming.Ability.Bonus.9", percent.format(Taming.fastFoodServiceActivationChance / 100D))));
|
||||
}
|
||||
|
||||
if (canGore) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template",
|
||||
LocaleLoader.getString("Taming.Combat.Chance.Gore"),
|
||||
goreChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", goreChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canHolyHound) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.10"), LocaleLoader.getString("Taming.Ability.Bonus.11")));
|
||||
}
|
||||
|
||||
if (canSharpenedClaws) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.6"), LocaleLoader.getString("Taming.Ability.Bonus.7", Taming.sharpenedClawsBonusDamage)));
|
||||
}
|
||||
|
||||
if (canShockProof) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.4"), LocaleLoader.getString("Taming.Ability.Bonus.5", Taming.shockProofModifier)));
|
||||
}
|
||||
|
||||
if (canThickFur) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.2"), LocaleLoader.getString("Taming.Ability.Bonus.3", Taming.thickFurModifier)));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, this.skill);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
package com.gmail.nossr50.commands.skills;
|
||||
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.TextComponentFactory;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.skills.SkillActivationType;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class UnarmedCommand extends SkillCommand {
|
||||
private String berserkLength;
|
||||
private String berserkLengthEndurance;
|
||||
private String deflectChance;
|
||||
private String deflectChanceLucky;
|
||||
private String disarmChance;
|
||||
private String disarmChanceLucky;
|
||||
private String ironGripChance;
|
||||
private String ironGripChanceLucky;
|
||||
private double ironArmBonus;
|
||||
|
||||
private boolean canBerserk;
|
||||
private boolean canDisarm;
|
||||
private boolean canIronArm;
|
||||
private boolean canDeflect;
|
||||
private boolean canIronGrip;
|
||||
|
||||
public UnarmedCommand() {
|
||||
super(PrimarySkillType.UNARMED);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void dataCalculations(Player player, float skillValue) {
|
||||
// UNARMED_ARROW_DEFLECT
|
||||
if (canDeflect) {
|
||||
String[] deflectStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_ARROW_DEFLECT);
|
||||
;
|
||||
deflectChance = deflectStrings[0];
|
||||
deflectChanceLucky = deflectStrings[1];
|
||||
}
|
||||
|
||||
// BERSERK
|
||||
if (canBerserk) {
|
||||
String[] berserkStrings = calculateLengthDisplayValues(player, skillValue);
|
||||
berserkLength = berserkStrings[0];
|
||||
berserkLengthEndurance = berserkStrings[1];
|
||||
}
|
||||
|
||||
// UNARMED_DISARM
|
||||
if (canDisarm) {
|
||||
String[] disarmStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_DISARM);
|
||||
;
|
||||
disarmChance = disarmStrings[0];
|
||||
disarmChanceLucky = disarmStrings[1];
|
||||
}
|
||||
|
||||
// IRON ARM
|
||||
if (canIronArm) {
|
||||
ironArmBonus = UserManager.getPlayer(player).getUnarmedManager().getIronArmDamage();
|
||||
}
|
||||
|
||||
// IRON GRIP
|
||||
if (canIronGrip) {
|
||||
String[] ironGripStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_IRON_GRIP);
|
||||
ironGripChance = ironGripStrings[0];
|
||||
ironGripChanceLucky = ironGripStrings[1];
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void permissionsCheck(Player player) {
|
||||
canBerserk = RankUtils.hasUnlockedSubskill(player, SubSkillType.UNARMED_BERSERK) && Permissions.berserk(player);
|
||||
canIronArm = canUseSubskill(player, SubSkillType.UNARMED_IRON_ARM_STYLE);
|
||||
canDeflect = canUseSubskill(player, SubSkillType.UNARMED_ARROW_DEFLECT);
|
||||
canDisarm = canUseSubskill(player, SubSkillType.UNARMED_DISARM);
|
||||
canIronGrip = canUseSubskill(player, SubSkillType.UNARMED_IRON_GRIP);
|
||||
// TODO: Apparently we forgot about block cracker?
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
|
||||
List<String> messages = new ArrayList<String>();
|
||||
|
||||
if (canDeflect) {
|
||||
messages.add(getStatMessage(SubSkillType.UNARMED_ARROW_DEFLECT, deflectChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", deflectChanceLucky) : ""));
|
||||
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.ArrowDeflect", deflectChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", deflectChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canBerserk) {
|
||||
messages.add(getStatMessage(SubSkillType.UNARMED_BERSERK, berserkLength)
|
||||
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", berserkLengthEndurance) : ""));
|
||||
//messages.add(LocaleLoader.getString("Unarmed.Ability.Berserk.Length", berserkLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", berserkLengthEndurance) : ""));
|
||||
}
|
||||
|
||||
if (canDisarm) {
|
||||
messages.add(getStatMessage(SubSkillType.UNARMED_DISARM, disarmChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", disarmChanceLucky) : ""));
|
||||
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.Disarm", disarmChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", disarmChanceLucky) : ""));
|
||||
}
|
||||
|
||||
if (canIronArm) {
|
||||
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Unarmed.Ability.Bonus.0"), LocaleLoader.getString("Unarmed.Ability.Bonus.1", ironArmBonus)));
|
||||
}
|
||||
|
||||
if (canIronGrip) {
|
||||
messages.add(getStatMessage(SubSkillType.UNARMED_IRON_GRIP, ironGripChance)
|
||||
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ironGripChanceLucky) : ""));
|
||||
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.IronGrip", ironGripChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ironGripChanceLucky) : ""));
|
||||
}
|
||||
|
||||
return messages;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected List<TextComponent> getTextComponents(Player player) {
|
||||
List<TextComponent> textComponents = new ArrayList<>();
|
||||
|
||||
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.UNARMED);
|
||||
|
||||
return textComponents;
|
||||
}
|
||||
}
|
||||
@@ -1,566 +0,0 @@
|
||||
package com.gmail.nossr50.listeners;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.config.ChunkConversionOptions;
|
||||
import com.gmail.nossr50.core.config.WorldBlacklist;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SuperAbilityType;
|
||||
import com.gmail.nossr50.core.skills.ToolType;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.Salvage;
|
||||
import com.gmail.nossr50.core.skills.primary.alchemy.Alchemy;
|
||||
import com.gmail.nossr50.core.skills.primary.excavation.ExcavationManager;
|
||||
import com.gmail.nossr50.core.skills.primary.herbalism.Herbalism;
|
||||
import com.gmail.nossr50.core.skills.primary.herbalism.HerbalismManager;
|
||||
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.Repair;
|
||||
import com.gmail.nossr50.core.skills.primary.woodcutting.WoodcuttingManager;
|
||||
import com.gmail.nossr50.core.util.BlockUtils;
|
||||
import com.gmail.nossr50.core.util.EventUtils;
|
||||
import com.gmail.nossr50.core.util.ItemUtils;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.skills.SkillUtils;
|
||||
import com.gmail.nossr50.core.util.sounds.SoundManager;
|
||||
import com.gmail.nossr50.core.util.sounds.SoundType;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.core.events.fake.FakeBlockBreakEvent;
|
||||
import com.gmail.nossr50.core.events.fake.FakeBlockDamageEvent;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.block.*;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.block.*;
|
||||
import org.bukkit.event.entity.EntityChangeBlockEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.metadata.MetadataValue;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class BlockListener implements Listener {
|
||||
private final mcMMO plugin;
|
||||
|
||||
public BlockListener(final mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockPistonExtend events.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockPistonExtend(BlockPistonExtendEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
BlockFace direction = event.getDirection();
|
||||
Block movedBlock = event.getBlock();
|
||||
movedBlock = movedBlock.getRelative(direction, 2);
|
||||
|
||||
for (Block b : event.getBlocks()) {
|
||||
if (BlockUtils.shouldBeWatched(b.getState()) && mcMMO.getPlaceStore().isTrue(b)) {
|
||||
movedBlock = b.getRelative(direction);
|
||||
mcMMO.getPlaceStore().setTrue(movedBlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockPistonRetract events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockPistonRetract(BlockPistonRetractEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
// Get opposite direction so we get correct block
|
||||
BlockFace direction = event.getDirection();
|
||||
Block movedBlock = event.getBlock().getRelative(direction);
|
||||
mcMMO.getPlaceStore().setTrue(movedBlock);
|
||||
|
||||
for (Block block : event.getBlocks()) {
|
||||
movedBlock = block.getRelative(direction);
|
||||
mcMMO.getPlaceStore().setTrue(movedBlock);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor blocks formed by entities (snowmen)
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onEntityBlockFormEvent(EntityBlockFormEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
if (BlockUtils.shouldBeWatched(event.getBlock().getState())) {
|
||||
mcMMO.getPlaceStore().setTrue(event.getBlock());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor falling blocks.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onFallingBlock(EntityChangeBlockEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
if (BlockUtils.shouldBeWatched(event.getBlock().getState()) && event.getEntityType().equals(EntityType.FALLING_BLOCK)) {
|
||||
if (event.getTo().equals(Material.AIR) && mcMMO.getPlaceStore().isTrue(event.getBlock())) {
|
||||
event.getEntity().setMetadata("mcMMOBlockFall", new FixedMetadataValue(plugin, event.getBlock().getLocation()));
|
||||
} else {
|
||||
List<MetadataValue> values = event.getEntity().getMetadata("mcMMOBlockFall");
|
||||
|
||||
if (!values.isEmpty()) {
|
||||
|
||||
if (values.get(0).value() == null) return;
|
||||
Block spawn = ((org.bukkit.Location) values.get(0).value()).getBlock();
|
||||
|
||||
|
||||
mcMMO.getPlaceStore().setTrue(event.getBlock());
|
||||
mcMMO.getPlaceStore().setFalse(spawn);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockPlace events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
|
||||
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
|
||||
if (BlockUtils.shouldBeWatched(blockState)) {
|
||||
// Don't count de-barking wood
|
||||
if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType()))
|
||||
mcMMO.getPlaceStore().setTrue(blockState);
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
if (blockState.getType() == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player)) {
|
||||
mcMMOPlayer.getRepairManager().placedAnvilCheck();
|
||||
} else if (blockState.getType() == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player)) {
|
||||
mcMMOPlayer.getSalvageManager().placedAnvilCheck();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockMultiPlace events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockMultiPlace(BlockMultiPlaceEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (BlockState replacedBlockState : event.getReplacedBlockStates()) {
|
||||
BlockState blockState = replacedBlockState.getBlock().getState();
|
||||
|
||||
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
|
||||
if (BlockUtils.shouldBeWatched(blockState)) {
|
||||
mcMMO.getPlaceStore().setTrue(blockState);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockGrow(BlockGrowEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
|
||||
if (!BlockUtils.shouldBeWatched(blockState)) {
|
||||
return;
|
||||
}
|
||||
|
||||
mcMMO.getPlaceStore().setFalse(blockState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockBreak events.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event instanceof FakeBlockBreakEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
Location location = blockState.getLocation();
|
||||
|
||||
if (!BlockUtils.shouldBeWatched(blockState)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* ALCHEMY - Cancel any brew in progress for that BrewingStand */
|
||||
if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) {
|
||||
Alchemy.brewingStandMap.get(location).cancelBrew();
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
/* HERBALISM */
|
||||
if (BlockUtils.affectedByGreenTerra(blockState)) {
|
||||
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
|
||||
|
||||
/* Green Terra */
|
||||
if (herbalismManager.canActivateAbility()) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
|
||||
}
|
||||
|
||||
/*
|
||||
* We don't check the block store here because herbalism has too many unusual edge cases.
|
||||
* Instead, we check it inside the drops handler.
|
||||
*/
|
||||
if (PrimarySkillType.HERBALISM.getPermissions(player)) {
|
||||
herbalismManager.herbalismBlockCheck(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
/* MINING */
|
||||
else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && PrimarySkillType.MINING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
|
||||
MiningManager miningManager = mcMMOPlayer.getMiningManager();
|
||||
miningManager.miningBlockCheck(blockState);
|
||||
}
|
||||
|
||||
/* WOOD CUTTING */
|
||||
else if (BlockUtils.isLog(blockState) && ItemUtils.isAxe(heldItem) && PrimarySkillType.WOODCUTTING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
|
||||
WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
|
||||
if (woodcuttingManager.canUseTreeFeller(heldItem)) {
|
||||
woodcuttingManager.processTreeFeller(blockState);
|
||||
} else {
|
||||
woodcuttingManager.woodcuttingBlockCheck(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
/* EXCAVATION */
|
||||
else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && PrimarySkillType.EXCAVATION.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
|
||||
ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
|
||||
excavationManager.excavationBlockCheck(blockState);
|
||||
|
||||
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER)) {
|
||||
excavationManager.gigaDrillBreaker(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
/* Remove metadata from placed watched blocks */
|
||||
mcMMO.getPlaceStore().setFalse(blockState);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle BlockBreak events where the event is modified.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onBlockBreakHigher(BlockBreakEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event instanceof FakeBlockBreakEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
if (Herbalism.isRecentlyRegrown(blockState)) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ItemUtils.isSword(heldItem)) {
|
||||
HerbalismManager herbalismManager = UserManager.getPlayer(player).getHerbalismManager();
|
||||
|
||||
if (herbalismManager.canUseHylianLuck()) {
|
||||
if (herbalismManager.processHylianLuck(blockState)) {
|
||||
blockState.update(true);
|
||||
event.setCancelled(true);
|
||||
} else if (blockState.getType() == Material.FLOWER_POT) {
|
||||
blockState.setType(Material.AIR);
|
||||
blockState.update(true);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*else if (!heldItem.containsEnchantment(Enchantment.SILK_TOUCH)) {
|
||||
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
|
||||
|
||||
if (smeltingManager.canUseFluxMining(blockState)) {
|
||||
if (smeltingManager.processFluxMining(blockState)) {
|
||||
blockState.update(true);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor BlockDamage events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onBlockDamage(BlockDamageEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event instanceof FakeBlockDamageEvent) {
|
||||
return;
|
||||
}
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
/*
|
||||
* ABILITY PREPARATION CHECKS
|
||||
*
|
||||
* We check permissions here before processing activation.
|
||||
*/
|
||||
if (BlockUtils.canActivateAbilities(blockState)) {
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
|
||||
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING);
|
||||
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING);
|
||||
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION);
|
||||
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
|
||||
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TREE FELLER SOUNDS
|
||||
*
|
||||
* We don't need to check permissions here because they've already been checked for the ability to even activate.
|
||||
*/
|
||||
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.isLog(blockState) && MainConfig.getInstance().getTreeFellerSoundsEnabled()) {
|
||||
SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ);
|
||||
}
|
||||
}
|
||||
|
||||
private Player getPlayerFromFurnace(Block furnaceBlock) {
|
||||
List<MetadataValue> metadata = furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey);
|
||||
|
||||
if (metadata.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return plugin.getServer().getPlayerExact(metadata.get(0).asString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle BlockDamage events where the event is modified.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onBlockDamageHigher(BlockDamageEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event instanceof FakeBlockDamageEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
Block block = event.getBlock();
|
||||
BlockState blockState = block.getState();
|
||||
|
||||
/*
|
||||
* ABILITY TRIGGER CHECKS
|
||||
*
|
||||
* We don't need to check permissions here because they've already been checked for the ability to even activate.
|
||||
*/
|
||||
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState)) {
|
||||
if (mcMMOPlayer.getHerbalismManager().processGreenTerra(blockState)) {
|
||||
blockState.update(true);
|
||||
}
|
||||
} else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && heldItem.getType() == Material.AIR) {
|
||||
if (SuperAbilityType.BERSERK.blockCheck(block.getState()) && EventUtils.simulateBlockBreak(block, player, true)) {
|
||||
event.setInstaBreak(true);
|
||||
SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
|
||||
} else if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState) && EventUtils.simulateBlockBreak(block, player, true)) {
|
||||
if (mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) {
|
||||
blockState.update();
|
||||
}
|
||||
}
|
||||
} else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isLeaves(blockState) && EventUtils.simulateBlockBreak(block, player, true)) {
|
||||
event.setInstaBreak(true);
|
||||
SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onBlockDamageCleanup(BlockDamageEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
BlockState blockState = event.getBlock().getState();
|
||||
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
cleanupAbilityTools(player, mcMMOPlayer, blockState, heldItem);
|
||||
|
||||
debugStickDump(player, blockState);
|
||||
}
|
||||
|
||||
public void debugStickDump(Player player, BlockState blockState) {
|
||||
if (player.getInventory().getItemInMainHand().getType() == Material.DEBUG_STICK) {
|
||||
if (mcMMO.getPlaceStore().isTrue(blockState))
|
||||
player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP");
|
||||
else {
|
||||
player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO");
|
||||
UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState);
|
||||
}
|
||||
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
player.sendMessage("[mcMMO DEBUG] World Guard main flag is permitted for this player in this region");
|
||||
else
|
||||
player.sendMessage("[mcMMO DEBUG] World Guard main flag is DENIED for this player in this region");
|
||||
|
||||
if (WorldGuardManager.getInstance().hasXPFlag(player))
|
||||
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is permitted for this player in this region");
|
||||
else
|
||||
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region");
|
||||
}
|
||||
|
||||
if (blockState instanceof Furnace) {
|
||||
Furnace furnace = (Furnace) blockState;
|
||||
if (furnace.hasMetadata(mcMMO.furnaceMetadataKey)) {
|
||||
player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner");
|
||||
Player furnacePlayer = getPlayerFromFurnace(furnace.getBlock());
|
||||
if (furnacePlayer != null) {
|
||||
player.sendMessage("[mcMMO DEBUG] This furnace is owned by player " + furnacePlayer.getName());
|
||||
}
|
||||
} else
|
||||
player.sendMessage("[mcMMO DEBUG] This furnace does not have a registered owner");
|
||||
}
|
||||
|
||||
if (ExperienceConfig.getInstance().isExperienceBarsEnabled())
|
||||
player.sendMessage("[mcMMO DEBUG] XP bars are enabled, however you should check per-skill settings to make sure those are enabled.");
|
||||
}
|
||||
}
|
||||
|
||||
public void cleanupAbilityTools(Player player, McMMOPlayer mcMMOPlayer, BlockState blockState, ItemStack heldItem) {
|
||||
if (ChunkConversionOptions.getInstance().useEnchantmentBuffs()) {
|
||||
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER))) {
|
||||
SkillUtils.removeAbilityBuff(heldItem);
|
||||
}
|
||||
} else {
|
||||
if ((mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
|
||||
SkillUtils.handleAbilitySpeedDecrease(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,860 +0,0 @@
|
||||
package com.gmail.nossr50.listeners;
|
||||
|
||||
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.core.config.AdvancedConfig;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.config.WorldBlacklist;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.meta.OldName;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.archery.Archery;
|
||||
import com.gmail.nossr50.core.skills.primary.fishing.Fishing;
|
||||
import com.gmail.nossr50.core.skills.primary.mining.BlastMining;
|
||||
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
|
||||
import com.gmail.nossr50.core.skills.primary.taming.Taming;
|
||||
import com.gmail.nossr50.core.skills.primary.taming.TamingManager;
|
||||
import com.gmail.nossr50.core.skills.subskills.interfaces.InteractType;
|
||||
import com.gmail.nossr50.core.util.BlockUtils;
|
||||
import com.gmail.nossr50.core.util.Misc;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.skills.CombatUtils;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.core.events.fake.FakeEntityDamageByEntityEvent;
|
||||
import com.gmail.nossr50.core.events.fake.FakeEntityDamageEvent;
|
||||
import com.gmail.nossr50.core.events.fake.FakeEntityTameEvent;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.OfflinePlayer;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.enchantments.Enchantment;
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.*;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageModifier;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.metadata.MetadataValue;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class EntityListener implements Listener {
|
||||
private final mcMMO plugin;
|
||||
|
||||
public EntityListener(final mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onEntityTargetEntity(EntityTargetLivingEntityEvent event) {
|
||||
if (!ExperienceConfig.getInstance().isEndermanEndermiteFarmingPrevented())
|
||||
return;
|
||||
|
||||
//Prevent entities from giving XP if they target endermite
|
||||
if (event.getTarget() instanceof Endermite) {
|
||||
if (event.getEntity().getMetadata(mcMMO.entityMetadataKey) == null || event.getEntity().getMetadata(mcMMO.entityMetadataKey).size() <= 0)
|
||||
event.getEntity().setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onEntityShootBow(EntityShootBowEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event.getEntity() instanceof Player) {
|
||||
Player player = (Player) event.getEntity();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Entity projectile = event.getProjectile();
|
||||
|
||||
if (!(projectile instanceof Arrow)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack bow = event.getBow();
|
||||
|
||||
if (bow != null && bow.containsEnchantment(Enchantment.ARROW_INFINITE)) {
|
||||
projectile.setMetadata(mcMMO.infiniteArrowKey, mcMMO.metadataValue);
|
||||
}
|
||||
|
||||
projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, Math.min(event.getForce() * AdvancedConfig.getInstance().getForceMultiplier(), 1.0)));
|
||||
projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation()));
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onProjectileLaunch(ProjectileLaunchEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event.getEntity() instanceof Player) {
|
||||
Player player = (Player) event.getEntity();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Projectile projectile = event.getEntity();
|
||||
|
||||
if (!(projectile instanceof Arrow) || projectile.hasMetadata(mcMMO.bowForceKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
projectile.setMetadata(mcMMO.bowForceKey, new FixedMetadataValue(plugin, 1.0));
|
||||
projectile.setMetadata(mcMMO.arrowDistanceKey, new FixedMetadataValue(plugin, projectile.getLocation()));
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor EntityChangeBlock events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onEntityChangeBlock(EntityChangeBlockEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Block block = event.getBlock();
|
||||
|
||||
// When the event is fired for the falling block that changes back to a
|
||||
// normal block
|
||||
// event.getBlock().getType() returns AIR
|
||||
if (!BlockUtils.shouldBeWatched(block.getState()) && block.getType() != Material.AIR) {
|
||||
return;
|
||||
}
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
if (entity instanceof FallingBlock || entity instanceof Enderman) {
|
||||
boolean isTracked = entity.hasMetadata(mcMMO.entityMetadataKey);
|
||||
|
||||
if (mcMMO.getPlaceStore().isTrue(block) && !isTracked) {
|
||||
mcMMO.getPlaceStore().setFalse(block);
|
||||
entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
} else if (isTracked) {
|
||||
mcMMO.getPlaceStore().setTrue(block);
|
||||
}
|
||||
} else if ((block.getType() == Material.REDSTONE_ORE)) {
|
||||
return;
|
||||
} else {
|
||||
if (mcMMO.getPlaceStore().isTrue(block)) {
|
||||
mcMMO.getPlaceStore().setFalse(block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle EntityDamageByEntity events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event instanceof FakeEntityDamageByEntityEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getEntity() instanceof ArmorStand) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getDamager().hasMetadata(mcMMO.funfettiMetadataKey)) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
double damage = event.getFinalDamage();
|
||||
Entity defender = event.getEntity();
|
||||
Entity attacker = event.getDamager();
|
||||
|
||||
if (attacker instanceof Player) {
|
||||
Player player = (Player) attacker;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (damage <= 0) {
|
||||
if (defender instanceof Player && attacker instanceof Player) {
|
||||
Player defendingPlayer = (Player) defender;
|
||||
Player attackingPlayer = (Player) attacker;
|
||||
if (event.getDamage(DamageModifier.ABSORPTION) > 0) {
|
||||
//If friendly fire is off don't allow players to hurt one another
|
||||
if (!MainConfig.getInstance().getPartyFriendlyFire())
|
||||
if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer) || PartyManager.areAllies(defendingPlayer, attackingPlayer)) && !(Permissions.friendlyFire(attackingPlayer) && Permissions.friendlyFire(defendingPlayer))) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
As far as I can tell at one point we registered meta-data about custom damage and we no longer do that.
|
||||
|
||||
if (defender.hasMetadata(mcMMO.customDamageKey)) {
|
||||
defender.removeMetadata(mcMMO.customDamageKey, plugin);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
if (Misc.isNPCEntity(defender) || !defender.isValid() || !(defender instanceof LivingEntity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity target = (LivingEntity) defender;
|
||||
|
||||
if (CombatUtils.isInvincible(target, damage)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (Misc.isNPCEntity(attacker)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (attacker instanceof Projectile) {
|
||||
ProjectileSource projectileSource = ((Projectile) attacker).getShooter();
|
||||
|
||||
if (projectileSource instanceof LivingEntity) {
|
||||
attacker = (LivingEntity) projectileSource;
|
||||
}
|
||||
} else if (attacker instanceof Tameable) {
|
||||
AnimalTamer animalTamer = ((Tameable) attacker).getOwner();
|
||||
|
||||
if (animalTamer != null && ((OfflinePlayer) animalTamer).isOnline()) {
|
||||
attacker = (Entity) animalTamer;
|
||||
}
|
||||
} else if (attacker instanceof TNTPrimed && defender instanceof Player) {
|
||||
if (BlastMining.processBlastMiningExplosion(event, (TNTPrimed) attacker, (Player) defender)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (defender instanceof Player && attacker instanceof Player) {
|
||||
Player defendingPlayer = (Player) defender;
|
||||
Player attackingPlayer = (Player) attacker;
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(defendingPlayer) || !UserManager.hasPlayerDataKey(attackingPlayer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We want to make sure we're not gaining XP or applying abilities
|
||||
// when we hit ourselves
|
||||
if (defendingPlayer.equals(attackingPlayer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Party Friendly Fire
|
||||
if (!MainConfig.getInstance().getPartyFriendlyFire())
|
||||
if ((PartyManager.inSameParty(defendingPlayer, attackingPlayer) || PartyManager.areAllies(defendingPlayer, attackingPlayer)) && !(Permissions.friendlyFire(attackingPlayer) && Permissions.friendlyFire(defendingPlayer))) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
CombatUtils.processCombatAttack(event, attacker, target);
|
||||
CombatUtils.handleHealthbars(attacker, target, event.getFinalDamage(), plugin);
|
||||
|
||||
/**
|
||||
* This sets entity names back to whatever they are supposed to be
|
||||
*/
|
||||
if (!(attacker instanceof Player) && defender instanceof Player) {
|
||||
if (event.getFinalDamage() >= ((LivingEntity) defender).getHealth()) {
|
||||
List<MetadataValue> metadataValue = attacker.getMetadata("mcMMO_oldName");
|
||||
|
||||
if (metadataValue.size() <= 0)
|
||||
return;
|
||||
|
||||
if (metadataValue != null) {
|
||||
OldName oldName = (OldName) metadataValue.get(0);
|
||||
attacker.setCustomName(oldName.asString());
|
||||
attacker.setCustomNameVisible(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle EntityDamage events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onEntityDamage(EntityDamageEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event.getEntity() instanceof Player) {
|
||||
Player player = (Player) event.getEntity();
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Process Registered Interactions
|
||||
*/
|
||||
|
||||
InteractionManager.processEvent(event, plugin, InteractType.ON_ENTITY_DAMAGE);
|
||||
|
||||
/*
|
||||
* Old code
|
||||
*/
|
||||
|
||||
if (event instanceof FakeEntityDamageEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
double damage = event.getFinalDamage();
|
||||
|
||||
if (damage <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
/*
|
||||
As far as I can tell at one point we registered meta-data about custom damage and we no longer do that.
|
||||
if (entity.hasMetadata(mcMMO.customDamageKey)) {
|
||||
entity.removeMetadata(mcMMO.customDamageKey, plugin);
|
||||
return;
|
||||
}
|
||||
*/
|
||||
|
||||
if (Misc.isNPCEntity(entity) || !entity.isValid() || !(entity instanceof LivingEntity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity livingEntity = (LivingEntity) entity;
|
||||
|
||||
if (CombatUtils.isInvincible(livingEntity, damage)) {
|
||||
return;
|
||||
}
|
||||
|
||||
DamageCause cause = event.getCause();
|
||||
|
||||
if (livingEntity instanceof Player) {
|
||||
Player player = (Player) entity;
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
/* Check for invincibility */
|
||||
if (mcMMOPlayer.getGodMode()) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getFinalDamage() >= 1) {
|
||||
mcMMOPlayer.actualizeRecentlyHurt();
|
||||
}
|
||||
|
||||
} else if (livingEntity instanceof Tameable) {
|
||||
Tameable pet = (Tameable) livingEntity;
|
||||
AnimalTamer owner = pet.getOwner();
|
||||
|
||||
if (owner instanceof Player) {
|
||||
Player player = (Player) owner;
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Taming.canPreventDamage(pet, owner)) {
|
||||
Player player = (Player) owner;
|
||||
Wolf wolf = (Wolf) pet;
|
||||
|
||||
TamingManager tamingManager = UserManager.getPlayer(player).getTamingManager();
|
||||
|
||||
switch (cause) {
|
||||
case CONTACT:
|
||||
case FIRE:
|
||||
case LAVA:
|
||||
if (tamingManager.canUseEnvironmentallyAware()) {
|
||||
tamingManager.processEnvironmentallyAware(wolf, event.getDamage());
|
||||
}
|
||||
return;
|
||||
|
||||
case FALL:
|
||||
if (tamingManager.canUseEnvironmentallyAware()) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
return;
|
||||
|
||||
case ENTITY_ATTACK:
|
||||
case PROJECTILE:
|
||||
if (tamingManager.canUseThickFur()) {
|
||||
event.setDamage(Taming.processThickFur(wolf, event.getDamage()));
|
||||
|
||||
if (event.getFinalDamage() == 0) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
case FIRE_TICK:
|
||||
if (tamingManager.canUseThickFur()) {
|
||||
Taming.processThickFurFire(wolf);
|
||||
}
|
||||
return;
|
||||
|
||||
case MAGIC:
|
||||
case POISON:
|
||||
case WITHER:
|
||||
if (tamingManager.canUseHolyHound()) {
|
||||
Taming.processHolyHound(wolf, event.getDamage());
|
||||
}
|
||||
return;
|
||||
|
||||
case BLOCK_EXPLOSION:
|
||||
case ENTITY_EXPLOSION:
|
||||
case LIGHTNING:
|
||||
if (tamingManager.canUseShockProof()) {
|
||||
event.setDamage(Taming.processShockProof(wolf, event.getDamage()));
|
||||
|
||||
if (event.getFinalDamage() == 0) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor EntityDeath events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onEntityDeathLowest(EntityDeathEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
LivingEntity entity = event.getEntity();
|
||||
|
||||
if (Misc.isNPCEntity(entity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (entity.hasMetadata(mcMMO.customNameKey)) {
|
||||
entity.setCustomName(entity.getMetadata(mcMMO.customNameKey).get(0).asString());
|
||||
entity.removeMetadata(mcMMO.customNameKey, plugin);
|
||||
}
|
||||
|
||||
if (entity.hasMetadata(mcMMO.customVisibleKey)) {
|
||||
entity.setCustomNameVisible(entity.getMetadata(mcMMO.customVisibleKey).get(0).asBoolean());
|
||||
entity.removeMetadata(mcMMO.customVisibleKey, plugin);
|
||||
}
|
||||
|
||||
if (entity.hasMetadata(mcMMO.entityMetadataKey)) {
|
||||
entity.removeMetadata(mcMMO.entityMetadataKey, plugin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor EntityDeath events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onEntityDeath(EntityDeathEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
LivingEntity entity = event.getEntity();
|
||||
|
||||
if (Misc.isNPCEntity(entity)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Archery.arrowRetrievalCheck(entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor CreatureSpawn events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onCreatureSpawn(CreatureSpawnEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
LivingEntity entity = event.getEntity();
|
||||
|
||||
switch (event.getSpawnReason()) {
|
||||
case NETHER_PORTAL:
|
||||
case SPAWNER:
|
||||
case SPAWNER_EGG:
|
||||
entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
|
||||
Entity passenger = entity.getPassenger();
|
||||
|
||||
if (passenger != null) {
|
||||
passenger.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
}
|
||||
return;
|
||||
|
||||
case BREEDING:
|
||||
entity.setMetadata(mcMMO.bredMetadataKey, mcMMO.metadataValue);
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle ExplosionPrime events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onExplosionPrime(ExplosionPrimeEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(mcMMO.tntMetadataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We can make this assumption because we (should) be the only ones
|
||||
// using this exact metadata
|
||||
Player player = plugin.getServer().getPlayerExact(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString());
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
|
||||
|
||||
if (miningManager.canUseBiggerBombs()) {
|
||||
event.setRadius(miningManager.biggerBombs(event.getRadius()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle EntityExplode events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onEnitityExplode(EntityExplodeEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(mcMMO.tntMetadataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// We can make this assumption because we (should) be the only ones
|
||||
// using this exact metadata
|
||||
Player player = plugin.getServer().getPlayerExact(entity.getMetadata(mcMMO.tntMetadataKey).get(0).asString());
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
|
||||
|
||||
if (miningManager.canUseBlastMining()) {
|
||||
miningManager.blastMiningDropProcessing(event.getYield(), event.blockList());
|
||||
event.setYield(0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle EntityExplode events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
public void onEntityExplodeMonitor(EntityExplodeEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
if (!(entity instanceof TNTPrimed) || !entity.hasMetadata(mcMMO.tntsafeMetadataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.blockList().clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle FoodLevelChange events that involve modifying the event.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
public void onFoodLevelChange(FoodLevelChangeEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
|
||||
if (!(entity instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) entity;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int currentFoodLevel = player.getFoodLevel();
|
||||
int newFoodLevel = event.getFoodLevel();
|
||||
int foodChange = newFoodLevel - currentFoodLevel;
|
||||
|
||||
if (foodChange <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some foods have 3 ranks Some foods have 5 ranks The number of ranks
|
||||
* is based on how 'common' the item is We can adjust this quite easily
|
||||
* if we find something is giving too much of a bonus
|
||||
*/
|
||||
switch (player.getInventory().getItemInMainHand().getType()) {
|
||||
case BAKED_POTATO: /*
|
||||
* RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
case BEETROOT:
|
||||
case BREAD: /* RESTORES 2 1/2 HUNGER - RESTORES 5 HUNGER @ 1000 */
|
||||
case CARROT: /*
|
||||
* RESTORES 2 HUNGER - RESTORES 4 1/2 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
case GOLDEN_CARROT: /*
|
||||
* RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
case MUSHROOM_STEW: /*
|
||||
* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
case PUMPKIN_PIE: /*
|
||||
* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) {
|
||||
event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel));
|
||||
}
|
||||
return;
|
||||
|
||||
case COOKIE: /* RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
|
||||
case MELON_SLICE: /* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */
|
||||
case POISONOUS_POTATO: /*
|
||||
* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER
|
||||
* @ 1000
|
||||
*/
|
||||
case POTATO: /* RESTORES 1/2 HUNGER - RESTORES 2 HUNGER @ 1000 */
|
||||
if (Permissions.isSubSkillEnabled(player, SubSkillType.HERBALISM_FARMERS_DIET)) {
|
||||
event.setFoodLevel(UserManager.getPlayer(player).getHerbalismManager().farmersDiet(newFoodLevel));
|
||||
}
|
||||
return;
|
||||
|
||||
case COOKED_SALMON: /*
|
||||
* RESTORES 2 1/2 HUNGER - RESTORES 5 HUNGER @
|
||||
* 1000
|
||||
*/
|
||||
if (Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_FISHERMANS_DIET)) {
|
||||
event.setFoodLevel(UserManager.getPlayer(player).getFishingManager().handleFishermanDiet(Fishing.fishermansDietRankLevel1, newFoodLevel));
|
||||
}
|
||||
return;
|
||||
|
||||
case SALMON: /* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */
|
||||
if (Permissions.isSubSkillEnabled(player, SubSkillType.FISHING_FISHERMANS_DIET)) {
|
||||
event.setFoodLevel(UserManager.getPlayer(player).getFishingManager().handleFishermanDiet(Fishing.fishermansDietRankLevel2, newFoodLevel));
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor EntityTame events.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onEntityTame(EntityTameEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event instanceof FakeEntityTameEvent) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) event.getOwner();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
LivingEntity entity = event.getEntity();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || Misc.isNPCEntity(entity) || entity.hasMetadata(mcMMO.entityMetadataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
entity.setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
UserManager.getPlayer(player).getTamingManager().awardTamingXP(entity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle EntityTarget events.
|
||||
*
|
||||
* @param event The event to process
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onEntityTarget(EntityTargetEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
Entity entity = event.getEntity();
|
||||
Entity target = event.getTarget();
|
||||
|
||||
if (!(entity instanceof Tameable) || !(target instanceof Player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) target;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
Tameable tameable = (Tameable) entity;
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !CombatUtils.isFriendlyPet(player, tameable)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// isFriendlyPet ensures that the Tameable is: Tamed, owned by a player,
|
||||
// and the owner is in the same party
|
||||
// So we can make some assumptions here, about our casting and our check
|
||||
if (!(Permissions.friendlyFire(player) && Permissions.friendlyFire((Player) tameable.getOwner()))) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PotionSplash events in order to fix broken Splash Potion of
|
||||
* Saturation.
|
||||
*
|
||||
* @param event The event to process
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPotionSplash(PotionSplashEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
for (PotionEffect effect : ((PotionMeta) event.getPotion().getItem().getItemMeta()).getCustomEffects()) {
|
||||
if (!effect.getType().equals(PotionEffectType.SATURATION)) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (LivingEntity entity : event.getAffectedEntities()) {
|
||||
int duration = (int) (effect.getDuration() * event.getIntensity(entity));
|
||||
entity.addPotionEffect(new PotionEffect(effect.getType(), duration, effect.getAmplifier(), effect.isAmbient()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPigZapEvent(PigZapEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event.getEntity().hasMetadata(mcMMO.entityMetadataKey)) {
|
||||
event.getPigZombie().setMetadata(mcMMO.entityMetadataKey, mcMMO.metadataValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,456 +0,0 @@
|
||||
package com.gmail.nossr50.listeners;
|
||||
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.config.WorldBlacklist;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.runnables.player.PlayerUpdateInventoryTask;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.SubSkillType;
|
||||
import com.gmail.nossr50.core.skills.primary.alchemy.Alchemy;
|
||||
import com.gmail.nossr50.core.skills.primary.alchemy.AlchemyPotionBrewer;
|
||||
import com.gmail.nossr50.core.util.ItemUtils;
|
||||
import com.gmail.nossr50.core.util.Permissions;
|
||||
import com.gmail.nossr50.core.util.skills.SkillUtils;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.core.events.fake.FakeBrewEvent;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.block.BrewingStand;
|
||||
import org.bukkit.block.Furnace;
|
||||
import org.bukkit.entity.HumanEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.inventory.*;
|
||||
import org.bukkit.inventory.*;
|
||||
import org.bukkit.metadata.MetadataValue;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class InventoryListener implements Listener {
|
||||
private final mcMMO plugin;
|
||||
|
||||
public InventoryListener(final mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
public void onInventoryOpen(InventoryOpenEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory());
|
||||
|
||||
if (furnaceBlock == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
HumanEntity player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey) && furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() == 0)
|
||||
furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer((Player) player).getPlayerMetadata());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onInventoryClose(InventoryCloseEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory());
|
||||
|
||||
if (furnaceBlock == null || furnaceBlock.hasMetadata(mcMMO.furnaceMetadataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
HumanEntity player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, plugin);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceBurnEvent(FurnaceBurnEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
Block furnaceBlock = event.getBlock();
|
||||
BlockState furnaceState = furnaceBlock.getState();
|
||||
ItemStack smelting = furnaceState instanceof Furnace ? ((Furnace) furnaceState).getInventory().getSmelting() : null;
|
||||
|
||||
if (!ItemUtils.isSmeltable(smelting)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = getPlayerFromFurnace(furnaceBlock);
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !Permissions.isSubSkillEnabled(player, SubSkillType.SMELTING_FUEL_EFFICIENCY)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setBurnTime(UserManager.getPlayer(player).getSmeltingManager().fuelEfficiency(event.getBurnTime()));
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceSmeltEvent(FurnaceSmeltEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
Block furnaceBlock = event.getBlock();
|
||||
ItemStack smelting = event.getSource();
|
||||
|
||||
if (!ItemUtils.isSmeltable(smelting)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = getPlayerFromFurnace(furnaceBlock);
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.SMELTING.getPermissions(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setResult(UserManager.getPlayer(player).getSmeltingManager().smeltProcessing(smelting, event.getResult()));
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onFurnaceExtractEvent(FurnaceExtractEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Block furnaceBlock = event.getBlock();
|
||||
|
||||
if (!ItemUtils.isSmelted(new ItemStack(event.getItemType(), event.getItemAmount()))) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = getPlayerFromFurnace(furnaceBlock);
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !Permissions.vanillaXpBoost(player, PrimarySkillType.SMELTING)) {
|
||||
return;
|
||||
}
|
||||
|
||||
int exp = UserManager.getPlayer(player).getSmeltingManager().vanillaXPBoost(event.getExpToDrop());
|
||||
event.setExpToDrop(exp);
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onInventoryClickEventNormal(InventoryClickEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld()))
|
||||
return;
|
||||
|
||||
Inventory inventory = event.getInventory();
|
||||
|
||||
if (event.getWhoClicked() instanceof Player) {
|
||||
Player player = ((Player) event.getWhoClicked()).getPlayer();
|
||||
Block furnaceBlock = processInventoryOpenOrCloseEvent(event.getInventory());
|
||||
|
||||
if (furnaceBlock != null) {
|
||||
if (furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey).size() > 0)
|
||||
furnaceBlock.removeMetadata(mcMMO.furnaceMetadataKey, mcMMO.p);
|
||||
|
||||
furnaceBlock.setMetadata(mcMMO.furnaceMetadataKey, UserManager.getPlayer(player).getPlayerMetadata());
|
||||
}
|
||||
}
|
||||
|
||||
if (!(inventory instanceof BrewerInventory)) {
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryHolder holder = inventory.getHolder();
|
||||
|
||||
if (!(holder instanceof BrewingStand)) {
|
||||
return;
|
||||
}
|
||||
|
||||
HumanEntity whoClicked = event.getWhoClicked();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(event.getWhoClicked()) || !Permissions.isSubSkillEnabled(whoClicked, SubSkillType.ALCHEMY_CONCOCTIONS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) whoClicked;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
BrewingStand stand = (BrewingStand) holder;
|
||||
ItemStack clicked = event.getCurrentItem();
|
||||
ItemStack cursor = event.getCursor();
|
||||
|
||||
if ((clicked != null && (clicked.getType() == Material.POTION || clicked.getType() == Material.SPLASH_POTION || clicked.getType() == Material.LINGERING_POTION)) || (cursor != null && (cursor.getType() == Material.POTION || cursor.getType() == Material.SPLASH_POTION || cursor.getType() == Material.LINGERING_POTION))) {
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
return;
|
||||
}
|
||||
|
||||
ClickType click = event.getClick();
|
||||
InventoryType.SlotType slot = event.getSlotType();
|
||||
|
||||
if (click.isShiftClick()) {
|
||||
switch (slot) {
|
||||
case FUEL:
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
return;
|
||||
case CONTAINER:
|
||||
case QUICKBAR:
|
||||
if (!AlchemyPotionBrewer.isValidIngredient(player, clicked)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!AlchemyPotionBrewer.transferItems(event.getView(), event.getRawSlot(), click)) {
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
AlchemyPotionBrewer.scheduleUpdate(inventory);
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
return;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
} else if (slot == InventoryType.SlotType.FUEL) {
|
||||
boolean emptyClicked = AlchemyPotionBrewer.isEmpty(clicked);
|
||||
|
||||
if (AlchemyPotionBrewer.isEmpty(cursor)) {
|
||||
if (emptyClicked && click == ClickType.NUMBER_KEY) {
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
return;
|
||||
}
|
||||
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
} else if (emptyClicked) {
|
||||
if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) {
|
||||
int amount = cursor.getAmount();
|
||||
|
||||
if (click == ClickType.LEFT || (click == ClickType.RIGHT && amount == 1)) {
|
||||
event.setCancelled(true);
|
||||
event.setCurrentItem(cursor.clone());
|
||||
event.setCursor(null);
|
||||
|
||||
AlchemyPotionBrewer.scheduleUpdate(inventory);
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
} else if (click == ClickType.RIGHT) {
|
||||
event.setCancelled(true);
|
||||
|
||||
ItemStack one = cursor.clone();
|
||||
one.setAmount(1);
|
||||
|
||||
ItemStack rest = cursor.clone();
|
||||
rest.setAmount(amount - 1);
|
||||
|
||||
event.setCurrentItem(one);
|
||||
event.setCursor(rest);
|
||||
|
||||
AlchemyPotionBrewer.scheduleUpdate(inventory);
|
||||
AlchemyPotionBrewer.scheduleCheck(player, stand);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onInventoryDragEvent(InventoryDragEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld()))
|
||||
return;
|
||||
|
||||
Inventory inventory = event.getInventory();
|
||||
|
||||
if (!(inventory instanceof BrewerInventory)) {
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryHolder holder = inventory.getHolder();
|
||||
|
||||
if (!(holder instanceof BrewingStand)) {
|
||||
return;
|
||||
}
|
||||
|
||||
HumanEntity whoClicked = event.getWhoClicked();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(event.getWhoClicked()) || !Permissions.isSubSkillEnabled(whoClicked, SubSkillType.ALCHEMY_CONCOCTIONS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!event.getInventorySlots().contains(Alchemy.INGREDIENT_SLOT)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack cursor = event.getCursor();
|
||||
ItemStack ingredient = ((BrewerInventory) inventory).getIngredient();
|
||||
|
||||
if (AlchemyPotionBrewer.isEmpty(ingredient) || ingredient.isSimilar(cursor)) {
|
||||
Player player = (Player) whoClicked;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (AlchemyPotionBrewer.isValidIngredient(player, cursor)) {
|
||||
// Not handled: dragging custom ingredients over ingredient slot (does not trigger any event)
|
||||
AlchemyPotionBrewer.scheduleCheck(player, (BrewingStand) holder);
|
||||
return;
|
||||
}
|
||||
|
||||
event.setCancelled(true);
|
||||
AlchemyPotionBrewer.scheduleUpdate(inventory);
|
||||
}
|
||||
}
|
||||
|
||||
// Apparently sometimes vanilla brewing beats our task listener to the actual brew. We handle this by cancelling the vanilla event and finishing our brew ourselves.
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
public void onBrew(BrewEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
|
||||
return;
|
||||
|
||||
if (event instanceof FakeBrewEvent)
|
||||
return;
|
||||
Location location = event.getBlock().getLocation();
|
||||
if (Alchemy.brewingStandMap.containsKey(location)) {
|
||||
Alchemy.brewingStandMap.get(location).finishImmediately();
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onInventoryMoveItemEvent(InventoryMoveItemEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getSource().getLocation().getWorld()))
|
||||
return;
|
||||
|
||||
Inventory inventory = event.getDestination();
|
||||
|
||||
if (!(inventory instanceof BrewerInventory)) {
|
||||
return;
|
||||
}
|
||||
|
||||
InventoryHolder holder = inventory.getHolder();
|
||||
|
||||
if (!(holder instanceof BrewingStand)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack item = event.getItem();
|
||||
|
||||
if (MainConfig.getInstance().getPreventHopperTransferIngredients() && item.getType() != Material.POTION && item.getType() != Material.SPLASH_POTION && item.getType() != Material.LINGERING_POTION) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getPreventHopperTransferBottles() && (item.getType() == Material.POTION || item.getType() == Material.SPLASH_POTION || item.getType() == Material.LINGERING_POTION)) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getEnabledForHoppers() && AlchemyPotionBrewer.isValidIngredient(null, item)) {
|
||||
AlchemyPotionBrewer.scheduleCheck(null, (BrewingStand) holder);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onInventoryClickEvent(InventoryClickEvent event) {
|
||||
SkillUtils.removeAbilityBuff(event.getCurrentItem());
|
||||
if (event.getAction() == InventoryAction.HOTBAR_SWAP) {
|
||||
SkillUtils.removeAbilityBuff(event.getWhoClicked().getInventory().getItem(event.getHotbarButton()));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onInventoryOpenEvent(InventoryOpenEvent event) {
|
||||
SkillUtils.removeAbilityBuff(event.getPlayer().getInventory().getItemInMainHand());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onCraftItem(CraftItemEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getWhoClicked().getWorld()))
|
||||
return;
|
||||
|
||||
final HumanEntity whoClicked = event.getWhoClicked();
|
||||
|
||||
if (!whoClicked.hasMetadata(mcMMO.playerDataKey)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ItemStack result = event.getRecipe().getResult();
|
||||
|
||||
if (!ItemUtils.isMcMMOItem(result)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = (Player) whoClicked;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
new PlayerUpdateInventoryTask((Player) whoClicked).runTaskLater(plugin, 0);
|
||||
}
|
||||
|
||||
private Block processInventoryOpenOrCloseEvent(Inventory inventory) {
|
||||
if (!(inventory instanceof FurnaceInventory)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Furnace furnace = (Furnace) inventory.getHolder();
|
||||
|
||||
if (furnace == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return furnace.getBlock();
|
||||
}
|
||||
|
||||
private Player getPlayerFromFurnace(Block furnaceBlock) {
|
||||
List<MetadataValue> metadata = furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey);
|
||||
|
||||
if (metadata.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return plugin.getServer().getPlayerExact(metadata.get(0).asString());
|
||||
}
|
||||
}
|
||||
@@ -1,804 +0,0 @@
|
||||
package com.gmail.nossr50.listeners;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.core.chat.ChatManager;
|
||||
import com.gmail.nossr50.core.chat.ChatManagerFactory;
|
||||
import com.gmail.nossr50.core.chat.PartyChatManager;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.config.WorldBlacklist;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.chat.ChatMode;
|
||||
import com.gmail.nossr50.core.datatypes.party.Party;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.locale.LocaleLoader;
|
||||
import com.gmail.nossr50.core.party.ShareHandler;
|
||||
import com.gmail.nossr50.core.runnables.player.PlayerProfileLoadingTask;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.Salvage;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.SalvageManager;
|
||||
import com.gmail.nossr50.core.skills.primary.fishing.FishingManager;
|
||||
import com.gmail.nossr50.core.skills.primary.herbalism.HerbalismManager;
|
||||
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.Repair;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.RepairManager;
|
||||
import com.gmail.nossr50.core.skills.primary.taming.TamingManager;
|
||||
import com.gmail.nossr50.core.util.*;
|
||||
import com.gmail.nossr50.core.util.skills.SkillUtils;
|
||||
import com.gmail.nossr50.core.util.sounds.SoundManager;
|
||||
import com.gmail.nossr50.core.util.sounds.SoundType;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.gmail.nossr50.util.*;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.*;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.entity.PlayerDeathEvent;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
public class PlayerListener implements Listener {
|
||||
private final mcMMO plugin;
|
||||
|
||||
public PlayerListener(final mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerTeleportEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of setting the
|
||||
* player's last teleportation timestamp, in order to prevent
|
||||
* possible Acrobatics exploitation.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerTeleport(PlayerTeleportEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || MainConfig.getInstance().getXPAfterTeleportCooldown() <= 0 || event.getFrom().equals(event.getTo())) {
|
||||
return;
|
||||
}
|
||||
|
||||
UserManager.getPlayer(player).actualizeTeleportATS();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PlayerDeathEvents at the lowest priority.
|
||||
* <p>
|
||||
* These events are used to modify the death message of a player when
|
||||
* needed to correct issues potentially caused by the custom naming used
|
||||
* for mob healthbars.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
public void onPlayerDeathLowest(PlayerDeathEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
String deathMessage = event.getDeathMessage();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getEntity()))
|
||||
return;
|
||||
}
|
||||
|
||||
if (deathMessage == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getEntity();
|
||||
event.setDeathMessage(MobHealthbarUtils.fixDeathMessage(deathMessage, player));
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerDeathEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of dealing the penalties
|
||||
* associated with hardcore and vampirism modes. If neither of these
|
||||
* modes are enabled, or if the player who died has hardcore bypass
|
||||
* permissions, this handler does nothing.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerDeathMonitor(PlayerDeathEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
boolean statLossEnabled = HardcoreManager.isStatLossEnabled();
|
||||
boolean vampirismEnabled = HardcoreManager.isVampirismEnabled();
|
||||
|
||||
if (!statLossEnabled && !vampirismEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player killedPlayer = event.getEntity();
|
||||
|
||||
if (!killedPlayer.hasMetadata(mcMMO.playerDataKey) || Permissions.hardcoreBypass(killedPlayer)) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player killer = killedPlayer.getKiller();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(killedPlayer))
|
||||
return;
|
||||
}
|
||||
|
||||
if (statLossEnabled || (killer != null && vampirismEnabled)) {
|
||||
if (EventUtils.callPreDeathPenaltyEvent(killedPlayer).isCancelled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (killer != null && vampirismEnabled) {
|
||||
HardcoreManager.invokeVampirism(killer, killedPlayer);
|
||||
}
|
||||
|
||||
if (statLossEnabled) {
|
||||
HardcoreManager.invokeStatPenalty(killedPlayer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerChangedWorldEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of removing god mode or
|
||||
* player parties if they are not allowed on the world the player has
|
||||
* changed to.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerWorldChange(PlayerChangedWorldEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
mcMMOPlayer.checkGodMode();
|
||||
mcMMOPlayer.checkParty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerDropItemEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of flagging sharable
|
||||
* dropped items, as well as removing ability buffs from pickaxes
|
||||
* and shovels.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerDropItem(PlayerDropItemEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
|
||||
return;
|
||||
}
|
||||
|
||||
Item drop = event.getItemDrop();
|
||||
ItemStack dropStack = drop.getItemStack();
|
||||
|
||||
if (ItemUtils.isSharable(dropStack)) {
|
||||
drop.setMetadata(mcMMO.droppedItemKey, mcMMO.metadataValue);
|
||||
}
|
||||
|
||||
SkillUtils.removeAbilityBuff(dropStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PlayerFishEvents at the highest priority.
|
||||
* <p>
|
||||
* These events are used for the purpose of handling our anti-exploit
|
||||
* code, as well as dealing with ice fishing.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onPlayerFishHighest(PlayerFishEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
|
||||
|
||||
switch (event.getState()) {
|
||||
case CAUGHT_FISH:
|
||||
//TODO Update to new API once available! Waiting for case CAUGHT_TREASURE:
|
||||
Item fishingCatch = (Item) event.getCaught();
|
||||
|
||||
if (MainConfig.getInstance().getFishingOverrideTreasures() &&
|
||||
fishingCatch.getItemStack().getType() != Material.SALMON &&
|
||||
fishingCatch.getItemStack().getType() != Material.COD &&
|
||||
fishingCatch.getItemStack().getType() != Material.TROPICAL_FISH &&
|
||||
fishingCatch.getItemStack().getType() != Material.PUFFERFISH) {
|
||||
fishingCatch.setItemStack(new ItemStack(Material.SALMON, 1));
|
||||
}
|
||||
|
||||
if (Permissions.vanillaXpBoost(player, PrimarySkillType.FISHING)) {
|
||||
//Don't modify XP below vanilla values
|
||||
if (fishingManager.handleVanillaXpBoost(event.getExpToDrop()) > 1)
|
||||
event.setExpToDrop(fishingManager.handleVanillaXpBoost(event.getExpToDrop()));
|
||||
}
|
||||
return;
|
||||
|
||||
case IN_GROUND:
|
||||
Block block = player.getTargetBlock(null, 100);
|
||||
|
||||
if (fishingManager.canIceFish(block)) {
|
||||
|
||||
cancelFishingEventAndDropXp(event, player);
|
||||
|
||||
fishingManager.iceFishing(event.getHook(), block);
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
private void cancelFishingEventAndDropXp(PlayerFishEvent event, Player player) {
|
||||
event.setCancelled(true);
|
||||
ExperienceOrb experienceOrb = (ExperienceOrb) player.getWorld().spawnEntity(player.getEyeLocation(), EntityType.EXPERIENCE_ORB);
|
||||
experienceOrb.setExperience(event.getExpToDrop());
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerFishEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of handling the various
|
||||
* Fishing skills and abilities.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerFishMonitor(PlayerFishEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player) || !PrimarySkillType.FISHING.getPermissions(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
|
||||
|
||||
Entity caught = event.getCaught();
|
||||
//event.setExpToDrop(event.getExpToDrop()); //Redundant?
|
||||
|
||||
switch (event.getState()) {
|
||||
case FISHING:
|
||||
if (fishingManager.canMasterAngler()) {
|
||||
fishingManager.masterAngler(event.getHook());
|
||||
fishingManager.setFishingTarget();
|
||||
}
|
||||
return;
|
||||
|
||||
case CAUGHT_FISH:
|
||||
if (fishingManager.exploitPrevention(event.getHook().getBoundingBox()))
|
||||
return;
|
||||
fishingManager.handleFishing((Item) caught);
|
||||
fishingManager.setFishingTarget();
|
||||
return;
|
||||
|
||||
case CAUGHT_ENTITY:
|
||||
if (fishingManager.canShake(caught)) {
|
||||
fishingManager.shakeCheck((LivingEntity) caught);
|
||||
fishingManager.setFishingTarget();
|
||||
}
|
||||
return;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PlayerPickupItemEvents at the highest priority.
|
||||
* <p>
|
||||
* These events are used to handle item sharing between party members and
|
||||
* are also used to handle item pickup for the Unarmed skill.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||
public void onPlayerPickupItem(EntityPickupItemEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getEntity().getWorld()))
|
||||
return;
|
||||
|
||||
if (event.getEntity() instanceof Player) {
|
||||
Player player = (Player) event.getEntity();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
|
||||
Item drop = event.getItem();
|
||||
ItemStack dropStack = drop.getItemStack();
|
||||
|
||||
if (drop.hasMetadata(mcMMO.disarmedItemKey)) {
|
||||
if (!player.getName().equals(drop.getMetadata(mcMMO.disarmedItemKey).get(0).asString())) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (!drop.hasMetadata(mcMMO.droppedItemKey) && mcMMOPlayer.inParty() && ItemUtils.isSharable(dropStack)) {
|
||||
event.setCancelled(ShareHandler.handleItemShare(drop, mcMMOPlayer));
|
||||
|
||||
if (event.isCancelled()) {
|
||||
SoundManager.sendSound(player, player.getLocation(), SoundType.POP);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/*if (player.getInventory().getItemInMainHand().getType() == Material.AIR) {
|
||||
Unarmed.handleItemPickup(player, event);
|
||||
*//*boolean cancel = MainConfig.getInstance().getUnarmedItemPickupDisabled() || pickupSuccess;
|
||||
event.setCancelled(cancel);
|
||||
|
||||
if (pickupSuccess) {
|
||||
|
||||
return;
|
||||
}*//*
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerQuitEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of resetting player
|
||||
* variables and other garbage collection tasks that must take place when
|
||||
* a player exits the server.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
mcMMOPlayer.logout(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerJoinEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of initializing player
|
||||
* variables, as well as handling the MOTD display and other important
|
||||
* join messages.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (Misc.isNPCEntity(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
|
||||
|
||||
if (MainConfig.getInstance().getMOTDEnabled() && Permissions.motd(player)) {
|
||||
Motd.displayAll(player);
|
||||
}
|
||||
|
||||
if (plugin.isXPEventEnabled()) {
|
||||
player.sendMessage(LocaleLoader.getString("XPRate.Event", ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerRespawnEvents.
|
||||
* <p>
|
||||
* These events are monitored for the purpose of setting the
|
||||
* player's last respawn timestamp, in order to prevent
|
||||
* possible exploitation.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerRespawn(PlayerRespawnEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (!UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
UserManager.getPlayer(player).actualizeRespawnATS();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PlayerInteractEvents at the lowest priority.
|
||||
*
|
||||
* @param event The event to modify
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
|
||||
public void onPlayerInteractLowest(PlayerInteractEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
MiningManager miningManager = mcMMOPlayer.getMiningManager();
|
||||
Block block = event.getClickedBlock();
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
switch (event.getAction()) {
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
Material type = block.getType();
|
||||
|
||||
if (!MainConfig.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) {
|
||||
/* REPAIR CHECKS */
|
||||
if (type == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
|
||||
RepairManager repairManager = mcMMOPlayer.getRepairManager();
|
||||
event.setCancelled(true);
|
||||
|
||||
// Make sure the player knows what he's doing when trying to repair an enchanted item
|
||||
if (!(heldItem.getEnchantments().size() > 0) || repairManager.checkConfirmation(true)) {
|
||||
repairManager.handleRepair(heldItem);
|
||||
player.updateInventory();
|
||||
}
|
||||
}
|
||||
/* SALVAGE CHECKS */
|
||||
else if (type == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player) && mcMMO.getSalvageableManager().isSalvageable(heldItem)) {
|
||||
SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager();
|
||||
event.setCancelled(true);
|
||||
|
||||
// Make sure the player knows what he's doing when trying to salvage an enchanted item
|
||||
if (!(heldItem.getEnchantments().size() > 0) || salvageManager.checkConfirmation(true)) {
|
||||
SkillUtils.handleAbilitySpeedDecrease(player);
|
||||
salvageManager.handleSalvage(block.getLocation(), heldItem);
|
||||
player.updateInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
/* BLAST MINING CHECK */
|
||||
else if (miningManager.canDetonate()) {
|
||||
if (type == Material.TNT) {
|
||||
event.setCancelled(true); // Don't detonate the TNT if they're too close
|
||||
} else {
|
||||
miningManager.remoteDetonation();
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LEFT_CLICK_BLOCK:
|
||||
type = block.getType();
|
||||
|
||||
if (!MainConfig.getInstance().getAbilitiesOnlyActivateWhenSneaking() || player.isSneaking()) {
|
||||
/* REPAIR CHECKS */
|
||||
if (type == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player) && mcMMO.getRepairableManager().isRepairable(heldItem)) {
|
||||
RepairManager repairManager = mcMMOPlayer.getRepairManager();
|
||||
|
||||
// Cancel repairing an enchanted item
|
||||
if (repairManager.checkConfirmation(false)) {
|
||||
repairManager.setLastAnvilUse(0);
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Cancelled", LocaleLoader.getString("Repair.Pretty.Name")));
|
||||
}
|
||||
}
|
||||
/* SALVAGE CHECKS */
|
||||
else if (type == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player) && mcMMO.getSalvageableManager().isSalvageable(heldItem)) {
|
||||
SalvageManager salvageManager = mcMMOPlayer.getSalvageManager();
|
||||
|
||||
// Cancel salvaging an enchanted item
|
||||
if (salvageManager.checkConfirmation(false)) {
|
||||
salvageManager.setLastAnvilUse(0);
|
||||
player.sendMessage(LocaleLoader.getString("Skills.Cancelled", LocaleLoader.getString("Salvage.Pretty.Name")));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Monitor PlayerInteractEvents.
|
||||
*
|
||||
* @param event The event to monitor
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerInteractMonitor(PlayerInteractEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
Player player = event.getPlayer();
|
||||
|
||||
/* WORLD GUARD MAIN FLAG CHECK */
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasMainFlag(player))
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.getHand() != EquipmentSlot.HAND || !UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
ItemStack heldItem = player.getInventory().getItemInMainHand();
|
||||
|
||||
switch (event.getAction()) {
|
||||
case RIGHT_CLICK_BLOCK:
|
||||
if (player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
|
||||
break;
|
||||
}
|
||||
|
||||
Block block = event.getClickedBlock();
|
||||
BlockState blockState = block.getState();
|
||||
|
||||
/* ACTIVATION & ITEM CHECKS */
|
||||
if (BlockUtils.canActivateTools(blockState)) {
|
||||
if (MainConfig.getInstance().getAbilitiesEnabled()) {
|
||||
if (BlockUtils.canActivateHerbalism(blockState)) {
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM);
|
||||
}
|
||||
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.EXCAVATION);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.MINING);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.SWORDS);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.UNARMED);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.WOODCUTTING);
|
||||
}
|
||||
|
||||
ChimaeraWing.activationCheck(player);
|
||||
}
|
||||
|
||||
/* GREEN THUMB CHECK */
|
||||
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
|
||||
|
||||
if (heldItem.getType() == Material.BONE_MEAL) {
|
||||
switch (blockState.getType()) {
|
||||
case BEETROOTS:
|
||||
case CARROT:
|
||||
case COCOA:
|
||||
case WHEAT:
|
||||
case NETHER_WART_BLOCK:
|
||||
case POTATO:
|
||||
mcMMO.getPlaceStore().setFalse(blockState);
|
||||
}
|
||||
}
|
||||
|
||||
if (herbalismManager.canGreenThumbBlock(blockState)) {
|
||||
player.getInventory().setItemInMainHand(new ItemStack(Material.WHEAT_SEEDS, heldItem.getAmount() - 1));
|
||||
|
||||
if (herbalismManager.processGreenThumbBlocks(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
|
||||
blockState.update(true);
|
||||
}
|
||||
}
|
||||
|
||||
/* SHROOM THUMB CHECK */
|
||||
else if (herbalismManager.canUseShroomThumb(blockState)) {
|
||||
event.setCancelled(true);
|
||||
if (herbalismManager.processShroomThumb(blockState) && EventUtils.simulateBlockBreak(block, player, false)) {
|
||||
blockState.update(true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case RIGHT_CLICK_AIR:
|
||||
if (player.getInventory().getItemInOffHand().getType() != Material.AIR && !player.isInsideVehicle() && !player.isSneaking()) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* ACTIVATION CHECKS */
|
||||
if (MainConfig.getInstance().getAbilitiesEnabled()) {
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.AXES);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.EXCAVATION);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.HERBALISM);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.MINING);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.SWORDS);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.UNARMED);
|
||||
mcMMOPlayer.processAbilityActivation(PrimarySkillType.WOODCUTTING);
|
||||
}
|
||||
|
||||
/* ITEM CHECKS */
|
||||
ChimaeraWing.activationCheck(player);
|
||||
|
||||
/* BLAST MINING CHECK */
|
||||
MiningManager miningManager = mcMMOPlayer.getMiningManager();
|
||||
if (miningManager.canDetonate()) {
|
||||
miningManager.remoteDetonation();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case LEFT_CLICK_AIR:
|
||||
case LEFT_CLICK_BLOCK:
|
||||
|
||||
if (!player.isSneaking()) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* CALL OF THE WILD CHECKS */
|
||||
Material type = heldItem.getType();
|
||||
TamingManager tamingManager = mcMMOPlayer.getTamingManager();
|
||||
|
||||
if (type == MainConfig.getInstance().getTamingCOTWMaterial(EntityType.WOLF)) {
|
||||
tamingManager.summonWolf();
|
||||
} else if (type == MainConfig.getInstance().getTamingCOTWMaterial(EntityType.OCELOT)) {
|
||||
tamingManager.summonOcelot();
|
||||
} else if (type == MainConfig.getInstance().getTamingCOTWMaterial(EntityType.HORSE)) {
|
||||
tamingManager.summonHorse();
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle PlayerChatEvents at high priority.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true)
|
||||
public void onPlayerChat(AsyncPlayerChatEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
|
||||
if (Misc.isNPCEntity(player) || !UserManager.hasPlayerDataKey(player)) {
|
||||
return;
|
||||
}
|
||||
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getOfflinePlayer(player);
|
||||
|
||||
if (mcMMOPlayer == null) {
|
||||
mcMMO.p.debug(player.getName() + "is chatting, but is currently not logged in to the server.");
|
||||
mcMMO.p.debug("Party & Admin chat will not work properly for this player.");
|
||||
return;
|
||||
}
|
||||
|
||||
ChatManager chatManager = null;
|
||||
|
||||
if (mcMMOPlayer.isChatEnabled(ChatMode.PARTY)) {
|
||||
Party party = mcMMOPlayer.getParty();
|
||||
|
||||
if (party == null) {
|
||||
mcMMOPlayer.disableChat(ChatMode.PARTY);
|
||||
player.sendMessage(LocaleLoader.getString("Commands.Party.None"));
|
||||
return;
|
||||
}
|
||||
|
||||
chatManager = ChatManagerFactory.getChatManager(plugin, ChatMode.PARTY);
|
||||
((PartyChatManager) chatManager).setParty(party);
|
||||
} else if (mcMMOPlayer.isChatEnabled(ChatMode.ADMIN)) {
|
||||
chatManager = ChatManagerFactory.getChatManager(plugin, ChatMode.ADMIN);
|
||||
}
|
||||
|
||||
if (chatManager != null) {
|
||||
chatManager.handleChat(player, event.getMessage(), event.isAsynchronous());
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle "ugly" aliasing /skillname commands, since setAliases doesn't work.
|
||||
*
|
||||
* @param event The event to watch
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.LOWEST)
|
||||
public void onPlayerCommandPreprocess(PlayerCommandPreprocessEvent event) {
|
||||
if (!MainConfig.getInstance().getLocale().equalsIgnoreCase("en_US")) {
|
||||
String message = event.getMessage();
|
||||
String command = message.substring(1).split(" ")[0];
|
||||
String lowerCaseCommand = command.toLowerCase();
|
||||
|
||||
// Do these ACTUALLY have to be lower case to work properly?
|
||||
for (PrimarySkillType skill : PrimarySkillType.values()) {
|
||||
String skillName = skill.toString().toLowerCase();
|
||||
String localizedName = skill.getName().toLowerCase();
|
||||
|
||||
if (lowerCaseCommand.equals(localizedName)) {
|
||||
event.setMessage(message.replace(command, skillName));
|
||||
break;
|
||||
}
|
||||
|
||||
if (lowerCaseCommand.equals(skillName)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerStatisticIncrementEvent(PlayerStatisticIncrementEvent event) {
|
||||
/* WORLD BLACKLIST CHECK */
|
||||
if (WorldBlacklist.isWorldBlacklisted(event.getPlayer().getWorld()))
|
||||
return;
|
||||
|
||||
if (!mcMMO.getHolidayManager().isAprilFirst()) {
|
||||
return;
|
||||
}
|
||||
|
||||
mcMMO.getHolidayManager().handleStatisticEvent(event);
|
||||
}
|
||||
}
|
||||
@@ -1,133 +0,0 @@
|
||||
package com.gmail.nossr50.listeners;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.core.config.MainConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
|
||||
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
|
||||
import com.gmail.nossr50.core.events.experience.McMMOPlayerLevelUpEvent;
|
||||
import com.gmail.nossr50.core.events.experience.McMMOPlayerXpGainEvent;
|
||||
import com.gmail.nossr50.core.events.skills.abilities.McMMOPlayerAbilityActivateEvent;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
public class SelfListener implements Listener {
|
||||
//Used in task scheduling and other things
|
||||
private final mcMMO plugin;
|
||||
|
||||
public SelfListener(mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
PrimarySkillType skill = event.getSkill();
|
||||
|
||||
//Players can gain multiple levels especially during xprate events
|
||||
for (int i = 0; i < event.getLevelsGained(); i++) {
|
||||
int previousLevelGained = event.getSkillLevel() - i;
|
||||
//Send player skill unlock notifications
|
||||
UserManager.getPlayer(player).processUnlockNotifications(plugin, event.getSkill(), previousLevelGained);
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled())
|
||||
ScoreboardManager.handleLevelUp(player, skill);
|
||||
|
||||
if (!MainConfig.getInstance().getLevelUpEffectsEnabled()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ((event.getSkillLevel() % MainConfig.getInstance().getLevelUpEffectsTier()) == 0) {
|
||||
skill.celebrateLevelUp(player);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onPlayerXp(McMMOPlayerXpGainEvent event) {
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled())
|
||||
ScoreboardManager.handleXp(event.getPlayer(), event.getSkill());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
|
||||
public void onAbility(McMMOPlayerAbilityActivateEvent event) {
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled())
|
||||
ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill());
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
|
||||
public void onPlayerXpGain(McMMOPlayerXpGainEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
|
||||
PrimarySkillType primarySkillType = event.getSkill();
|
||||
|
||||
//WorldGuard XP Check
|
||||
if (event.getXpGainReason() == XPGainReason.PVE ||
|
||||
event.getXpGainReason() == XPGainReason.PVP ||
|
||||
event.getXpGainReason() == XPGainReason.SHARED_PVE ||
|
||||
event.getXpGainReason() == XPGainReason.SHARED_PVP) {
|
||||
if (WorldGuardUtils.isWorldGuardLoaded()) {
|
||||
if (!WorldGuardManager.getInstance().hasXPFlag(player)) {
|
||||
event.setRawXpGained(0);
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (event.getXpGainReason() == XPGainReason.COMMAND) {
|
||||
return;
|
||||
}
|
||||
|
||||
int threshold = ExperienceConfig.getInstance().getDiminishedReturnsThreshold(primarySkillType);
|
||||
|
||||
if (threshold <= 0 || !ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) {
|
||||
// Diminished returns is turned off
|
||||
return;
|
||||
}
|
||||
|
||||
final float rawXp = event.getRawXpGained();
|
||||
if (rawXp < 0) {
|
||||
// Don't calculate for XP subtraction
|
||||
return;
|
||||
}
|
||||
|
||||
if (primarySkillType.isChildSkill()) {
|
||||
return;
|
||||
}
|
||||
|
||||
float guaranteedMinimum = ExperienceConfig.getInstance().getDiminishedReturnsCap() * rawXp;
|
||||
|
||||
float modifiedThreshold = (float) (threshold / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier());
|
||||
float difference = (mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) - modifiedThreshold) / modifiedThreshold;
|
||||
|
||||
if (difference > 0) {
|
||||
// System.out.println("Total XP Earned: " + mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) + " / Threshold value: " + threshold);
|
||||
// System.out.println(difference * 100 + "% over the threshold!");
|
||||
// System.out.println("Previous: " + event.getRawXpGained());
|
||||
// System.out.println("Adjusted XP " + (event.getRawXpGained() - (event.getRawXpGained() * difference)));
|
||||
float newValue = rawXp - (rawXp * difference);
|
||||
|
||||
/*
|
||||
* Make sure players get a guaranteed minimum of XP
|
||||
*/
|
||||
//If there is no guaranteed minimum proceed, otherwise only proceed if newValue would be higher than our guaranteed minimum
|
||||
if (guaranteedMinimum <= 0 || newValue > guaranteedMinimum) {
|
||||
if (newValue > 0) {
|
||||
event.setRawXpGained(newValue);
|
||||
} else {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
} else {
|
||||
event.setRawXpGained(guaranteedMinimum);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,564 +0,0 @@
|
||||
package com.gmail.nossr50;
|
||||
|
||||
import com.gmail.nossr50.config.experience.ExperienceConfig;
|
||||
import com.gmail.nossr50.config.mods.ArmorConfigManager;
|
||||
import com.gmail.nossr50.config.mods.BlockConfigManager;
|
||||
import com.gmail.nossr50.config.mods.EntityConfigManager;
|
||||
import com.gmail.nossr50.config.mods.ToolConfigManager;
|
||||
import com.gmail.nossr50.config.skills.alchemy.PotionConfig;
|
||||
import com.gmail.nossr50.config.skills.repair.RepairConfigManager;
|
||||
import com.gmail.nossr50.config.skills.salvage.SalvageConfigManager;
|
||||
import com.gmail.nossr50.core.config.*;
|
||||
import com.gmail.nossr50.core.config.treasure.TreasureConfig;
|
||||
import com.gmail.nossr50.core.data.UserManager;
|
||||
import com.gmail.nossr50.core.data.blockmeta.chunkmeta.ChunkManager;
|
||||
import com.gmail.nossr50.core.data.blockmeta.chunkmeta.ChunkManagerFactory;
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManager;
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManagerFactory;
|
||||
import com.gmail.nossr50.core.party.PartyManager;
|
||||
import com.gmail.nossr50.core.runnables.CheckDateTask;
|
||||
import com.gmail.nossr50.core.runnables.SaveTimerTask;
|
||||
import com.gmail.nossr50.core.runnables.backups.CleanBackupsTask;
|
||||
import com.gmail.nossr50.core.runnables.database.UserPurgeTask;
|
||||
import com.gmail.nossr50.core.runnables.party.PartyAutoKickTask;
|
||||
import com.gmail.nossr50.core.runnables.player.ClearRegisteredXPGainTask;
|
||||
import com.gmail.nossr50.core.runnables.player.PlayerProfileLoadingTask;
|
||||
import com.gmail.nossr50.core.runnables.player.PowerLevelUpdatingTask;
|
||||
import com.gmail.nossr50.core.runnables.skills.BleedTimerTask;
|
||||
import com.gmail.nossr50.core.skills.PrimarySkillType;
|
||||
import com.gmail.nossr50.core.config.ChildConfig;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.salvageables.Salvageable;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.salvageables.SalvageableManager;
|
||||
import com.gmail.nossr50.core.skills.child.salvage.salvageables.SimpleSalvageableManager;
|
||||
import com.gmail.nossr50.core.skills.primary.alchemy.Alchemy;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.repairables.Repairable;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.repairables.RepairableManager;
|
||||
import com.gmail.nossr50.core.skills.primary.repair.repairables.SimpleRepairableManager;
|
||||
import com.gmail.nossr50.core.skills.subskills.acrobatics.Roll;
|
||||
import com.gmail.nossr50.core.util.*;
|
||||
import com.gmail.nossr50.core.util.commands.CommandRegistrationManager;
|
||||
import com.gmail.nossr50.core.util.experience.FormulaManager;
|
||||
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
|
||||
import com.gmail.nossr50.core.util.skills.RankUtils;
|
||||
import com.gmail.nossr50.core.util.upgrade.UpgradeManager;
|
||||
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
|
||||
import com.gmail.nossr50.listeners.*;
|
||||
import com.gmail.nossr50.util.*;
|
||||
import com.google.common.base.Charsets;
|
||||
import net.shatteredlands.shatt.backup.ZipLibrary;
|
||||
import org.bstats.bukkit.Metrics;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.metadata.FixedMetadataValue;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class mcMMO extends JavaPlugin {
|
||||
/* Metadata Values */
|
||||
public final static String entityMetadataKey = "mcMMO: Spawned Entity";
|
||||
public final static String blockMetadataKey = "mcMMO: Piston Tracking";
|
||||
public final static String furnaceMetadataKey = "mcMMO: Tracked Furnace";
|
||||
public final static String tntMetadataKey = "mcMMO: Tracked TNT";
|
||||
public final static String funfettiMetadataKey = "mcMMO: Funfetti";
|
||||
public final static String tntsafeMetadataKey = "mcMMO: Safe TNT";
|
||||
public final static String customNameKey = "mcMMO: Custom Name";
|
||||
public final static String customVisibleKey = "mcMMO: Name Visibility";
|
||||
public final static String droppedItemKey = "mcMMO: Tracked Item";
|
||||
public final static String infiniteArrowKey = "mcMMO: Infinite Arrow";
|
||||
public final static String bowForceKey = "mcMMO: Bow Force";
|
||||
public final static String arrowDistanceKey = "mcMMO: Arrow Distance";
|
||||
//public final static String customDamageKey = "mcMMO: Custom Damage";
|
||||
public final static String disarmedItemKey = "mcMMO: Disarmed Item";
|
||||
public final static String playerDataKey = "mcMMO: Player Data";
|
||||
public final static String greenThumbDataKey = "mcMMO: Green Thumb";
|
||||
public final static String databaseCommandKey = "mcMMO: Processing Database Command";
|
||||
public final static String bredMetadataKey = "mcMMO: Bred Animal";
|
||||
public static mcMMO p;
|
||||
// Jar Stuff
|
||||
public static File mcmmo;
|
||||
public static FixedMetadataValue metadataValue;
|
||||
/* Managers */
|
||||
private static ChunkManager placeStore;
|
||||
private static RepairableManager repairableManager;
|
||||
private static SalvageableManager salvageableManager;
|
||||
private static ModManager modManager;
|
||||
private static DatabaseManager databaseManager;
|
||||
private static FormulaManager formulaManager;
|
||||
private static HolidayManager holidayManager;
|
||||
private static UpgradeManager upgradeManager;
|
||||
/* Blacklist */
|
||||
private static WorldBlacklist worldBlacklist;
|
||||
/* File Paths */
|
||||
private static String mainDirectory;
|
||||
private static String flatFileDirectory;
|
||||
private static String usersFile;
|
||||
private static String modDirectory;
|
||||
/* Plugin Checks */
|
||||
private static boolean healthBarPluginEnabled;
|
||||
private static boolean isRetroModeEnabled;
|
||||
// MainConfig Validation Check
|
||||
public boolean noErrorsInConfigFiles = true;
|
||||
// XP Event Check
|
||||
private boolean xpEventEnabled;
|
||||
|
||||
public static String getMainDirectory() {
|
||||
return mainDirectory;
|
||||
}
|
||||
|
||||
public static String getFlatFileDirectory() {
|
||||
return flatFileDirectory;
|
||||
}
|
||||
|
||||
public static String getUsersFilePath() {
|
||||
return usersFile;
|
||||
}
|
||||
|
||||
public static String getModDirectory() {
|
||||
return modDirectory;
|
||||
}
|
||||
|
||||
public static FormulaManager getFormulaManager() {
|
||||
return formulaManager;
|
||||
}
|
||||
|
||||
public static HolidayManager getHolidayManager() {
|
||||
return holidayManager;
|
||||
}
|
||||
|
||||
public static ChunkManager getPlaceStore() {
|
||||
return placeStore;
|
||||
}
|
||||
|
||||
public static RepairableManager getRepairableManager() {
|
||||
return repairableManager;
|
||||
}
|
||||
|
||||
public static SalvageableManager getSalvageableManager() {
|
||||
return salvageableManager;
|
||||
}
|
||||
|
||||
public static DatabaseManager getDatabaseManager() {
|
||||
return databaseManager;
|
||||
}
|
||||
|
||||
@Deprecated
|
||||
public static void setDatabaseManager(DatabaseManager databaseManager) {
|
||||
mcMMO.databaseManager = databaseManager;
|
||||
}
|
||||
|
||||
public static ModManager getModManager() {
|
||||
return modManager;
|
||||
}
|
||||
|
||||
public static UpgradeManager getUpgradeManager() {
|
||||
return upgradeManager;
|
||||
}
|
||||
|
||||
public static boolean isHealthBarPluginEnabled() {
|
||||
return healthBarPluginEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if this plugin is using retro mode
|
||||
* Retro mode is a 0-1000 skill system
|
||||
* Standard mode is scaled for 1-100
|
||||
*
|
||||
* @return true if retro mode is enabled
|
||||
*/
|
||||
public static boolean isRetroModeEnabled() {
|
||||
return isRetroModeEnabled;
|
||||
}
|
||||
|
||||
public static WorldBlacklist getWorldBlacklist() {
|
||||
return worldBlacklist;
|
||||
}
|
||||
|
||||
/**
|
||||
* Things to be run when the plugin is enabled.
|
||||
*/
|
||||
@Override
|
||||
public void onEnable() {
|
||||
try {
|
||||
p = this;
|
||||
getLogger().setFilter(new LogFilter(this));
|
||||
metadataValue = new FixedMetadataValue(this, true);
|
||||
|
||||
PluginManager pluginManager = getServer().getPluginManager();
|
||||
healthBarPluginEnabled = pluginManager.getPlugin("HealthBar") != null;
|
||||
|
||||
upgradeManager = new UpgradeManager();
|
||||
|
||||
setupFilePaths();
|
||||
|
||||
modManager = new ModManager();
|
||||
|
||||
loadConfigFiles();
|
||||
|
||||
if (!noErrorsInConfigFiles) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Store this value so other plugins can check it
|
||||
isRetroModeEnabled = MainConfig.getInstance().getIsRetroMode();
|
||||
|
||||
if (getServer().getName().equals("Cauldron") || getServer().getName().equals("MCPC+")) {
|
||||
checkModConfigs();
|
||||
}
|
||||
|
||||
if (healthBarPluginEnabled) {
|
||||
getLogger().info("HealthBar plugin found, mcMMO's healthbars are automatically disabled.");
|
||||
}
|
||||
|
||||
if (pluginManager.getPlugin("NoCheatPlus") != null && pluginManager.getPlugin("CompatNoCheatPlus") == null) {
|
||||
getLogger().warning("NoCheatPlus plugin found, but CompatNoCheatPlus was not found!");
|
||||
getLogger().warning("mcMMO will not work properly alongside NoCheatPlus without CompatNoCheatPlus");
|
||||
}
|
||||
|
||||
databaseManager = DatabaseManagerFactory.getDatabaseManager();
|
||||
|
||||
registerEvents();
|
||||
registerCoreSkills();
|
||||
registerCustomRecipes();
|
||||
|
||||
PartyManager.loadParties();
|
||||
|
||||
formulaManager = new FormulaManager();
|
||||
holidayManager = new HolidayManager();
|
||||
|
||||
for (Player player : getServer().getOnlinePlayers()) {
|
||||
new PlayerProfileLoadingTask(player).runTaskLaterAsynchronously(mcMMO.p, 1); // 1 Tick delay to ensure the player is marked as online before we begin loading
|
||||
}
|
||||
|
||||
debug("Version " + getDescription().getVersion() + " is enabled!");
|
||||
|
||||
scheduleTasks();
|
||||
CommandRegistrationManager.registerCommands();
|
||||
|
||||
placeStore = ChunkManagerFactory.getChunkManager(); // Get our ChunkletManager
|
||||
|
||||
if (MainConfig.getInstance().getPTPCommandWorldPermissions()) {
|
||||
Permissions.generateWorldTeleportPermissions();
|
||||
}
|
||||
|
||||
//Populate Ranked Skill Maps (DO THIS LAST)
|
||||
RankUtils.populateRanks();
|
||||
|
||||
//If anonymous statistics are enabled then use them
|
||||
|
||||
Metrics metrics;
|
||||
|
||||
if (MainConfig.getInstance().getIsMetricsEnabled()) {
|
||||
metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("version", () -> getDescription().getVersion()));
|
||||
|
||||
if (MainConfig.getInstance().getIsRetroMode())
|
||||
metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Standard"));
|
||||
else
|
||||
metrics.addCustomChart(new Metrics.SimplePie("scaling", () -> "Retro"));
|
||||
}
|
||||
} catch (Throwable t) {
|
||||
getLogger().severe("There was an error while enabling mcMMO!");
|
||||
|
||||
if (!(t instanceof ExceptionInInitializerError)) {
|
||||
t.printStackTrace();
|
||||
} else {
|
||||
getLogger().info("Please do not replace the mcMMO jar while the server is running.");
|
||||
}
|
||||
|
||||
getServer().getPluginManager().disablePlugin(this);
|
||||
}
|
||||
|
||||
//Init the blacklist
|
||||
worldBlacklist = new WorldBlacklist(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLoad() {
|
||||
if (getServer().getPluginManager().getPlugin("WorldGuard") != null)
|
||||
WorldGuardManager.getInstance().registerFlags();
|
||||
}
|
||||
|
||||
/**
|
||||
* Things to be run when the plugin is disabled.
|
||||
*/
|
||||
@Override
|
||||
public void onDisable() {
|
||||
try {
|
||||
Alchemy.finishAllBrews(); // Finish all partially complete AlchemyBrewTasks to prevent vanilla brewing continuation on restart
|
||||
UserManager.saveAll(); // Make sure to save player information if the server shuts down
|
||||
UserManager.clearAll();
|
||||
PartyManager.saveParties(); // Save our parties
|
||||
|
||||
//TODO: Needed?
|
||||
if (MainConfig.getInstance().getScoreboardsEnabled())
|
||||
ScoreboardManager.teardownAll();
|
||||
|
||||
formulaManager.saveFormula();
|
||||
holidayManager.saveAnniversaryFiles();
|
||||
placeStore.saveAll(); // Save our metadata
|
||||
placeStore.cleanUp(); // Cleanup empty metadata stores
|
||||
} catch (NullPointerException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
debug("Canceling all tasks...");
|
||||
getServer().getScheduler().cancelTasks(this); // This removes our tasks
|
||||
debug("Unregister all events...");
|
||||
HandlerList.unregisterAll(this); // Cancel event registrations
|
||||
|
||||
if (MainConfig.getInstance().getBackupsEnabled()) {
|
||||
// Remove other tasks BEFORE starting the Backup, or we just cancel it straight away.
|
||||
try {
|
||||
ZipLibrary.mcMMOBackup();
|
||||
} catch (IOException e) {
|
||||
getLogger().severe(e.toString());
|
||||
} catch (Throwable e) {
|
||||
if (e instanceof NoClassDefFoundError) {
|
||||
getLogger().severe("Backup class not found!");
|
||||
getLogger().info("Please do not replace the mcMMO jar while the server is running.");
|
||||
} else {
|
||||
getLogger().severe(e.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
databaseManager.onDisable();
|
||||
debug("Was disabled."); // How informative!
|
||||
}
|
||||
|
||||
public boolean isXPEventEnabled() {
|
||||
return xpEventEnabled;
|
||||
}
|
||||
|
||||
public void setXPEventEnabled(boolean enabled) {
|
||||
this.xpEventEnabled = enabled;
|
||||
}
|
||||
|
||||
public void toggleXpEventEnabled() {
|
||||
xpEventEnabled = !xpEventEnabled;
|
||||
}
|
||||
|
||||
public void debug(String message) {
|
||||
getLogger().info("[Debug] " + message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup the various storage file paths
|
||||
*/
|
||||
private void setupFilePaths() {
|
||||
mcmmo = getFile();
|
||||
mainDirectory = getDataFolder().getPath() + File.separator;
|
||||
flatFileDirectory = mainDirectory + "flatfile" + File.separator;
|
||||
usersFile = flatFileDirectory + "mcmmo.users";
|
||||
modDirectory = mainDirectory + "mods" + File.separator;
|
||||
fixFilePaths();
|
||||
}
|
||||
|
||||
private void fixFilePaths() {
|
||||
File oldFlatfilePath = new File(mainDirectory + "FlatFileStuff" + File.separator);
|
||||
File oldModPath = new File(mainDirectory + "ModConfigs" + File.separator);
|
||||
|
||||
if (oldFlatfilePath.exists()) {
|
||||
if (!oldFlatfilePath.renameTo(new File(flatFileDirectory))) {
|
||||
getLogger().warning("Failed to rename FlatFileStuff to flatfile!");
|
||||
}
|
||||
}
|
||||
|
||||
if (oldModPath.exists()) {
|
||||
if (!oldModPath.renameTo(new File(modDirectory))) {
|
||||
getLogger().warning("Failed to rename ModConfigs to mods!");
|
||||
}
|
||||
}
|
||||
|
||||
File oldArmorFile = new File(modDirectory + "armor.yml");
|
||||
File oldBlocksFile = new File(modDirectory + "blocks.yml");
|
||||
File oldEntitiesFile = new File(modDirectory + "entities.yml");
|
||||
File oldToolsFile = new File(modDirectory + "tools.yml");
|
||||
|
||||
if (oldArmorFile.exists()) {
|
||||
if (!oldArmorFile.renameTo(new File(modDirectory + "armor.default.yml"))) {
|
||||
getLogger().warning("Failed to rename armor.yml to armor.default.yml!");
|
||||
}
|
||||
}
|
||||
|
||||
if (oldBlocksFile.exists()) {
|
||||
if (!oldBlocksFile.renameTo(new File(modDirectory + "blocks.default.yml"))) {
|
||||
getLogger().warning("Failed to rename blocks.yml to blocks.default.yml!");
|
||||
}
|
||||
}
|
||||
|
||||
if (oldEntitiesFile.exists()) {
|
||||
if (!oldEntitiesFile.renameTo(new File(modDirectory + "entities.default.yml"))) {
|
||||
getLogger().warning("Failed to rename entities.yml to entities.default.yml!");
|
||||
}
|
||||
}
|
||||
|
||||
if (oldToolsFile.exists()) {
|
||||
if (!oldToolsFile.renameTo(new File(modDirectory + "tools.default.yml"))) {
|
||||
getLogger().warning("Failed to rename tools.yml to tools.default.yml!");
|
||||
}
|
||||
}
|
||||
|
||||
File currentFlatfilePath = new File(flatFileDirectory);
|
||||
currentFlatfilePath.mkdirs();
|
||||
}
|
||||
|
||||
private void loadConfigFiles() {
|
||||
// Force the loading of config files
|
||||
TreasureConfig.getInstance();
|
||||
ChunkConversionOptions.getInstance();
|
||||
AdvancedConfig.getInstance();
|
||||
PotionConfig.getInstance();
|
||||
CoreSkillsConfig.getInstance();
|
||||
SoundConfig.getInstance();
|
||||
RankConfig.getInstance();
|
||||
|
||||
new ChildConfig();
|
||||
|
||||
List<Repairable> repairables = new ArrayList<Repairable>();
|
||||
List<Salvageable> salvageables = new ArrayList<Salvageable>();
|
||||
|
||||
if (MainConfig.getInstance().getToolModsEnabled()) {
|
||||
new ToolConfigManager(this);
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getArmorModsEnabled()) {
|
||||
new ArmorConfigManager(this);
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getBlockModsEnabled()) {
|
||||
new BlockConfigManager(this);
|
||||
}
|
||||
|
||||
if (MainConfig.getInstance().getEntityModsEnabled()) {
|
||||
new EntityConfigManager(this);
|
||||
}
|
||||
|
||||
// Load repair configs, make manager, and register them at this time
|
||||
repairables.addAll(new RepairConfigManager(this).getLoadedRepairables());
|
||||
repairables.addAll(modManager.getLoadedRepairables());
|
||||
repairableManager = new SimpleRepairableManager(repairables.size());
|
||||
repairableManager.registerRepairables(repairables);
|
||||
|
||||
// Load salvage configs, make manager and register them at this time
|
||||
SalvageConfigManager sManager = new SalvageConfigManager(this);
|
||||
salvageables.addAll(sManager.getLoadedSalvageables());
|
||||
salvageableManager = new SimpleSalvageableManager(salvageables.size());
|
||||
salvageableManager.registerSalvageables(salvageables);
|
||||
}
|
||||
|
||||
private void registerEvents() {
|
||||
PluginManager pluginManager = getServer().getPluginManager();
|
||||
|
||||
// Register events
|
||||
pluginManager.registerEvents(new PlayerListener(this), this);
|
||||
pluginManager.registerEvents(new BlockListener(this), this);
|
||||
pluginManager.registerEvents(new EntityListener(this), this);
|
||||
pluginManager.registerEvents(new InventoryListener(this), this);
|
||||
pluginManager.registerEvents(new SelfListener(this), this);
|
||||
pluginManager.registerEvents(new WorldListener(this), this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers core skills
|
||||
* This enables the skills in the new skill system
|
||||
*/
|
||||
private void registerCoreSkills() {
|
||||
/*
|
||||
* Acrobatics skills
|
||||
*/
|
||||
|
||||
if (CoreSkillsConfig.getInstance().isPrimarySkillEnabled(PrimarySkillType.ACROBATICS)) {
|
||||
System.out.println("[mcMMO]" + " enabling Acrobatics Skills");
|
||||
|
||||
//TODO: Should do this differently
|
||||
Roll roll = new Roll();
|
||||
CoreSkillsConfig.getInstance().isSkillEnabled(roll);
|
||||
InteractionManager.registerSubSkill(new Roll());
|
||||
}
|
||||
}
|
||||
|
||||
private void registerCustomRecipes() {
|
||||
getServer().getScheduler().scheduleSyncDelayedTask(this, () -> {
|
||||
if (MainConfig.getInstance().getChimaeraEnabled()) {
|
||||
getServer().addRecipe(ChimaeraWing.getChimaeraWingRecipe());
|
||||
}
|
||||
}, 40);
|
||||
}
|
||||
|
||||
private void scheduleTasks() {
|
||||
// Periodic save timer (Saves every 10 minutes by default)
|
||||
long saveIntervalTicks = MainConfig.getInstance().getSaveInterval() * 1200;
|
||||
new SaveTimerTask().runTaskTimer(this, saveIntervalTicks, saveIntervalTicks);
|
||||
|
||||
// Cleanup the backups folder
|
||||
new CleanBackupsTask().runTaskAsynchronously(mcMMO.p);
|
||||
|
||||
// Bleed timer (Runs every 0.5 seconds)
|
||||
new BleedTimerTask().runTaskTimer(this, 1 * Misc.TICK_CONVERSION_FACTOR, 1 * (Misc.TICK_CONVERSION_FACTOR / 2));
|
||||
|
||||
// Old & Powerless User remover
|
||||
long purgeIntervalTicks = MainConfig.getInstance().getPurgeInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
|
||||
|
||||
if (purgeIntervalTicks == 0) {
|
||||
new UserPurgeTask().runTaskLaterAsynchronously(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
|
||||
} else if (purgeIntervalTicks > 0) {
|
||||
new UserPurgeTask().runTaskTimerAsynchronously(this, purgeIntervalTicks, purgeIntervalTicks);
|
||||
}
|
||||
|
||||
// Automatically remove old members from parties
|
||||
long kickIntervalTicks = MainConfig.getInstance().getAutoPartyKickInterval() * 60L * 60L * Misc.TICK_CONVERSION_FACTOR;
|
||||
|
||||
if (kickIntervalTicks == 0) {
|
||||
new PartyAutoKickTask().runTaskLater(this, 2 * Misc.TICK_CONVERSION_FACTOR); // Start 2 seconds after startup.
|
||||
} else if (kickIntervalTicks > 0) {
|
||||
new PartyAutoKickTask().runTaskTimer(this, kickIntervalTicks, kickIntervalTicks);
|
||||
}
|
||||
|
||||
// Update power level tag scoreboards
|
||||
new PowerLevelUpdatingTask().runTaskTimer(this, 2 * Misc.TICK_CONVERSION_FACTOR, 2 * Misc.TICK_CONVERSION_FACTOR);
|
||||
|
||||
if (getHolidayManager().nearingAprilFirst()) {
|
||||
new CheckDateTask().runTaskTimer(this, 10L * Misc.TICK_CONVERSION_FACTOR, 1L * 60L * 60L * Misc.TICK_CONVERSION_FACTOR);
|
||||
}
|
||||
|
||||
// Clear the registered XP data so players can earn XP again
|
||||
if (ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) {
|
||||
new ClearRegisteredXPGainTask().runTaskTimer(this, 60, 60);
|
||||
}
|
||||
}
|
||||
|
||||
private void checkModConfigs() {
|
||||
if (!MainConfig.getInstance().getToolModsEnabled()) {
|
||||
getLogger().warning("Cauldron implementation found, but the custom tool config for mcMMO is disabled!");
|
||||
getLogger().info("To enable, set Mods.Tool_Mods_Enabled to TRUE in config.yml.");
|
||||
}
|
||||
|
||||
if (!MainConfig.getInstance().getArmorModsEnabled()) {
|
||||
getLogger().warning("Cauldron implementation found, but the custom armor config for mcMMO is disabled!");
|
||||
getLogger().info("To enable, set Mods.Armor_Mods_Enabled to TRUE in config.yml.");
|
||||
}
|
||||
|
||||
if (!MainConfig.getInstance().getBlockModsEnabled()) {
|
||||
getLogger().warning("Cauldron implementation found, but the custom block config for mcMMO is disabled!");
|
||||
getLogger().info("To enable, set Mods.Block_Mods_Enabled to TRUE in config.yml.");
|
||||
}
|
||||
|
||||
if (!MainConfig.getInstance().getEntityModsEnabled()) {
|
||||
getLogger().warning("Cauldron implementation found, but the custom entity config for mcMMO is disabled!");
|
||||
getLogger().info("To enable, set Mods.Entity_Mods_Enabled to TRUE in config.yml.");
|
||||
}
|
||||
}
|
||||
|
||||
public InputStreamReader getResourceAsReader(String fileName) {
|
||||
InputStream in = getResource(fileName);
|
||||
return in == null ? null : new InputStreamReader(in, Charsets.UTF_8);
|
||||
}
|
||||
}
|
||||
@@ -1,624 +0,0 @@
|
||||
package util.java.mcMMO;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.potion.PotionData;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.potion.PotionType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
public class PotionConfigGenerator {
|
||||
|
||||
public static void main(String[] args) {
|
||||
Map<WriteablePotion, Map<Ingredient, WriteablePotion>> vanillaPotions = new HashMap<>();
|
||||
populateVanillaPotions(vanillaPotions);
|
||||
Map<WriteablePotion, Map<Ingredient, WriteablePotion>> mcMMOPotions = new HashMap<>();
|
||||
populateCustomPotions(mcMMOPotions);
|
||||
List<WriteablePotion> sorted = new ArrayList<>();
|
||||
sorted.addAll(vanillaPotions.keySet());
|
||||
sorted.addAll(mcMMOPotions.keySet());
|
||||
sorted.sort((a, b) -> {
|
||||
// All normal potions first
|
||||
if (a.mat == Material.POTION && b.mat != Material.POTION) {
|
||||
return -1;
|
||||
}
|
||||
if (b.mat == Material.POTION && a.mat != Material.POTION) {
|
||||
return 1;
|
||||
}
|
||||
// All splash potions second
|
||||
if (a.mat == Material.SPLASH_POTION && b.mat != Material.SPLASH_POTION) {
|
||||
return -1;
|
||||
}
|
||||
if (b.mat == Material.SPLASH_POTION && a.mat != Material.SPLASH_POTION) {
|
||||
return 1;
|
||||
}
|
||||
// Vanilla Potions first
|
||||
if (a.effect == null && b.effect != null) {
|
||||
return -1;
|
||||
}
|
||||
if (b.effect == null && a.effect != null) {
|
||||
return 1;
|
||||
}
|
||||
// Vanilla potions
|
||||
if (a.effect == null && b.effect == null) {
|
||||
// Order by PotionType
|
||||
if (a.data.getType() != b.data.getType()) {
|
||||
return Integer.compare(a.data.getType().ordinal(), b.data.getType().ordinal());
|
||||
}
|
||||
// Plain before extended or upgraded
|
||||
if (!a.data.isExtended() && !a.data.isUpgraded() && (b.data.isExtended() || b.data.isUpgraded())) {
|
||||
return -1;
|
||||
}
|
||||
if (!b.data.isExtended() && !b.data.isUpgraded() && (a.data.isExtended() || a.data.isUpgraded())) {
|
||||
return 1;
|
||||
}
|
||||
// Extended before Upgraded
|
||||
if (a.data.isExtended() && b.data.isUpgraded()) {
|
||||
return -1;
|
||||
}
|
||||
if (b.data.isExtended() && a.data.isUpgraded()) {
|
||||
return -1;
|
||||
}
|
||||
// Same potion somehow?
|
||||
return 0;
|
||||
}
|
||||
// mcMMO Potions
|
||||
else {
|
||||
if ((a.baseName.contains("II") || a.baseName.contains("EXTENDED")) && !(b.baseName.contains("II") || b.baseName.contains("EXTENDED"))) {
|
||||
return 1;
|
||||
}
|
||||
if ((b.baseName.contains("II") || b.baseName.contains("EXTENDED")) && !(a.baseName.contains("II") || a.baseName.contains("EXTENDED"))) {
|
||||
return -1;
|
||||
}
|
||||
if (!a.baseName.contains("II") && b.baseName.contains("II")) {
|
||||
return -1;
|
||||
}
|
||||
if (!b.baseName.contains("II") && a.baseName.contains("II")) {
|
||||
return 1;
|
||||
}
|
||||
return a.baseName.split("_")[0].compareTo(b.baseName.split("_")[0]);
|
||||
}
|
||||
});
|
||||
for (WriteablePotion potion : sorted) {
|
||||
System.out.println(" " + potion.name + ":");
|
||||
Map<Ingredient, WriteablePotion> children;
|
||||
if (vanillaPotions.containsKey(potion)) {
|
||||
children = vanillaPotions.get(potion);
|
||||
} else {
|
||||
System.out.println(" Name: " + prettify(potion.name));
|
||||
children = mcMMOPotions.get(potion);
|
||||
}
|
||||
System.out.println(" Material: " + potion.mat.name());
|
||||
System.out.println(" PotionData:");
|
||||
System.out.println(" PotionType: " + potion.data.getType().name());
|
||||
if (potion.data.isExtended()) {
|
||||
System.out.println(" Extended: true");
|
||||
}
|
||||
if (potion.data.isUpgraded()) {
|
||||
System.out.println(" Upgraded: true");
|
||||
}
|
||||
if (potion.effect != null) {
|
||||
System.out.println(" Effects: [\"" + getName(potion.effect.getType()) + " " + potion.effect.getAmplifier() + " " + potion.effect.getDuration() + "\"]");
|
||||
}
|
||||
if (children == null || children.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
System.out.println(" Children:");
|
||||
for (Entry<Ingredient, WriteablePotion> child : children.entrySet()) {
|
||||
System.out.println(" " + child.getKey().name + ": " + child.getValue().name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String prettify(String name) {
|
||||
String[] substrings = name.split("_");
|
||||
String prettyString = "";
|
||||
int size = 1;
|
||||
|
||||
for (String string : substrings) {
|
||||
prettyString = prettyString.concat(getCapitalized(string));
|
||||
|
||||
if (size < substrings.length) {
|
||||
prettyString = prettyString.concat(" ");
|
||||
}
|
||||
|
||||
size++;
|
||||
}
|
||||
|
||||
return prettyString;
|
||||
}
|
||||
|
||||
public static String getCapitalized(String target) {
|
||||
if (target.equals("II")) { // hacks
|
||||
return target;
|
||||
}
|
||||
return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase();
|
||||
}
|
||||
|
||||
private static String getName(PotionEffectType type) {
|
||||
switch (type.getId()) {
|
||||
case 1:
|
||||
return "SPEED";
|
||||
case 2:
|
||||
return "SLOW";
|
||||
case 3:
|
||||
return "FAST_DIGGING";
|
||||
case 4:
|
||||
return "SLOW_DIGGING";
|
||||
case 5:
|
||||
return "INCREASE_DAMAGE";
|
||||
case 6:
|
||||
return "HEAL";
|
||||
case 7:
|
||||
return "HARM";
|
||||
case 8:
|
||||
return "JUMP";
|
||||
case 9:
|
||||
return "CONFUSION";
|
||||
case 10:
|
||||
return "REGENERATION";
|
||||
case 11:
|
||||
return "DAMAGE_RESISTANCE";
|
||||
case 12:
|
||||
return "FIRE_RESISTANCE";
|
||||
case 13:
|
||||
return "WATER_BREATHING";
|
||||
case 14:
|
||||
return "INVISIBILITY";
|
||||
case 15:
|
||||
return "BLINDNESS";
|
||||
case 16:
|
||||
return "NIGHT_VISION";
|
||||
case 17:
|
||||
return "HUNGER";
|
||||
case 18:
|
||||
return "WEAKNESS";
|
||||
case 19:
|
||||
return "POISON";
|
||||
case 20:
|
||||
return "WITHER";
|
||||
case 21:
|
||||
return "HEALTH_BOOST";
|
||||
case 22:
|
||||
return "ABSORPTION";
|
||||
case 23:
|
||||
return "SATURATION";
|
||||
case 24:
|
||||
return "GLOWING";
|
||||
case 25:
|
||||
return "LEVITATION";
|
||||
case 26:
|
||||
return "LUCK";
|
||||
case 27:
|
||||
return "UNLUCK";
|
||||
case 28:
|
||||
return "SLOW_FALLING";
|
||||
case 29:
|
||||
return "CONDUIT_POWER";
|
||||
case 30:
|
||||
return "DOLPHINS_GRACE";
|
||||
default:
|
||||
return "UNKNOWN_EFFECT_TYPE_" + type.getId();
|
||||
}
|
||||
}
|
||||
|
||||
private static void populateVanillaPotions(Map<WriteablePotion, Map<Ingredient, WriteablePotion>> vanillaPotions) {
|
||||
for (PotionType type : PotionType.values()) {
|
||||
for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) {
|
||||
WriteablePotion data = new WriteablePotion(material, type);
|
||||
HashMap<Ingredient, WriteablePotion> children = new HashMap<>();
|
||||
getChildren(data, children);
|
||||
vanillaPotions.put(data, children);
|
||||
if (type.isExtendable()) {
|
||||
data = new WriteablePotion(material, new PotionData(type, true, false));
|
||||
children = new HashMap<>();
|
||||
getChildren(data, children);
|
||||
vanillaPotions.put(data, children);
|
||||
}
|
||||
if (type.isUpgradeable()) {
|
||||
data = new WriteablePotion(material, new PotionData(type, false, true));
|
||||
children = new HashMap<>();
|
||||
getChildren(data, children);
|
||||
vanillaPotions.put(data, children);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (Entry<WriteablePotion, Map<Ingredient, WriteablePotion>> entry : vanillaPotions.entrySet()) {
|
||||
if (entry.getKey().mat == Material.POTION) {
|
||||
entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data));
|
||||
}
|
||||
if (entry.getKey().mat == Material.SPLASH_POTION) {
|
||||
entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void getChildren(WriteablePotion current, HashMap<Ingredient, WriteablePotion> children) {
|
||||
switch (current.data.getType()) {
|
||||
case WATER:
|
||||
assert (!current.data.isExtended());
|
||||
assert (!current.data.isUpgraded());
|
||||
children.put(new Ingredient(Material.NETHER_WART), new WriteablePotion(current.mat, PotionType.AWKWARD));
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.WEAKNESS));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, PotionType.THICK));
|
||||
children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.SUGAR), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(current.mat, PotionType.MUNDANE));
|
||||
return;
|
||||
case AWKWARD:
|
||||
assert (!current.data.isExtended());
|
||||
assert (!current.data.isUpgraded());
|
||||
children.put(new Ingredient(Material.GOLDEN_CARROT), new WriteablePotion(current.mat, PotionType.NIGHT_VISION));
|
||||
children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(current.mat, PotionType.JUMP));
|
||||
children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(current.mat, PotionType.FIRE_RESISTANCE));
|
||||
children.put(new Ingredient(Material.SUGAR), new WriteablePotion(current.mat, PotionType.SPEED));
|
||||
children.put(new Ingredient(Material.PUFFERFISH), new WriteablePotion(current.mat, PotionType.WATER_BREATHING));
|
||||
children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(current.mat, PotionType.INSTANT_HEAL));
|
||||
children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(current.mat, PotionType.POISON));
|
||||
children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(current.mat, PotionType.REGEN));
|
||||
children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(current.mat, PotionType.STRENGTH));
|
||||
children.put(new Ingredient(Material.TURTLE_HELMET), new WriteablePotion(current.mat, PotionType.TURTLE_MASTER));
|
||||
children.put(new Ingredient(Material.PHANTOM_MEMBRANE), new WriteablePotion(current.mat, PotionType.SLOW_FALLING));
|
||||
// mcMMO custom potions
|
||||
double mod = 1;
|
||||
if (current.mat == Material.SPLASH_POTION) {
|
||||
mod = 0.75;
|
||||
}
|
||||
if (current.mat == Material.LINGERING_POTION) {
|
||||
mod = 0.25;
|
||||
}
|
||||
children.put(new Ingredient(Material.BROWN_MUSHROOM), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA"));
|
||||
children.put(new Ingredient(Material.CARROT), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE"));
|
||||
children.put(new Ingredient(Material.SLIME_BALL), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS"));
|
||||
children.put(new Ingredient(Material.GOLDEN_APPLE), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE"));
|
||||
children.put(new Ingredient(Material.INK_SAC), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS"));
|
||||
children.put(new Ingredient(Material.ROTTEN_FLESH), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER"));
|
||||
children.put(new Ingredient(Material.POISONOUS_POTATO), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY"));
|
||||
children.put(new Ingredient(Material.QUARTZ), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION"));
|
||||
children.put(new Ingredient(Material.FERN), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION"));
|
||||
children.put(new Ingredient(Material.APPLE), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST"));
|
||||
return;
|
||||
case FIRE_RESISTANCE:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.SLOWNESS, true, false)));
|
||||
} else {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case INSTANT_DAMAGE:
|
||||
assert (!current.data.isExtended());
|
||||
if (!current.data.isUpgraded()) {
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
}
|
||||
return;
|
||||
case INSTANT_HEAL:
|
||||
assert (!current.data.isExtended());
|
||||
if (!current.data.isUpgraded()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
} else {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true)));
|
||||
}
|
||||
return;
|
||||
case INVISIBILITY:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case JUMP:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case NIGHT_VISION:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INVISIBILITY));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
} else {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INVISIBILITY, true, false)));
|
||||
}
|
||||
return;
|
||||
case POISON:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
} else {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true)));
|
||||
}
|
||||
return;
|
||||
case REGEN:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case SLOWNESS:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case SLOW_FALLING:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case SPEED:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
} else {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.SLOWNESS, true, false)));
|
||||
}
|
||||
return;
|
||||
case STRENGTH:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case TURTLE_MASTER:
|
||||
if (!current.data.isUpgraded() && !current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case WATER_BREATHING:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case WEAKNESS:
|
||||
assert (!current.data.isUpgraded());
|
||||
if (!current.data.isExtended()) {
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
|
||||
}
|
||||
return;
|
||||
case LUCK:
|
||||
case MUNDANE:
|
||||
case THICK:
|
||||
case UNCRAFTABLE:
|
||||
assert (!current.data.isExtended());
|
||||
assert (!current.data.isUpgraded());
|
||||
return;
|
||||
default:
|
||||
assert (false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static void populateCustomPotions(Map<WriteablePotion, Map<Ingredient, WriteablePotion>> mcMMOPotions) {
|
||||
for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) {
|
||||
WriteablePotion data;
|
||||
double mod = 1;
|
||||
if (material == Material.SPLASH_POTION) {
|
||||
mod = 0.75;
|
||||
}
|
||||
if (material == Material.LINGERING_POTION) {
|
||||
mod = 0.25;
|
||||
}
|
||||
HashMap<Ingredient, WriteablePotion> children;
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST");
|
||||
children = new HashMap<>();
|
||||
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
|
||||
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
|
||||
for (WriteablePotion child : children.values()) {
|
||||
mcMMOPotions.put(child, new HashMap<>());
|
||||
}
|
||||
mcMMOPotions.put(data, children);
|
||||
}
|
||||
|
||||
// Add all material state changes
|
||||
for (Entry<WriteablePotion, Map<Ingredient, WriteablePotion>> entry : mcMMOPotions.entrySet()) {
|
||||
if (entry.getKey().mat == Material.POTION) {
|
||||
PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.75), entry.getKey().effect.getAmplifier());
|
||||
entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data, effect, entry.getKey().baseName));
|
||||
} else if (entry.getKey().mat == Material.SPLASH_POTION) {
|
||||
PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.33), entry.getKey().effect.getAmplifier());
|
||||
entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data, effect, entry.getKey().baseName));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Ingredient {
|
||||
|
||||
public Material mat;
|
||||
public int data;
|
||||
public String name;
|
||||
|
||||
public Ingredient(Material mat) {
|
||||
this.mat = mat;
|
||||
this.data = 0;
|
||||
name = mat.name();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class WriteablePotion {
|
||||
|
||||
public String name;
|
||||
public Material mat;
|
||||
public PotionData data;
|
||||
public PotionEffect effect;
|
||||
public String baseName;
|
||||
|
||||
public WriteablePotion(PotionData data) {
|
||||
this(Material.POTION, data);
|
||||
}
|
||||
|
||||
public WriteablePotion(Material type, PotionData data) {
|
||||
this(type, data, null, getMCName(data.getType()));
|
||||
}
|
||||
|
||||
public WriteablePotion(Material mat, PotionType type, PotionEffect effect, String baseName) {
|
||||
this(mat, new PotionData(type, false, false), effect, baseName);
|
||||
}
|
||||
|
||||
public WriteablePotion(Material type, PotionData data, PotionEffect effect, String baseName) {
|
||||
this.data = data;
|
||||
this.effect = effect;
|
||||
this.mat = type;
|
||||
this.baseName = baseName;
|
||||
this.name = "POTION_OF_" + baseName;
|
||||
if (mat == Material.SPLASH_POTION) {
|
||||
this.name = "SPLASH_" + this.name;
|
||||
}
|
||||
if (mat == Material.LINGERING_POTION) {
|
||||
this.name = "LINGERING_" + this.name;
|
||||
}
|
||||
if (data.isExtended()) {
|
||||
this.name += "_EXTENDED";
|
||||
}
|
||||
if (data.isUpgraded()) {
|
||||
this.name += "_II";
|
||||
}
|
||||
}
|
||||
|
||||
public WriteablePotion(PotionType type) {
|
||||
this(new PotionData(type, false, false));
|
||||
}
|
||||
|
||||
public WriteablePotion(Material mat, PotionType type) {
|
||||
this(mat, new PotionData(type, false, false));
|
||||
}
|
||||
|
||||
private static String getMCName(PotionType type) {
|
||||
switch (type) {
|
||||
case INSTANT_DAMAGE:
|
||||
return "HARMING";
|
||||
case INSTANT_HEAL:
|
||||
return "HEALING";
|
||||
case JUMP:
|
||||
return "LEAPING";
|
||||
case REGEN:
|
||||
return "REGENERATION";
|
||||
case SPEED:
|
||||
return "SWIFTNESS";
|
||||
case UNCRAFTABLE:
|
||||
return "EMPTY";
|
||||
case LUCK:
|
||||
case MUNDANE:
|
||||
case NIGHT_VISION:
|
||||
case POISON:
|
||||
case INVISIBILITY:
|
||||
case SLOWNESS:
|
||||
case AWKWARD:
|
||||
case STRENGTH:
|
||||
case THICK:
|
||||
case FIRE_RESISTANCE:
|
||||
case WATER:
|
||||
case WATER_BREATHING:
|
||||
case WEAKNESS:
|
||||
case TURTLE_MASTER:
|
||||
case SLOW_FALLING:
|
||||
return type.name();
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return name.hashCode();
|
||||
}
|
||||
|
||||
public boolean equals(Object obj) {
|
||||
if (!(obj instanceof WriteablePotion)) {
|
||||
return false;
|
||||
}
|
||||
return name.equals(((WriteablePotion) obj).name);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
#
|
||||
# mcMMO child skill configuration
|
||||
# Last updated on ${project.version}-b${BUILD_NUMBER}
|
||||
#
|
||||
# You do not need to modify this file except to change parents of child skills
|
||||
#
|
||||
# If you wish a child skill to be the parent of another child skill, you must also make your changes to the child.yml within the jar
|
||||
# WARNING: THIS IS NOT SUPPORTED, IF YOU DO SO YOU ARE RESPONSIBLE FOR THE ISSUES THAT MAY ARISE. That said, watch out for circular dependencies, those are bad.
|
||||
#
|
||||
#####
|
||||
Salvage:
|
||||
- Fishing
|
||||
- Repair
|
||||
Smelting:
|
||||
- Mining
|
||||
- Repair
|
||||
@@ -1,19 +0,0 @@
|
||||
#
|
||||
# WARNING: THIS CONFIG IS FOR ADVANCED USERS ONLY.
|
||||
# You will need to reset any values in this config every time you update mcMMO
|
||||
###
|
||||
Options:
|
||||
# true to use Chunklets metadata store system, false to disable
|
||||
Chunklets: true
|
||||
# Square root of the number of chunks to convert per tick.
|
||||
ConversionRate: 1
|
||||
# true to use enchantment buffs for Super Breaker & Giga Drill Breaker, false to use potion buffs
|
||||
EnchantmentBuffs: true
|
||||
|
||||
# Amount of users to convert every interval
|
||||
UUIDConvertAmount: 100
|
||||
# Amount of users to be converted at a time before waiting MojangLimitPeriod milliseconds to begin again
|
||||
# This setting is for large servers to avoid being temp banned from mojang api
|
||||
MojangRateLimit: 300
|
||||
# Amount of time to wait after hitting the MojangRateLimit in UUID conversion
|
||||
MojangLimitPeriod: 6000
|
||||
@@ -1,96 +0,0 @@
|
||||
#
|
||||
# ItemStack Weights configuration
|
||||
#
|
||||
# This file is used to determine the value of an item. This will only
|
||||
# happen when users are sharing items in a party using the EQUAL item share mode.
|
||||
#
|
||||
# Rare items should have a higher value than common items. If an item is not listed
|
||||
# here, the value from "Default" will be used instead.
|
||||
#
|
||||
#####
|
||||
Item_Weights:
|
||||
Default: 5
|
||||
Quartz: 200
|
||||
Nether_Quartz_Ore: 200
|
||||
Emerald: 150
|
||||
Emerald_Ore: 150
|
||||
Diamond: 100
|
||||
Diamond_Ore: 100
|
||||
Gold_Ingot: 50
|
||||
Gold_Ore: 50
|
||||
Iron_Ingot: 40
|
||||
Iron_Ore: 40
|
||||
Lapis_Ore: 30
|
||||
Redstone: 30
|
||||
Redstone_Ore: 30
|
||||
Glowstone_Dust: 20
|
||||
Coal: 10
|
||||
Coal_Ore: 10
|
||||
|
||||
# ItemStack weights for armor and tools
|
||||
Diamond_Sword: 150
|
||||
Diamond_Shovel: 150
|
||||
Diamond_Pickaxe: 150
|
||||
Diamond_Axe: 150
|
||||
Diamond_Helmet: 150
|
||||
Diamond_Chestplate: 150
|
||||
Diamond_Leggings: 150
|
||||
Diamond_Boots: 150
|
||||
Golden_Sword: 75
|
||||
Golden_Shovel: 75
|
||||
Golden_Pickaxe: 75
|
||||
Golden_Axe: 75
|
||||
Golden_Helmet: 75
|
||||
Golden_Chestplate: 75
|
||||
Golden_Leggings: 75
|
||||
Golden_Boots: 75
|
||||
Iron_Sword: 60
|
||||
Iron_Shovel: 60
|
||||
Iron_Pickaxe: 60
|
||||
Iron_Axe: 60
|
||||
Iron_Helmet: 60
|
||||
Iron_Chestplate: 60
|
||||
Iron_Leggings: 60
|
||||
Iron_Boots: 60
|
||||
|
||||
# Items in this section will get added to the Misc share category.
|
||||
# Case insensitive, though the name must be exactly the same as set in the Bukkit Material enum.
|
||||
Party_Shareables:
|
||||
Misc_Items:
|
||||
- Diamond_Sword
|
||||
- Diamond_Shovel
|
||||
- Diamond_Pickaxe
|
||||
- Diamond_Axe
|
||||
- Golden_Sword
|
||||
- Golden_Shovel
|
||||
- Golden_Pickaxe
|
||||
- Golden_Axe
|
||||
- Iron_Sword
|
||||
- Iron_Shovel
|
||||
- Iron_Pickaxe
|
||||
- Iron_Axe
|
||||
- Stone_Sword
|
||||
- Stone_Shovel
|
||||
- Stone_Pickaxe
|
||||
- Stone_Axe
|
||||
- Wooden_Sword
|
||||
- Wooden_Shovel
|
||||
- Wooden_Pickaxe
|
||||
- Wooden_Axe
|
||||
- Bow
|
||||
- Diamond_Helmet
|
||||
- Diamond_Chestplate
|
||||
- Diamond_Leggings
|
||||
- Diamond_Boots
|
||||
- Golden_Helmet
|
||||
- Golden_Chestplate
|
||||
- Golden_Leggings
|
||||
- Golden_Boots
|
||||
- Iron_Helmet
|
||||
- Iron_Chestplate
|
||||
- Iron_Leggings
|
||||
- Iron_Boots
|
||||
- Leather_Helmet
|
||||
- Leather_Chestplate
|
||||
- Leather_Leggings
|
||||
- Leather_Boots
|
||||
@@ -1,938 +0,0 @@
|
||||
# de locale file v0.1
|
||||
# -----------------
|
||||
# Setting up a new standard for string names, for easier localization.
|
||||
# SkillName.SubType.LocalEffect.Increment
|
||||
# Skill name, such as ACROBATICS, MINING.
|
||||
# Sub-type, such as EFFECT, ABILITY, COMBAT.
|
||||
# Local Effect, local text for Skill Name; ACROBATICS_ROLL, IGNITIONTIME,GRACECHANCE.
|
||||
# Increment, for multi-line or array-like lists.
|
||||
# ######
|
||||
#
|
||||
# EXAMPLES:
|
||||
#
|
||||
# Acrobatics.Ability.Proc
|
||||
# Axes.Ability.Refresh.1
|
||||
#
|
||||
#Changelog to locale_de:
|
||||
#-Added Alchemy Skill
|
||||
#-Added Archery Effect 3
|
||||
#-Added Axes.Combat.SS.Struck
|
||||
#-Added multiple Fishing-Skill translations
|
||||
#-Added multiple Herbalism-Skill translations
|
||||
#-Added Mining.Blast.Effect
|
||||
#-Salvage aus Repair herausgenommen
|
||||
#-Added missing Swords.Effect skills
|
||||
#-Added horses and holy hound to taming
|
||||
#-Added Unarmed.SubSkillType.IronGrip.Description
|
||||
#-Added Smelting
|
||||
#Commands.addlevels
|
||||
#Everything except parties translated to German
|
||||
#Giga Bohrhammer in Giga Bohrer umbenannt.
|
||||
#Added Guides.Smelting.Section.1
|
||||
# --Lumis31
|
||||
#ACROBATICS
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**Grazi\u00f6s Abgerollt**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Ausgewichen**
|
||||
Acrobatics.DodgeChance=Ausweich-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.Name=Rolle
|
||||
Acrobatics.SubSkill.Roll.Description=Reduziert oder negiert Fall-Schaden
|
||||
Acrobatics.SubSkill.GracefulRoll.Name=Grazi\u00f6se Rolle
|
||||
Acrobatics.SubSkill.GracefulRoll.Description=Doppelte Effektivit\u00e4t der Rolle
|
||||
Acrobatics.SubSkill.Dodge.Name=Ausweichen
|
||||
Acrobatics.SubSkill.Dodge.Description=Halbiert Angriffschaden
|
||||
Acrobatics.Listener=Akrobatik:
|
||||
Acrobatics.SubSkill.Roll.Chance=Rolle-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.GraceChance=Grazi\u00f6se Rolle-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.Roll.Text=**Abgerollt**
|
||||
Acrobatics.SkillName=AKROBATIK
|
||||
Acrobatics.Skillup=Akrobatik Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ALCHEMY
|
||||
Alchemy.SubSkill.Catalysis.Name=Katalyse
|
||||
Alchemy.SubSkill.Catalysis.Description=Erh\u00F6ht die Braugeschwindigkeit
|
||||
Alchemy.SubSkill.Concoctions.Name=Braukunst
|
||||
Alchemy.SubSkill.Concoctions.Description=Braue Tr\u00E4nke mit mehr Zutaten
|
||||
Alchemy.Listener=Alchemie:
|
||||
Alchemy.Ability.Locked.0=GESPERRT bis Skill {0}+ (KATALYSE)
|
||||
Alchemy.Catalysis.Speed=Braugeschwindigkeit: [[YELLOW]]{0}
|
||||
Alchemy.Concoctions.Rank=Braukunst Rang: [[YELLOW]]{0}/{1}
|
||||
Alchemy.Concoctions.Ingredients=Zutaten [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
|
||||
Alchemy.SkillName=ALCHEMIE
|
||||
Alchemy.Skillup=Alchemie Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ARCHERY
|
||||
Archery.Combat.DazeChance=Chance auf Bet\u00e4ubung: [[YELLOW]]{0}
|
||||
Archery.Combat.RetrieveChance=Chance auf Pfeil-R\u00fcckgewinnung: [[YELLOW]]{0}
|
||||
Archery.Combat.SkillshotBonus=Kunstschuss Zusatzschaden: [[YELLOW]]{0}
|
||||
Archery.SubSkill.SkillShot.Name=Kunstschuss
|
||||
Archery.SubSkill.SkillShot.Description=Erh\u00f6ht Schaden vom Bogen
|
||||
Archery.SubSkill.Daze.Name=Bet\u00e4ubung (Spieler)
|
||||
Archery.SubSkill.Daze.Description=Verwirrt Feinde und f\u00FCgt {0} Schaden zu
|
||||
Archery.SubSkill.ArrowRetrieval.Name=Pfeil-R\u00fcckgewinnung
|
||||
Archery.SubSkill.ArrowRetrieval.Description=Chance auf Pfeil-R\u00fcckgewinnung von Leichen
|
||||
Archery.Listener=Bogen:
|
||||
Archery.SkillName=BOGEN
|
||||
Archery.Skillup=Bogenschie\u00DFen Fertigkeit ist um {0} gestiegen. Gesamt ({1})
|
||||
#AXES
|
||||
Axes.Ability.Bonus.0=Axt-Beherrschung
|
||||
Axes.Ability.Bonus.1={0} Zusatz-Schaden
|
||||
Axes.Ability.Bonus.2=Wucht
|
||||
Axes.Ability.Bonus.3=Verursacht {0} Zusatz-Schaden gegen R\u00fcstung
|
||||
Axes.Ability.Bonus.4=Wucht-Schlag
|
||||
Axes.Ability.Bonus.5=Verursacht {0} Zusatz-Schaden gegen ungepanzerte Feinde
|
||||
Axes.Ability.Lower=[[GRAY]]**Du senkst deine Axt**
|
||||
Axes.Ability.Ready=[[GREEN]]**Deine Axt ist bereit**
|
||||
Axes.Combat.CritStruck=[[DARK_RED]]Du wurdest KRITISCH getroffen!
|
||||
Axes.Combat.CritChance=Chance auf kritischen Treffer: [[YELLOW]]{0}
|
||||
Axes.Combat.CriticalHit=KRITISCHER TREFFER!
|
||||
Axes.Combat.GI.Proc=[[GREEN]]**AUSGESCHALTET durch GEWALT SCHLAG**
|
||||
Axes.Combat.GI.Struck=**Von WUCHT-SCHLAG getroffen**
|
||||
Axes.Combat.SS.Struck=[[DARK_RED]]vom Sch\u00E4delspalter getroffen!
|
||||
Axes.Combat.SS.Length=Sch\u00e4del-Spalter Dauer: [[YELLOW]]{0}s
|
||||
Axes.SubSkill.SkullSplitter.Name=Sch\u00e4del-Spalter (F\u00e4higkeit)
|
||||
Axes.SubSkill.SkullSplitter.Description=Verursacht Umgebungsschaden
|
||||
Axes.SubSkill.CriticalStrikes.Name=Kritische Treffer
|
||||
Axes.SubSkill.CriticalStrikes.Description=Doppelter Schaden
|
||||
Axes.SubSkill.AxeMastery.Name=Axt-Beherrschung
|
||||
Axes.SubSkill.AxeMastery.Description=Verursacht Bonus-Schaden
|
||||
Axes.SubSkill.ArmorImpact.Name=Wucht
|
||||
Axes.SubSkill.ArmorImpact.Description=Treffe mit gen\u00fcgend Gewalt zum R\u00fcstung zerschmettern
|
||||
Axes.SubSkill.GreaterImpact.Name=Wucht-Schlag
|
||||
Axes.SubSkill.GreaterImpact.Description=Zusatz-Schaden gegen ungepanzerte Feinde
|
||||
Axes.Listener=Axt:
|
||||
Axes.SkillName=AXT
|
||||
Axes.Skills.SS.Off=**Sch\u00e4del-Spalter abgenutzt**
|
||||
Axes.Skills.SS.On=[[GREEN]]**Sch\u00e4del-Spalter AKTIVIERT**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]Dein [[YELLOW]]Sch\u00e4del-Spalter [[GREEN]]ist wieder bereit!
|
||||
Axes.Skills.SS.Other.Off={0}s [[RED]]Sch\u00e4del-Spalter[[GREEN]] ist [[GREEN]]abgenutzt
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Sch\u00e4del-Spalter!
|
||||
Axes.Skillup=Axt Skill um {0} gestiegen. Gesamt ({1})
|
||||
#EXCAVATION
|
||||
Excavation.Ability.Lower=[[GRAY]]**Du senkst deine SCHAUFEL**
|
||||
Excavation.Ability.Ready=[[GREEN]]**Deine SCHAUFEL ist bereit**
|
||||
Excavation.SubSkill.GigaDrillBreaker.Name=Giga Bohrhammer (F\u00e4higkeit)
|
||||
Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Geschwindigkeit
|
||||
Excavation.SubSkill.TreasureHunter.Name=Schatz-J\u00e4ger
|
||||
Excavation.SubSkill.TreasureHunter.Description=F\u00e4higkeit nach Sch\u00e4tzen zu graben
|
||||
Excavation.Effect.Length=Giga Bohrhammer Dauer: [[YELLOW]]{0}s
|
||||
Excavation.Listener=Graben:
|
||||
Excavation.SkillName=GRABEN
|
||||
Excavation.Skills.GigaDrillBreaker.Off=**Giga Bohrer ausgelaufen**
|
||||
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**Giga Bohrer AKTIVIERT**
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Dein [[YELLOW]]Giga Bohrer [[GREEN]]ist wieder bereit!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.Off={0}s [[RED]]Giga Bohrer[[GREEN]] ist [[GREEN]]ausgelaufen
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Giga Bohrer!
|
||||
Excavation.Skillup=Graben Skill um {0} gestiegen. Gesamt ({1})
|
||||
#FISHING
|
||||
Fishing.Ability.Chance=Anbei\u00DFwahrscheinlichkeit: [[YELLOW]]{0}
|
||||
Fishing.Ability.Info=Zauber-J\u00e4ger: [[GRAY]] **Verbessert sich mit Schatz-J\u00e4ger Rang**
|
||||
Fishing.Ability.Locked.0=GESPERRT bis Skill {0}+ (Rei\u00DFen)
|
||||
Fishing.Ability.Locked.1=GESPERRT bis Skill {0}+ (Eisangeln)
|
||||
Fishing.Ability.Locked.2=GESPERRT bis Skill {0}+ (Profiangel)
|
||||
Fishing.Ability.Rank=Schatz-J\u00e4ger Rang: [[YELLOW]]{0}/{1}
|
||||
Fishing.Ability.TH.DropRate=Drop Rate: [[DARK_RED]]Falle: [[YELLOW]]{0} [[GRAY]]Oft: [[YELLOW]]{1} [[GREEN]]Gelegentlich: [[YELLOW]]{2}\n[[BLUE]]Au\u00DFergew\u00F6hnlich: [[YELLOW]]{3} [[LIGHT_PURPLE]]Selten: [[YELLOW]]{4} [[GOLD]]Schatz: [[YELLOW]]{5} [[AQUA]]Schallplatte: [[YELLOW]]{6}
|
||||
Fishing.Ability.TH.MagicRate=Zauber-J\u00e4ger Chance: [[YELLOW]]{0}
|
||||
Fishing.Ability.Shake=Rei\u00DFen-Chance: [[YELLOW]]{0}
|
||||
Fishing.Ability.IceFishing=Eisangeln: Angeln im Eis
|
||||
Fishing.Ability.FD=Fischer-Mahlzeit Rang: [[YELLOW]]{0}
|
||||
Fishing.SubSkill.TreasureHunter.Name=Schatz-J\u00e4ger (Passiv)
|
||||
Fishing.SubSkill.TreasureHunter.Description=Angle verschiedene Objekte
|
||||
Fishing.SubSkill.MagicHunter.Name=Zauber-J\u00e4ger
|
||||
Fishing.SubSkill.MagicHunter.Description=Finde verzauberte Gegenst\u00e4nde
|
||||
Fishing.SubSkill.Shake.Name=Rei\u00DFen
|
||||
Fishing.SubSkill.Shake.Description=Rei\u00DFe per Angel Gegenst\u00e4nde aus den Mobs
|
||||
Fishing.SubSkill.FishermansDiet.Name=Fischer-Mahlzeit
|
||||
Fishing.SubSkill.FishermansDiet.Description=Verbessert Effizienz von geangelter Nahrung
|
||||
Fishing.SubSkill.MasterAngler.Name=Profiangel
|
||||
Fishing.SubSkill.MasterAngler.Description=Erh\u00F6ht die Chance des Anbei\u00DFens
|
||||
Fishing.SubSkill.IceFishing.Name=Eisangeln
|
||||
Fishing.SubSkill.IceFishing.Description=Erm\u00F6glicht dir in Eisbiomen angeln zu gehen
|
||||
Fishing.Chance.Raining=[[BLUE]] Regen Bonus
|
||||
Fishing.Listener=Angeln:
|
||||
Fishing.Ability.TH.MagicFound=[[AQUA]]Dich ber\u00fchrt ein leichter Zauber bei diesem Fang...
|
||||
Fishing.Ability.TH.Boom=[[GRAY]]KARPADOR SETZT PLATSCHER EIN!!!
|
||||
Fishing.Ability.TH.Poison=[[GRAY]]Hier stinkt etwas...
|
||||
Fishing.SkillName=ANGELN
|
||||
Fishing.Skillup=Angel Skill um {0} gestiegen. Gesamt ({1})
|
||||
#HERBALISM
|
||||
Herbalism.Ability.DoubleDropChance=Chance auf Doppel-Drops: [[YELLOW]]{0}
|
||||
Herbalism.Ability.FD=Bauernfr\u00fchst\u00fcck: [[YELLOW]]Stufe {0}
|
||||
Herbalism.Ability.GTe.Length=Gr\u00fcnes Land Dauer: [[YELLOW]]{0}s
|
||||
Herbalism.Ability.GTe.NeedMore=Du brauchst mehr Samen um Gr\u00FCnes Land zu verbreiten.
|
||||
Herbalism.Ability.GTh.Chance=Gr\u00fcner Daumen Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.GTh.Fail=**Gr\u00fcner Daumen GESCHEITERT**
|
||||
Herbalism.Ability.GTh.Stage=Gr\u00fcner Daumen Stufe: [[YELLOW]] Weizen w\u00e4chst auf Stufe {0}
|
||||
Herbalism.Ability.GTh=[[GREEN]]**GR\u00dcNER DAUMEN**
|
||||
Herbalism.Ability.HylianLuck=Hylians Gl\u00fccks Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.Lower=[[GRAY]]**Du senkst deine HARKE**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**Deine HARKE ist bereit**
|
||||
Herbalism.Ability.ShroomThumb.Chance=Gr\u00FCne Zehe Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.ShroomThumb.Fail=**GR\u00DCNE ZEHE GESCHEITERT**
|
||||
Herbalism.SubSkill.GreenTerra.Name=Gr\u00fcnes Land (F\u00e4higkeit)
|
||||
Herbalism.SubSkill.GreenTerra.Description=Erte das Land ab, 3x Drops
|
||||
Herbalism.SubSkill.GreenThumb.Name=Gr\u00fcner Daumen (Weizen)
|
||||
Herbalism.SubSkill.GreenThumb.Description=Auto-Saat, s\u00e4ht Weizen wenn abgeerntet
|
||||
Herbalism.SubSkill.GreenThumb.Description.2=Bemoost Steinziegel , l\u00e4sst Gras wachsen
|
||||
Herbalism.SubSkill.FarmersDiet.Name=Bauernfr\u00fchst\u00fcck
|
||||
Herbalism.SubSkill.FarmersDiet.Description=Erh\u00f6ht Effektivit\u00e4t von geernteter Nahrung
|
||||
Herbalism.SubSkill.DoubleDrops.Name=Doppel Drops (Alle Pflanzen)
|
||||
Herbalism.SubSkill.DoubleDrops.Description=Verdoppelt die normale Ausbeute (Loot)
|
||||
Herbalism.SubSkill.HylianLuck.Name=Hylian Gl\u00fcck
|
||||
Herbalism.SubSkill.HylianLuck.Description=Gibt eine kleine M\u00f6glichkeit, seltene Gegenst\u00e4nde zu finden
|
||||
Herbalism.SubSkill.ShroomThumb.Name=Pilz Zehe
|
||||
Herbalism.SubSkill.ShroomThumb.Description=Verbreite Myzel auf Gras und Erde
|
||||
Herbalism.HylianLuck=[[GREEN]]Heute ist das Gl\u00fcck von Hyrule mit dir!
|
||||
Herbalism.Listener=Pflanzenkunde:
|
||||
Herbalism.SkillName=PFLANZENKUNDE
|
||||
Herbalism.Skills.GTe.Off=**Gr\u00fcnes Land ist ausgelaufen**
|
||||
Herbalism.Skills.GTe.On=[[GREEN]]**Gr\u00fcnes Land AKTIVIERT**
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]Deine [[YELLOW]]Gr\u00fcnes Land [[GREEN]]F\u00e4higkeit ist wieder bereit!
|
||||
Herbalism.Skills.GTe.Other.Off={0}s [[RED]]Gr\u00fcnes Land[[GREEN]] ist [[GREEN]]ausgelaufen.
|
||||
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Gr\u00fcnes Land!
|
||||
Herbalism.Skillup=Pflanzenkunde Skill um {0} gestiegen. Gesamt ({1})
|
||||
#MINING
|
||||
Mining.Ability.Length=Super-Brecher Dauer: [[YELLOW]]{0}s
|
||||
Mining.Ability.Locked.0=GESPERRT bis Skill {0}+ (Z\u00fcndstoff)
|
||||
Mining.Ability.Locked.1=GESPERRT bis Skill {0}+ (Sprengmeister)
|
||||
Mining.Ability.Locked.2=GESPERRT bis Skill {0}+ (Explosions-Experte)
|
||||
Mining.Ability.Lower=[[GRAY]]**Du senkst deine SPITZHACKE**
|
||||
Mining.Ability.Ready=[[GREEN]]**Deine SPITZHACKE ist bereit**
|
||||
Mining.SubSkill.SuperBreaker.Name=Super-Brecher (F\u00e4higkeit)
|
||||
Mining.SubSkill.SuperBreaker.Description=Abbaugeschwindigkeit+, Dreifach-Drop Chance
|
||||
Mining.SubSkill.DoubleDrops.Name=Doppel Drops
|
||||
Mining.SubSkill.DoubleDrops.Description=Verdoppelt die normale Ausbeute
|
||||
Mining.SubSkill.BlastMining.Name=Z\u00fcndstoff
|
||||
Mining.SubSkill.BlastMining.Description=Bonus beim Abbaue mit TNT
|
||||
Mining.SubSkill.BiggerBombs.Name=Sprengmeister
|
||||
Mining.SubSkill.BiggerBombs.Description=Erh\u00f6ht den Explosions-Radius
|
||||
Mining.SubSkill.DemolitionsExpertise.Name=Explosions-Experte
|
||||
Mining.SubSkill.DemolitionsExpertise.Description=Reduziert die Verletzung durch TNT Explosionen
|
||||
Mining.Effect.Decrease=Explosions-Experte Schadensreduzierung: [[YELLOW]]{0}
|
||||
Mining.Effect.DropChance=Doppel Drop Chance: [[YELLOW]]{0}
|
||||
Mining.Listener=Bergbau:
|
||||
Mining.SkillName=BERGBAU
|
||||
Mining.Skills.SuperBreaker.Off=**Super-Brecher ist ausgelaufen**
|
||||
Mining.Skills.SuperBreaker.On=[[GREEN]]**Super-Brecher AKTIVIERT**
|
||||
Mining.Skills.SuperBreaker.Other.Off={0}s [[RED]]Super-Brecher[[GREEN]] ist [[GREEN]]ausgelaufen.
|
||||
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Super-Brecher!
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Dein [[YELLOW]]Super-Brecher [[GREEN]]ist wieder bereit!
|
||||
Mining.Skillup=Bergbau Fertigkeit ist um {0} gestiegen. Gesamt ({1})
|
||||
#Blast Mining
|
||||
Mining.Blast.Boom=[[GRAY]]**BOOM**
|
||||
Mining.Blast.Effect=+{0} Erze -{1} Schutt, {2}x Drops
|
||||
Mining.Blast.Radius.Increase=Z\u00fcndstoff Radius Erh\u00f6hung: [[YELLOW]]+{0}
|
||||
Mining.Blast.Rank=Z\u00fcndstoff Rang:[[YELLOW]] {0}/8 [[GRAY]]({1})
|
||||
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Z\u00fcndstoff!
|
||||
Mining.Blast.Refresh=[[GREEN]]Dein [[YELLOW]]Z\u00fcndstoff [[GREEN]]ist wieder bereit!
|
||||
#REPAIR
|
||||
Repair.SubSkill.Repair.Name=Reparatur
|
||||
Repair.SubSkill.Repair.Description=Repariere Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.GoldRepair.Name=Gold Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.GoldRepair.Description=Repariere Gold-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.IronRepair.Name=Eisen Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.IronRepair.Description=Repariere Eisen-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.StoneRepair.Name=Stein Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.StoneRepair.Description=Repariere Stein-Werkzeuge
|
||||
Repair.SubSkill.RepairMastery.Name=Reparatur Meister
|
||||
Repair.SubSkill.RepairMastery.Description=Erh\u00f6ht den Reparatur-Wert
|
||||
Repair.SubSkill.SuperRepair.Name=Super-Reparatur
|
||||
Repair.SubSkill.SuperRepair.Description=Doppelte Effektivit\u00e4t
|
||||
Repair.SubSkill.DiamondRepair.Name=Diamant Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.DiamondRepair.Description=Repariere Diamant-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.ArcaneForging.Name=Arkanes Schmieden
|
||||
Repair.SubSkill.ArcaneForging.Description=Repariere magische Gegenst\u00e4nde
|
||||
Repair.Error=[[DARK_RED]]mcMMO ist beim Versuch dieses Item zu reparieren auf einen Fehler gesto\u00DFen!
|
||||
Repair.Listener.Anvil=[[DARK_RED]]Du hast einen Amboss platziert, Ambosse k\u00f6nnen Waffen und R\u00fcstung reparieren.
|
||||
Repair.Listener=Reparatur:
|
||||
Repair.SkillName=REPARATUR
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Diamant zu reparieren.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Gold zu reparieren.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Eisen zu reparieren
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Stein zu reparieren
|
||||
Repair.Skills.Adept=Du ben\u00f6tigst Level [[YELLOW]]{0}[[RED]] um [[YELLOW]]{1} zu reparieren.
|
||||
Repair.Skills.FeltEasy=[[GRAY]]Das f\u00fchlte sich einfach an.
|
||||
Repair.Skills.FullDurability=[[GRAY]]Dieser Gegenstand hat volle Haltbarkeit.
|
||||
Repair.Skills.Mastery=Reparatur-Meister: [[YELLOW]]{0} Zusatz-Haltbarkeit.
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]Du kannst keine gestapelten Gegenst\u00e4nde reparieren.
|
||||
Repair.Skills.Super.Chance=Super-Reparatur Chance: [[YELLOW]]{0}
|
||||
Repair.Skillup=Reparatur Skill um {0} gestiegen. Gesamt ({1})
|
||||
Repair.Pretty.Name=Reparatur
|
||||
#Arcane Forging
|
||||
Repair.Arcane.Chance.Downgrade=[[GRAY]]AS Verminderungs Chance: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]AS Erfolgs-Rate: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Downgrade=Zauber-Wert des Gegenstands vermindert.
|
||||
Repair.Arcane.Fail=Der Gegenstands wurde entzaubert.
|
||||
Repair.Arcane.Lost=Du hast nicht gen\u00fcgend Skill um Verzauberungen zu erhalten.
|
||||
Repair.Arcane.Perfect=[[GREEN]]Du hast den Zauber-Wert des Gegenstands erhalten.
|
||||
Repair.Arcane.Rank=Arkanes Schmieden Rang: [[YELLOW]]{0}/{1}
|
||||
#SALVAGE
|
||||
Salvage.Pretty.Name=Verwerten
|
||||
Salvage.SubSkill.AdvancedSalvage.Name=Fortgeschrittenes Verwerten
|
||||
Salvage.SubSkill.AdvancedSalvage.Description=Verwerte besch\u00E4digte Items
|
||||
Salvage.SubSkill.ArcaneSalvaging.Name=Arkanes Verwerten
|
||||
Salvage.SubSkill.ArcaneSalvaging.Description=Extra Verzauberung aus Items
|
||||
Salvage.Ability.Locked.0=GESPERRT bis Skill {0}+ (Fortgeschrittenes Verwerten)
|
||||
Salvage.Ability.Bonus.0=Fortgeschrittenes Verwerten
|
||||
Salvage.Ability.Bonus.1=Max Ertrag {0} Item zerst\u00F6rt
|
||||
Salvage.Arcane.Rank=Arkanes Verwerten: [[YELLOW]]Rang {0}/{1}
|
||||
Salvage.Arcane.ExtractFull=[[GRAY]]Verwerten: Gesamte Verzauberung Wahrscheinlichkeit
|
||||
Salvage.Arcane.ExtractPartial=[[GRAY]]Verwerten: Teil-Verzauberung Wahrscheinlichkeit
|
||||
Salvage.Skills.Success=[[GREEN]]Item verwertet!
|
||||
Salvage.Skills.Adept.Damaged=[[DARK_RED]]Deine F\u00E4higkeit ist nicht hoch genug um besch\u00E4digte Items zu verwerten.
|
||||
Salvage.Skills.Adept.Level=Du musst Level [[YELLOW]]{0}[[RED]] sein um [[YELLOW]]{1} [[RED]] zu verwerten.
|
||||
Salvage.Skills.TooDamaged=[[DARK_RED]]Das Item ist zu besch\u00E4digt um verwertet zu werden.
|
||||
Salvage.Skills.ArcaneFailed=Es ist dir nicht gelungen das Wissen aus diesem Item zu extrahieren.
|
||||
Salvage.Skills.ArcanePartial=Es ist dir gelungen ein bisschen Wissen zu extrahieren.
|
||||
Salvage.Skills.ArcaneSuccess=[[GREEN]]Du konntest alles Wissen aus diesem Item extrahieren!
|
||||
Salvage.Listener.Anvil=[[DARK_RED]]Du hast einen Verwertungs-Amboss platziert, benutze ihn um Werkzeuge und R\u00FCstung zu verwerten.
|
||||
Salvage.Listener=Verwerten:
|
||||
Salvage.SkillName=VERWERTEN
|
||||
#SWORDS
|
||||
Swords.Ability.Lower=[[GRAY]]**Du senkst dein SCHWERT**
|
||||
Swords.Ability.Ready=[[GREEN]]**Dein SCHWERT ist bereit**
|
||||
Swords.Combat.Bleed.Chance=Blutungs Chance: [[YELLOW]]{0}
|
||||
Swords.Combat.Bleed.Length=Blutungs Dauer: [[YELLOW]]{0} Ticks
|
||||
Swords.Combat.Bleed.Note=[[GRAY]]Info: [[YELLOW]]1 Tick tritt alle 2 Sekunden ein.
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] Du blutest!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]Das Bluten hat [[GREEN]]aufgeh\u00f6rt[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**GEGNER BLUTET**
|
||||
Swords.Combat.Counter.Chance=Gegenangriff Chance: [[YELLOW]]{0}
|
||||
Swords.Combat.Counter.Hit=[[DARK_RED]]Treffer durch Gegenangriff!
|
||||
Swords.Combat.Countered=[[GREEN]]**GEGENANGRIFF**
|
||||
Swords.Combat.SS.Struck=[[DARK_RED]]Getroffen von S\u00c4GEZAHNSCHLAG!
|
||||
Swords.SubSkill.CounterAttack.Name=Gegenangriff
|
||||
Swords.SubSkill.CounterAttack.Description=Reflektiere {0} des Schadens w\u00E4hrend du blockierst
|
||||
Swords.SubSkill.SerratedStrikes.Name=S\u00e4gezahnschlag (F\u00e4higkeit)
|
||||
Swords.SubSkill.SerratedStrikes.Description={0} Fl\u00E4chenschaden, Fl\u00E4chenblutung+
|
||||
Swords.Effect.4=S\u00e4gezahnschlag, Blutung+
|
||||
Swords.Effect.5={0} Ticks Blutung
|
||||
Swords.SubSkill.Bleed.Name=Blutung
|
||||
Swords.SubSkill.Bleed.Description=Verursacht Blutungsschaden \u00fcber Zeit
|
||||
Swords.Listener=Schwert:
|
||||
Swords.SkillName=SCHWERT
|
||||
Swords.Skills.SS.Off=**S\u00e4gezahnschlag abgenutzt**
|
||||
Swords.Skills.SS.On=[[GREEN]]**S\u00e4gezahnschlag AKTIVIERT**
|
||||
Swords.Skills.SS.Refresh=[[GREEN]]Dein [[YELLOW]]S\u00e4gezahnschlag [[GREEN]]ist wieder bereit!
|
||||
Swords.Skills.SS.Other.Off={0}s [[RED]]S\u00e4gezahnschlag[[GREEN]] ist [[GREEN]]abgenutzt.
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]S\u00e4gezahnschlag!
|
||||
Swords.Skillup=Schwert Skill um {0} gestiegen. Gesamt ({1})
|
||||
Swords.SS.Length=S\u00e4gezahnschlag Dauer: [[YELLOW]]{0}s
|
||||
#TAMING
|
||||
Taming.Ability.Bonus.0=Umweltbewusst
|
||||
Taming.Ability.Bonus.1=W\u00f6lfe weichen Gefahren aus
|
||||
Taming.Ability.Bonus.2=Dicker Pelz
|
||||
Taming.Ability.Bonus.3=1/{0} Schaden, Feuer-Resistent
|
||||
Taming.Ability.Bonus.4=Schock-Sicher
|
||||
Taming.Ability.Bonus.5=Explosionen f\u00FCgen 1/{0} des normalen Schadens zu
|
||||
Taming.Ability.Bonus.6=Gesch\u00e4rfte Krallen
|
||||
Taming.Ability.Bonus.7=+{0} Schaden
|
||||
Taming.Ability.Bonus.8=Schnell-Imbiss
|
||||
Taming.Ability.Bonus.9={0} Chance auf Heilung bei einer Attacke
|
||||
Taming.Ability.Bonus.10=Heiliger Hund
|
||||
Taming.Ability.Bonus.11=Regenerierung auch mit Tr\u00E4nken und Zaubern m\u00F6glich
|
||||
Taming.Ability.Locked.0=GESPERRT bis Skill {0}+ (Umweltbewusst)
|
||||
Taming.Ability.Locked.1=GESPERRT bis Skill {0}+ (Dicker Pelz)
|
||||
Taming.Ability.Locked.2=GESPERRT bis Skill {0}+ (Schock-Sicher)
|
||||
Taming.Ability.Locked.3=GESPERRT bis Skill {0}+ (Gesch\u00e4rfte Krallen)
|
||||
Taming.Ability.Locked.4=GESPERRT bis Skill {0}+ (Schnell-Imbiss)
|
||||
Taming.Ability.Locked.5=GESPERRT bis Skill {0}+ (Heiliger Hund)
|
||||
Taming.Combat.Chance.Gore=Aufschlitzen Chance: [[YELLOW]]{0}
|
||||
Taming.SubSkill.BeastLore.Name=Bestienkunde
|
||||
Taming.SubSkill.BeastLore.Description=Knochenschlag inspiziert W\u00f6lfe und Ozelots
|
||||
Taming.SubSkill.ShockProof.Name=Schock-Sicher
|
||||
Taming.SubSkill.ShockProof.Description=Reduktion von Explosions-Schaden
|
||||
Taming.SubSkill.CallOfTheWild.Name=Ruf der Wildnis
|
||||
Taming.SubSkill.CallOfTheWild.Description=Beschw\u00f6re ein Tier an deine Seite
|
||||
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]RdW: B\u00fccken und Linksklick mit {0} {1} (Ozelot), {2} {3} (Wolf), {4} {5} (Pferd)
|
||||
Taming.SubSkill.FastFoodService.Name=Schnell-Imbiss
|
||||
Taming.SubSkill.FastFoodService.Description=Chance auf Heilung bei Attacke (Wolf)
|
||||
Taming.SubSkill.HolyHound.Name=Heiliger Hund
|
||||
Taming.SubSkill.HolyHound.Description=Heilung durch Magie und Tr\u00E4nke
|
||||
Taming.SubSkill.Gore.Name=Aufschlitzen
|
||||
Taming.SubSkill.Gore.Description=Kritische Treffer verursachen Blutung
|
||||
Taming.SubSkill.SharpenedClaws.Name=Gesch\u00e4rfte Krallen
|
||||
Taming.SubSkill.SharpenedClaws.Description=Schadens-Bonus
|
||||
Taming.SubSkill.EnvironmentallyAware.Name=Umweltbewusst
|
||||
Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lava-Furcht, Immun gegen Fall-Schaden
|
||||
Taming.SubSkill.ThickFur.Name=Dicker Pelz
|
||||
Taming.SubSkill.ThickFur.Description=Verminderter Schaden, Feuer-Resistent
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]Dein Wolf hastet zu dir zur\u00fcck...
|
||||
Taming.Listener=Z\u00e4hmen:
|
||||
Taming.SkillName=Z\u00c4HMEN
|
||||
Taming.Skillup=Z\u00e4hhmen Skill um {0} gestiegen. Gesamt ({1})
|
||||
Taming.Summon.Complete=[[GREEN]]Beschw\u00f6rung abgeschlossen
|
||||
Taming.Summon.Lifespan=(Lebenszeit: {0}s)
|
||||
Taming.Summon.Fail.Ocelot=Du hast zu viele Ozelots um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.Wolf=Du hast zu viele W\u00f6lfe um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.Horse=Du hast zu viele Pferde um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.TooMany=Du hast das Maximum an beschworenen Tieren erreicht [[YELLOW]]({0})
|
||||
Taming.Summon.Name.Format={0}''s {1}
|
||||
#UNARMED
|
||||
Unarmed.Ability.Berserk.Length=Berserker Dauer: [[YELLOW]]{0}s
|
||||
Unarmed.Ability.Bonus.0=Eiserner Arm
|
||||
Unarmed.Ability.Bonus.1=+{0} Schadens-Bonus
|
||||
Unarmed.Ability.Chance.ArrowDeflect=Pfeile ablenken Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.Disarm=Entwaffnen Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.IronGrip=Eisen Griff Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.IronGrip.Attacker=Dein Gegner hat einen eisernen Griff!
|
||||
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Dein eiserner Griff hat dich vor Entwaffnung gesch\u00FCtzt!
|
||||
Unarmed.Ability.Lower=[[GRAY]]**Du senkst deine F\u00c4USTE**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**Deine F\u00c4USTE sind bereit**
|
||||
Unarmed.SubSkill.Berserk.Name=Berserker (F\u00e4higkeit)
|
||||
Unarmed.SubSkill.Berserk.Description=+50% Schaden, Zerbricht weiche Materialien
|
||||
Unarmed.SubSkill.Disarm.Name=Entwaffnen (Spieler)
|
||||
Unarmed.SubSkill.Disarm.Description=L\u00E4sst Gegenstand aus der Hand des Feindes fallen
|
||||
Unarmed.SubSkill.IronArmStyle.Name=Eiserner Arm
|
||||
Unarmed.SubSkill.IronArmStyle.Description=Erh\u00f6ht kurzfristig deine Schlagkraft
|
||||
Unarmed.SubSkill.ArrowDeflect.Name=Pfeil-Ablenkung
|
||||
Unarmed.SubSkill.ArrowDeflect.Description=Lenkt Pfeile ab
|
||||
Unarmed.SubSkill.IronGrip.Name=Eisen Griff
|
||||
Unarmed.SubSkill.IronGrip.Description=Sch\u00FCtzt dich davor, entwaffnet zu werden
|
||||
Unarmed.Listener=Unbewaffnet:
|
||||
Unarmed.SkillName=UNBEWAFFNET
|
||||
Unarmed.Skills.Berserk.Off=**Berserker ausgelaufen**
|
||||
Unarmed.Skills.Berserk.On=[[GREEN]]**Berserker AKTIVIERT**
|
||||
Unarmed.Skills.Berserk.Other.Off={0}s [[RED]]Berserker[[GREEN]] ist [[GREEN]]ausgelaufen
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Berserker!
|
||||
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Dein [[YELLOW]]Berserker [[GREEN]]ist wieder bereit!
|
||||
Unarmed.Skillup=Unbewaffnet Skill um {0} gestiegen. Gesamt ({1})
|
||||
#WOODCUTTING
|
||||
Woodcutting.Ability.0=Bl\u00e4ttersturm
|
||||
Woodcutting.Ability.1=Bl\u00e4st Bl\u00e4tter davon
|
||||
Woodcutting.Ability.Chance.DDrop=Doppel Drop Chance: [[YELLOW]]{0}
|
||||
Woodcutting.Ability.Length=Baumf\u00e4ller Dauer: [[YELLOW]]{0}s
|
||||
Woodcutting.Ability.Locked.0=GESPERRT bis Skill {0}+ (Bl\u00e4ttersturm)
|
||||
Woodcutting.SubSkill.TreeFeller.Name=Baumf\u00e4ller (F\u00e4higkeit)
|
||||
Woodcutting.SubSkill.TreeFeller.Description=L\u00e4sst B\u00e4ume explodieren
|
||||
Woodcutting.SubSkill.LeafBlower.Name=Bl\u00e4ttersturm
|
||||
Woodcutting.SubSkill.LeafBlower.Description=Bl\u00e4st Bl\u00e4tter davon
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=Doppel Drops
|
||||
Woodcutting.SubSkill.HarvestLumber.Description=Verdoppelt die Ausbeute
|
||||
Woodcutting.Listener=Holzf\u00e4ller:
|
||||
Woodcutting.SkillName=HOLZF\u00c4LLER
|
||||
Woodcutting.Skills.TreeFeller.Off=**Baumf\u00e4ller abgelaufen**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**Baumf\u00e4ller AKTIVIERT**
|
||||
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Dein [[YELLOW]]Baumf\u00e4ller [[GREEN]]ist wieder bereit!
|
||||
Woodcutting.Skills.TreeFeller.Other.Off={0}s [[RED]]Baumf\u00e4ller[[GREEN]] ist [[GREEN]]abgelaufen
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Baumf\u00e4ller!
|
||||
Woodcutting.Skills.TreeFeller.Splinter=Deine Axt zersplittert in tausend kleine Teile!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Dieser Baum ist zu gro\u00DF!
|
||||
Woodcutting.Skillup=Holzf\u00e4ller Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ABILITIY
|
||||
##generic
|
||||
Ability.Generic.Refresh=[[GREEN]]**F\u00e4higkeit wieder BEREIT!**
|
||||
Ability.Generic.Template.Lock=[[GRAY]]{0}
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
#COMBAT
|
||||
Combat.ArrowDeflect=[[WHITE]]**Pfeil ABGELENKT**
|
||||
Combat.BeastLore=[[GREEN]]**BESTIENKUNDE**
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]Gesundheit ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Besitzer ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]**AUFGESCHLITZT**
|
||||
Combat.StruckByGore=**du wurdest AUFGESCHLITZT**
|
||||
Combat.TargetDazed=Ziel wurde [[DARK_RED]]BET\u00c4UBT
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Ungl\u00fccklich ber\u00fchrt. Schwindelgef\u00fchl.
|
||||
#COMMANDS
|
||||
##generic
|
||||
mcMMO.Description=[[DARK_AQUA]]\u00DCber das [[YELLOW]]mcMMO[[DARK_AQUA]] Projekt: [[GOLD]]mcMMO ist ein [[RED]]open source[[GOLD]] RPG mod der im Februar 2011,[[GOLD]]von [[BLUE]]com.gmail.nossr50[[GOLD]] erstellt wurde. Ziel ist es eine gute RPG Erfahrung zu vermitteln.,[[DARK_AQUA]]Tipps:,[[GOLD]] - [[GREEN]]Benutz [[RED]]/mcmmo help[[GREEN]] um Befehle zu sehen,[[GOLD]] - [[GREEN]]Tippe [[RED]]/SKILLNAME[[GREEN]] um detaillierte Skillinformationen zu sehen,[[DARK_AQUA]]Entwickler:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Gr\u00FCnder),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Projektleitung),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]lumis31 [[BLUE]](Deutsche \u00DCbersetzung), [[DARK_AQUA]]N\u00FCtzliche Links:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Bug Reporting,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]Dir wurden {0} Level in allen Skills gutgeschrieben!
|
||||
Commands.addlevels.AwardAll.2=Alle Skills wurden um {0} ge\u00E4ndert.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]Dir wurden {0} Level in {1} gutgeschrieben!
|
||||
Commands.addlevels.AwardSkill.2={0} wurde um {1} ge\u00E4ndert.
|
||||
Commands.addxp.AwardAll=[[GREEN]]Dir wurden {0} Erfahrungspunkte in Skills gutgeschrieben!
|
||||
Commands.addxp.AwardSkill=[[GREEN]Dir wurde {0} Erfahrung in {1} gutgeschrieben!
|
||||
Commands.Ability.Off=F\u00e4higkeiten [[RED]]deaktiviert
|
||||
Commands.Ability.On=F\u00e4higkeiten [[GREEN]]aktiviert
|
||||
Commands.Ability.Toggle=Benutzung von F\u00E4higkeiten wurde f\u00FCr [[YELLOW]]{0} ge\u00E4ndert
|
||||
Commands.AdminChat.Off=Nur Admin Chat [[RED]] deaktiviert
|
||||
Commands.AdminChat.On=Nur Admin Chat [[GREEN]] aktiviert
|
||||
Commands.AdminToggle=[[GREEN]]- Schalte den Adminchat um
|
||||
Commands.Chat.Console=*Konsole*
|
||||
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO F\u00E4higkeiten Abk\u00FChlzeit[[GOLD]] =--
|
||||
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} Sekunden verbleiben
|
||||
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Bereit!
|
||||
Commands.Database.Cooldown=Du musst 1 Sekunde warten bevor du diesen Befehl erneut verwenden darfst.
|
||||
Commands.Database.Processing=Dein vorheriger Befehl wird noch verarbeitet. Bitte warten.
|
||||
Commands.Disabled=Dieser Befehl ist deaktiviert.
|
||||
Commands.DoesNotExist=[[RED]]Spieler in Datenbank nicht vorhanden!
|
||||
Commands.GodMode.Disabled=mcMMO Godmode deaktiviert
|
||||
Commands.GodMode.Enabled=mcMMO Godmode aktiviert
|
||||
Commands.GodMode.Forbidden=[mcMMO] Der Godmode ist in dieser Welt nicht erlaubt(Siehe Permissions)
|
||||
Commands.GodMode.Toggle=Godmode wurde f\u00FCr [[YELLOW]]{0} aktiviert
|
||||
Commands.Healthbars.Changed.HEARTS=[mcMMO]Deine Lebensanzeige wurde zu [[RED]]Herzen[[WHITE]] ge\u00E4ndert.
|
||||
Commands.Healthbars.Changed.BAR=[mcMMO] Deine Lebensanzeige wurde zu [[YELLOW]]K\u00E4stchen[[WHITE]] ge\u00E4ndert.
|
||||
Commands.Healthbars.Changed.DISABLED=[mcMMO] Die Mob-Lebensanzeige wurde [[GRAY]]deaktiviert[[WHITE]].
|
||||
Commands.Healthbars.Invalid=Ung\u00FCltiger Lebensanzeige Typ!
|
||||
Commands.Inspect=<player> [[GREEN]]- Siehe detaillierte Spielerinformationen
|
||||
Commands.Invite.Success=[[GREEN]]Einladung erfolgreich gesendet.
|
||||
Commands.Leaderboards=<skill> <page> [[GREEN]]- Bestenlisten
|
||||
Commands.mcc.Header=---[][[GREEN]]mcMMO Befehle[[RED]][]---
|
||||
Commands.mcgod=[[GREEN]]- Schalte Godmode um
|
||||
Commands.mchud.Invalid=Das ist kein g\u00FCltiger HUD Typ.
|
||||
Commands.mcpurge.Success=[[GREEN]]Die Datenbank wurde erfolgreich ges\u00E4ubert!
|
||||
Commands.mcrank.Heading=[[GOLD]]-=PERS\u00D6NLICHE STATISTIKEN=-
|
||||
Commands.mcrank.Overall=Insgesamt[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{0}
|
||||
Commands.mcrank.Player=ZIEL: [[WHITE]]{0}
|
||||
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{1}
|
||||
Commands.mcrank.Unranked=[[WHITE]]Ohne Rang
|
||||
Commands.mcrefresh.Success={0}''s Abk\u00FChlzeiten wurden erneuert.
|
||||
Commands.mcremove.Success=[[GREEN]]{0} wurde erfolgreich von der Datenbank entfernt!
|
||||
Commands.mctop.Tip=[[GOLD]]Tipp: Benutze [[RED]]/mcrank[[GOLD]] um deine pers\u00F6nlichen Statistiken zu sehen!
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[GREEN]] - Ziel modifizieren
|
||||
Commands.mmoedit.AllSkills.1=[[GREEN]]Dein Level wurde in allen F\u00E4higkeiten zu {0} gesetzt!
|
||||
Commands.mmoedit.Modified.1=[[GREEN]]Dein Level in {0} wurde zu {1} gesetzt!
|
||||
Commands.mmoedit.Modified.2={0} wurde bei {1} modifiziert.
|
||||
Commands.mcconvert.Database.Same=Du benutzt bereits die {0} Datenbank!
|
||||
Commands.mcconvert.Database.InvalidType={0} ist kein g\u00FCltiger Datenbanktyp.
|
||||
Commands.mcconvert.Database.Start=[[GRAY]]Beginne Konvertierung von {0} zu {1}...
|
||||
Commands.mcconvert.Database.Finish=[[GRAY]]Datenbanken Migration vollendet; die {1} Datenbank hat nun alle Daten von der {0} Datenbank.
|
||||
Commands.mmoshowdb=Die zurzeit verwendete Datenbank ist [[GREEN]]{0}
|
||||
Commands.mcconvert.Experience.Invalid=Unbekannter Formeltyp! G\u00FCltige Typen sind: [[GREEN]]LINEAR [[RED]]und [[GREEN]]EXPONENTIAL.
|
||||
Commands.mcconvert.Experience.Same=Formeltyp {0} wird bereits verwendet
|
||||
Commands.mcconvert.Experience.Start=[[GRAY]]Beginne Konvertierung von Kurve {0} zu Kurve {1}
|
||||
Commands.mcconvert.Experience.Finish=[[GRAY]]Konvertierung vollendet; jetzt wird die {0} XP Kurve verwendet.
|
||||
Commands.ModDescription=[[GREEN]]- Kurze Modbeschreibung
|
||||
Commands.NoConsole=Dieser Befehl kann nicht aus der Konsole verwendet werden.
|
||||
Commands.Notifications.Off=F\u00E4higkeiten Hinweise wurden [[RED]]deaktiviert
|
||||
Commands.Notifications.On=F\u00E4higkeiten Hinweise wurden [[GREEN]]aktiviert
|
||||
Commands.Offline=Dieser Befehl funktioniert nur bei eingeloggten Spielern.
|
||||
Commands.NotLoaded=Spielerprofil wurde noch nicht geladen.
|
||||
Commands.Other=---[][[GREEN]]ANDERE BEFEHLE[[RED]][]---
|
||||
Commands.Party.Header=-----[][[GREEN]]PARTY[[RED]][]-----
|
||||
Commands.Party.Features.Header=-----[][[GREEN]]FEATURES[[RED]][]-----
|
||||
Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} [[DARK_GRAY]]LEVEL: [[DARK_AQUA]]{2}
|
||||
Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLY: [[WHITE]]{0}
|
||||
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Freigeschaltete Features: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.ShareMode=[[DARK_GRAY]]TEILEN MODUS:
|
||||
Commands.Party.ItemShare=[[GRAY]]ITEM [[DARK_AQUA]]({0})
|
||||
Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0})
|
||||
Commands.Party.ItemShareCategories=[[DARK_GRAY]]Teile Items: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.MembersNear=[[DARK_GRAY]]IN DER N\u00C4HE [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
|
||||
Commands.Party.Accept=[[GREEN]]- Nimm Party-Einladung an
|
||||
Commands.Party.Chat.Off=Nur Party Chat [[RED]]Aus
|
||||
Commands.Party.Chat.On=Nur Party Chat [[GREEN]]AN
|
||||
Commands.Party.Commands=---[][[GREEN]]PARTY BEFEHLE[[RED]][]---
|
||||
Commands.Party.Invite.0=ALERT: [[GREEN]]Du hast eine Party Einladung f\u00FCr {0} von {1} erhalten.
|
||||
Commands.Party.Invite.1=Benutze [[GREEN]]/party accept[[YELLOW]] um die Einladung anzunehmen
|
||||
Commands.Party.Invite=[[GREEN]]- Sende eine Party Einladung
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]Einladung angenommen. Du bist der {0} Party beigetreten.
|
||||
Commands.Party.Join=[[GRAY]]Beigetretene Party: {0}
|
||||
Commands.Party.Create=[[GRAY]]Erstellte Party: {0}
|
||||
Commands.Party.Rename=[[GRAY]]Party Name wurde zu: [[WHITE]]{0} [[GRAY]]ge\u00E4ndert
|
||||
Commands.Party.SetSharing=[[GRAY]]Party {0} teilen: [[DARK_AQUA]]{1}
|
||||
Commands.Party.ToggleShareCategory=[[GRAY]]Party item Teilen f\u00FCr[[GOLD]]{0} [[GRAY]]wurde [[DARK_AQUA]]{1}
|
||||
Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} ist bereits vorhanden!
|
||||
Commands.Party.Kick=Du wurdest von {0} Party entfernt!
|
||||
Commands.Party.Leave=Du hast die Party verlassen
|
||||
Commands.Party.Members.Header=-----[][[GREEN]]MITGLIEDER[[RED]][]-----
|
||||
Commands.Party.None=Du bist in keiner Party.
|
||||
Commands.Party.Quit=[[GREEN]]- Verlasse deine aktuelle Party.
|
||||
Commands.Party.Teleport=[[GREEN]]- Teleportiere dich zu Partymitgliedern.
|
||||
Commands.Party.Toggle=[[GREEN]]- Schalte den Party Chat.
|
||||
Commands.Party1=[[GREEN]]- Erstelle eine neue Party
|
||||
Commands.Party2=[[GREEN]]- Tritt der Party eines Spielers bei.
|
||||
Commands.Party.Alliance.Header=-----[][[GREEN]]PARTY ALLIANZEN[[RED]][]-----
|
||||
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]IS MIT FOLGENDEN VERB\u00DCNDET: [[WHITE]]{1}
|
||||
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]ALLIANZEN MITGLIEDER[[RED]][]-----
|
||||
Commands.Party.Alliance.Invite.0=ALERT: [[GREEN]]Du hast eine B\u00FCndnis Anfrage f\u00FCr {0} von {1} erhalten
|
||||
Commands.Party.Alliance.Invite.1=Tippe [[GREEN]]/party alliance accept[[YELLOW]] um die Anfrage anzunehmen
|
||||
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]B\u00FCndnis Anfrage angenommen
|
||||
Commands.Party.Alliance.None=Deine Party hat keine Verb\u00FCndeten.
|
||||
Commands.Party.Alliance.AlreadyAllies=Deine Party ist bereits in einem B\u00FCndnis. Trenne mit[[DARK_AQUA]]/party alliance disband
|
||||
Commands.Party.Alliance.Help.0=Diese Party ist in keinem B\u00FCndnis. Lade einen Party Anf\u00FChrer an.
|
||||
Commands.Party.Alliance.Help.1=um zu verb\u00FCnden [[DARK_AQUA]]/party alliance invite <Spieler>[[RED]].
|
||||
Commands.ptp.Enabled=Party Teleport [[GREEN]]aktiviert
|
||||
Commands.ptp.Disabled=Party Teleport [[RED]]deaktiviert
|
||||
Commands.ptp.NoRequests=Du hast aktuell keine teleportanfragen.
|
||||
Commands.ptp.NoWorldPermissions=[mcMMO] Du hast nicht die Rechte um in die Welt {0} zu teleportieren.
|
||||
Commands.ptp.Request1={0} [[GREEN]]m\u00F6chte sich zu dir teleportieren.
|
||||
Commands.ptp.Request2=[[GREEN]]Um zu teleportieren tippe[[YELLOW]]/ptp accept[[GREEN]]. Die Anfrage l\u00E4uft in[[RED]]{0} [[GREEN]]Sekunden aus.
|
||||
Commands.ptp.AcceptAny.Enabled=Party Teleport Anfragenbest\u00E4tigung[[GREEN]]aktiviert
|
||||
Commands.ptp.AcceptAny.Disabled=Party Teleport Anfragenbest\u00E4tigung[[RED]]deaktiviert
|
||||
Commands.ptp.RequestExpired=Party Teleport Anfrage ist ausgelaufen.
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Power Level [[YELLOW]]Bestenliste--
|
||||
Commands.PowerLevel.Capped=[[DARK_RED]]GESAMT LEVEL: [[GREEN]]{0} [[DARK_RED]]MAX LEVEL: [[YELLOW]]{1}
|
||||
Commands.PowerLevel=[[DARK_RED]]GESAMT LEVEL: [[GREEN]]{0}
|
||||
Commands.Reset.All=[[GREEN]]Alles Skilllevel wurden erfolgreich zur\u00FCckgesetzt.
|
||||
Commands.Reset.Single=[[GREEN]]Dein {0} Skilllevel wurde erfolgreich zur\u00FCckgesetzt.
|
||||
Commands.Reset=[[GREEN]]- Setze ein Skilllevel auf 0
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]Die Stats \u00DCbersicht wurde ausgeblendet.
|
||||
Commands.Scoreboard.NoBoard=Die Stats Anzeige ist nicht sichtbar.
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]Die Stats \u00DCbersicht bleibt sichtbar bis du [[GREEN]]/mcscoreboard clear[[DARK_AQUA]] verwendest.
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]Die Stats \u00DCbersicht wird nach [[GOLD]]{0}[[DARK_AQUA]] Sekunden verschwinden.
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Hilfe f\u00FCr[[RED]]/mcscoreboard[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - blende die \u00DCbersicht aus
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - behalte die \u00DCbersicht offen
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - blende die \u00DCbersicht nach [[LIGHT_PURPLE]]n[[WHITE]] Sekunden aus
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]Tipp: Benutze [[RED]]/mcscoreboard keep[[GOLD]] um deine Stats sichtbar zu lassen
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]Tipp: Benutze [[RED]]/mcscoreboard clear[[GOLD]] um die \u00DCbersicht auszublenden
|
||||
Commands.Skill.Invalid=Das ist kein g\u00FCltiger Skillname!
|
||||
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Bestenliste--
|
||||
Commands.SkillInfo=[[GREEN]]-Detaillierte Informationen zu einem Skill
|
||||
Commands.Stats.Self=DEINE STATS
|
||||
Commands.Stats=[[GREEN]]- Sieh deine McMMO Stats
|
||||
Commands.ToggleAbility=[[GREEN]]- Schalte auf F\u00E4higkeiten Aktivierung mit Rechtsklick
|
||||
Commands.Usage.0=Korrekte Verwendung ist /{0}
|
||||
Commands.Usage.1=Korrekte Verwendung ist /{0} {1}
|
||||
Commands.Usage.2=Korrekte Verwendung ist /{0} {1} {2}
|
||||
Commands.Usage.3=Korrekte Verwendung ist /{0} {1} {2} {3}
|
||||
Commands.Usage.FullClassName=classname
|
||||
Commands.Usage.Level=Level
|
||||
Commands.Usage.Message=Message
|
||||
Commands.Usage.Page=Seite
|
||||
Commands.Usage.PartyName=Name
|
||||
Commands.Usage.Password=Passwort
|
||||
Commands.Usage.Player=Spieler
|
||||
Commands.Usage.Rate=Eate
|
||||
Commands.Usage.Skill=Skill
|
||||
Commands.Usage.XP=xp
|
||||
mcMMO.NoInvites=Du hast zurzeit keine Einladungen
|
||||
mcMMO.NoPermission=[[DARK_RED]]Unzureichende Berechtigungen.
|
||||
mcMMO.NoSkillNote=[[DARK_GRAY]]Wenn du keinen Zugriff auf einen Skill hast wird er hier nicht angezeigt.
|
||||
##party
|
||||
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
|
||||
Party.Help.0=Proper usage is [[DARK_AQUA]]{0} <player> [password].
|
||||
Party.Help.1=To create a party, use [[DARK_AQUA]]{0} <name> [password].
|
||||
Party.Help.2=Consult [[DARK_AQUA]]{0} [[RED]]for more information
|
||||
Party.Help.3=Use [[DARK_AQUA]]{0} <player> [password] [[RED]]to join or [[DARK_AQUA]]{1} [[RED]]to quit
|
||||
Party.Help.4=To lock or unlock your party, use [[DARK_AQUA]]{0}
|
||||
Party.Help.5=To password protect your party, use [[DARK_AQUA]]{0} <password>
|
||||
Party.Help.6=To kick a player from your party, use [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.7=To transfer ownership of your party, use [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.8=To disband your party, use [[DARK_AQUA]]{0}
|
||||
Party.Help.9=Use [[DARK_AQUA]]{0} [[RED]]to share items with party members
|
||||
Party.Help.10=Use [[DARK_AQUA]]{0} [[RED]]to enable XP sharing with party members
|
||||
Party.InformedOnJoin={0} [[GREEN]]has joined your party
|
||||
Party.InformedOnQuit={0} [[GREEN]]has left your party
|
||||
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]has set the party name to [[WHITE]]{1}
|
||||
Party.InvalidName=[[DARK_RED]]That is not a valid party name.
|
||||
Party.Invite.Self=You can't invite yourself!
|
||||
Party.IsLocked=This party is already locked!
|
||||
Party.IsntLocked=This party is not locked!
|
||||
Party.Locked=Party is locked, only party leader may invite.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} is not in your party
|
||||
Party.NotOwner=[[DARK_RED]]You are not the party leader.
|
||||
Party.Target.NotOwner=[[DARK_RED]]{0} is not the party leader.
|
||||
Party.Owner.New=[[GREEN]]{0} is the new party leader.
|
||||
Party.Owner.NotLeader=[[DARK_RED]]You are no longer the party leader.
|
||||
Party.Owner.Player=[[GREEN]]You are now the party leader.
|
||||
Party.Password.None=This party is password protected. Please provide a password to join.
|
||||
Party.Password.Incorrect=Party password is incorrect.
|
||||
Party.Password.Set=[[GREEN]]Party password set to {0}
|
||||
Party.Password.Removed=[[GREEN]]Party password has been cleared.
|
||||
Party.Player.Invalid=That is not a valid player.
|
||||
Party.NotOnline=[[DARK_RED]]{0} is not online!
|
||||
Party.Player.InSameParty={0} already is in your party!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party
|
||||
Party.Specify=You must specify a party.
|
||||
Party.Teleport.Dead=You can't teleport to a dead player.
|
||||
Party.Teleport.Hurt=You have been hurt in the last {0} seconds and cannot teleport.
|
||||
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
|
||||
Party.Teleport.Self=You can't teleport to yourself!
|
||||
Party.Teleport.Target=[[GREEN]]{0} has teleported to you.
|
||||
Party.Teleport.Disabled={0} doesn't allow party teleportation.
|
||||
Party.Rename.Same=That is already the name of your party!
|
||||
Party.Join.Self=You can't join yourself!
|
||||
Party.Unlocked=[[GRAY]]Party is unlocked
|
||||
Party.Disband=[[GRAY]]The party has been disbanded
|
||||
Party.Alliance.Formed=[[GRAY]]Your party is now allies with [[GREEN]]{0}
|
||||
Party.Alliance.Disband=[[GRAY]]Your party is no longer allies with [[RED]]{0}
|
||||
Party.Status.Locked=[[DARK_RED]](INVITE-ONLY)
|
||||
Party.Status.Unlocked=[[DARK_GREEN]](OPEN)
|
||||
Party.LevelUp=Party level increased by {0}. Total ({1})
|
||||
Party.Feature.Chat=Party Chat
|
||||
Party.Feature.Teleport=Party Teleport
|
||||
Party.Feature.Alliance=Alliances
|
||||
Party.Feature.ItemShare=Item Sharing
|
||||
Party.Feature.XpShare=XP Sharing
|
||||
Party.Feature.Locked.Chat=LOCKED UNTIL {0}+ (PARTY CHAT)
|
||||
Party.Feature.Locked.Teleport=LOCKED UNTIL {0}+ (PARTY TELEPORT)
|
||||
Party.Feature.Locked.Alliance=LOCKED UNTIL {0}+ (ALLIANCES)
|
||||
Party.Feature.Locked.ItemShare=LOCKED UNTIL {0}+ (ITEM SHARING)
|
||||
Party.Feature.Locked.XpShare=LOCKED UNTIL {0}+ (XP SHARING)
|
||||
Party.Feature.Disabled.1=Party chat is not unlocked yet.
|
||||
Party.Feature.Disabled.2=Party teleport is not unlocked yet.
|
||||
Party.Feature.Disabled.3=Party alliances are not unlocked yet.
|
||||
Party.Feature.Disabled.4=Party item sharing is not unlocked yet.
|
||||
Party.Feature.Disabled.5=Party XP sharing is not unlocked yet.
|
||||
Party.ShareType.Xp=XP
|
||||
Party.ShareType.Item=ITEM
|
||||
Party.ShareMode.None=NONE
|
||||
Party.ShareMode.Equal=EQUAL
|
||||
Party.ShareMode.Random=RANDOM
|
||||
Party.ItemShare.Category.Loot=Loot
|
||||
Party.ItemShare.Category.Mining=Mining
|
||||
Party.ItemShare.Category.Herbalism=Herbalism
|
||||
Party.ItemShare.Category.Woodcutting=Woodcutting
|
||||
Party.ItemShare.Category.Misc=Misc
|
||||
##xp
|
||||
Commands.XPGain.Acrobatics=Fallen
|
||||
Commands.XPGain.Alchemy=Tr\u00E4nke brauen
|
||||
Commands.XPGain.Archery=Monster angreifen
|
||||
Commands.XPGain.Axes=Monster angreifen
|
||||
Commands.XPGain.Child=Levelerhalt durch Verbesserung der Eltern-Skills
|
||||
Commands.XPGain.Excavation=Graben und Sch\u00E4tze finden
|
||||
Commands.XPGain.Fishing=Angeln
|
||||
Commands.XPGain.Herbalism=Ernten
|
||||
Commands.XPGain.Mining=Erze und Steine abbauen
|
||||
Commands.XPGain.Repair=Reparieren
|
||||
Commands.XPGain.Swords=Monster angreifen
|
||||
Commands.XPGain.Taming=Monster z\u00E4hmen, mit dem Wolf k\u00E4mpfen
|
||||
Commands.XPGain.Unarmed=Monster angreifen
|
||||
Commands.XPGain.Woodcutting=B\u00E4ume f\u00E4llen
|
||||
Commands.XPGain=[[DARK_GRAY]]XP ZUWACHS: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]Deine XP Anzeige ist nun auf {0} festgesetzt!
|
||||
Commands.xplock.unlocked=[[GOLD]]Deine XP Anzeige ist nun wieder [[GREEN]]FREIGEGEBEN[[GOLD]]!
|
||||
Commands.xprate.modified=The XP RATE wurde auf {0} gesetzt!
|
||||
Commands.xprate.over=Das mcMMO XP Rate Event ist vor\u00fcber!!
|
||||
Commands.xprate.proper.0=Korrekte Eingabe f\u00fcr XP Rate Wechsel: /xprate <integer> <true/false>
|
||||
Commands.xprate.proper.1=Korrekte Eingabe f\u00fcr R\u00fccksetzung auf Standard XP Rate: /xprate reset
|
||||
Commands.xprate.proper.2=Bitte spezifiziere mit true/false ob dies ein XP-Event ist oder nicht.
|
||||
Commands.xprate.started.0=[[GOLD]]Das XP EVENT f\u00fcr mcMMO hat BEGONNEN!
|
||||
Commands.xprate.started.1=[[GOLD]]Die mcMMO XP RATE liegt nun bei {0}x!
|
||||
XPRate.Event=[[GOLD]]mcMMO hat gerade ein XP-RATE Event. Derzeitige XP Rate: {0}x!
|
||||
#EFFECTS
|
||||
##generic
|
||||
Effects.Effects=EFFEKTE
|
||||
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
|
||||
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
|
||||
Effects.Parent=[[GOLD]]{0} -
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
#GUIDES
|
||||
Guides.Available=[[GRAY]]Anleitung f\u00FCr {0} vorhanden - tippe /{1} ? [Seite]
|
||||
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Anleitung[[GOLD]]=-
|
||||
Guides.Page.Invalid=Keine g\u00FCltige Seitenzahl!
|
||||
Guides.Page.OutOfRange=Es gibt nur insgesamt {0} Seiten.
|
||||
Guides.Usage=Der Befehl ist /{0} ? [Seite]
|
||||
##Acrobatics
|
||||
Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u00DCber Akrobatik:\n[[YELLOW]]Akrobatik ist die Kunst sich grazi\u00F6s fortzubewegen.\n[[YELLOW]]Fall- und Kampfschaden werden reduziert\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP sammelst du indem du in K\u00E4mpfen\n[[YELLOW]]ausweichst, oder St\u00FCrze aus gro\u00DFen H\u00F6hen \u00FCberlebst.
|
||||
Guides.Acrobatics.Section.1=[[DARK_AQUA]]Wie funktioniert Rollen?\n[[YELLOW]]Ab und zu rollst du beim Fallen ab und der Fallschaden wird\n[[YELLOW]]reduziert. Wenn du den Schleichen Knopf w\u00E4hrend dem Fallen\n[[YELLOW]]h\u00E4ltst, verdoppelt sich die Wahrscheinlichkeit abzurollen.\n[[YELLOW]]In dem Fall rollst du grazi\u00F6s ab.\n[[YELLOW]]Grazi\u00F6se Rollen sind gleich wie normale Rollen, nur dass\n[[YELLOW]]sie \u00F6fter passieren und damit mehr Schutz vor St\u00FCrzen\n[[YELLOW]]liefern.
|
||||
Guides.Acrobatics.Section.2=[[DARK_AQUA]]Wie funktioniert Ausweichen?\n[[YELLOW]]Ausweichen ist eine passive F\u00E4higkeit\n[[YELLOW]]die ab und zu den Schaden in K\u00E4mpfen halbiert.\n[[YELLOW]]Die Wahrscheinlichkeit auszuweichen ist abh\u00E4ngig vom \n[[YELLOW]]Akrobatiklevel.
|
||||
##Alchemy
|
||||
Guides.Alchemy.Section.0=[[DARK_AQUA]]\u00DCber Alchemie:\n[[YELLOW]]In Alchemie musst du Tr\u00E4nke brauen.\n[[YELLOW]]Mit h\u00F6herem Level werden die Tr\u00E4nke schneller\n[[YELLOW]]gebraut und neue Zutaten f\u00FCr zun\u00E4chst unerh\u00E4ltliche Tr\u00E4nke \n[[YELLOW]]freigeschaltet.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Tr\u00E4nke brauen.
|
||||
Guides.Alchemy.Section.1=[[DARK_AQUA]]Wie funktioniert Katalyse?\n[[YELLOW]]Katalyse beschleunigt das Brauen von Tr\u00E4nken bis\n[[YELLOW]]zu 4-facher Geschwindigkeit bei Level 1000.\n[[YELLOW]]
|
||||
Guides.Alchemy.Section.2=[[DARK_AQUA]]Wie funktioniert Braukunst?\n[[YELLOW]]Braukunst erm\u00F6glich das Brauen weiterer Tr\u00E4nke mit neuen\n[[YELLOW]]Zutaten.\n[[YELLOW]]Welche Zutaten m\u00F6glich sind, h\u00E4ngt vom Rang ab.\n[[YELLOW]]Insgesamt gibt es 8 R\u00E4nge zum freischalten.
|
||||
Guides.Alchemy.Section.3=[[DARK_AQUA]]Braukunst Tier 1 Zutaten:\n[[YELLOW]]Lohnenstaub, Fermentierte Spinnenaugen, Ghast Tr\u00E4nen,\n[[YELLOW]]Redstone, Glowstonestaub, Zucker, Glitzernde Melone,\n[[YELLOW]]Goldene Karotte, Magma Creme, Netherwarzen, Spinnenaugen, \n[[YELLOW]]Schwarzpulver, Seerose, Kugelfisch (Vanilla Tr\u00E4nke)
|
||||
Guides.Alchemy.Section.4=[[DARK_AQUA]]Braukunst Tier 2 Zutaten:\n[[YELLOW]]Karotte (Eile)\n[[YELLOW]]Schleimball (Langsamkeit)\n\n[[DARK_AQUA]]Braukunst Tier 3 Zutaten:\n[[YELLOW]]Quarz (Absoption)\n[[YELLOW]]Roter Pilz (Springen)
|
||||
Guides.Alchemy.Section.5=[[DARK_AQUA]]Braukunst Tier 4 Zutaten:\n[[YELLOW]]Apfel (Gesundheitsboost)\n[[YELLOW]]Verrottetes Fleisch (Hunger)\n\n[[DARK_AQUA]]Braukunst Tier 5 Zutaten:\n[[YELLOW]]Brauner Pilz(\u00DCbelkeit)\n[[YELLOW]]Tintensack (Blindheit)
|
||||
Guides.Alchemy.Section.6=[[DARK_AQUA]]Braukunst Tier 6 Zutaten:\n[[YELLOW]]Gras (S\u00E4ttigung)\n\n[[DARK_AQUA]]Braukunst Tier 7 Zutaten:\n[[YELLOW]]Giftige Kartoffel(Verwesung)\n\n[[DARK_AQUA]]Braukunst Tier 8 Zutaten:\n[[YELLOW]]Normaler Goldener Apfel (Resistenz)
|
||||
##Archery
|
||||
Guides.Archery.Section.0=[[DARK_AQUA]]\u00DCber Bogenschie\u00DFen:\n[[YELLOW]]In Bogenschie\u00DFen geht es um die Verwendung von Pfeil und\n[[YELLOW]]Bogen.\n\n[[YELLOW]]Es gibt unterschiedliche Kampfboni, wie Zusatzschaden,\n[[YELLOW]]der mit dem Level steigt und der F\u00E4higkeit Feinde im PVP\n[[YELLOW]]zu bet\u00E4uben. Zus\u00E4tzlich kannst du einige verschossene\n[[YELLOW]]Pfeile aus den Leichen deiner Feinde wiedergewinnen.
|
||||
Guides.Archery.Section.1=[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]XP erh\u00E4ltst du durch das Abschie\u00DFen von Monstern und\n[[YELLOW]]anderen Spielern.
|
||||
Guides.Archery.Section.2=[[DARK_AQUA]]Wie funktioniert der Kunstschuss?\n[[YELLOW]]Kunstschuss erh\u00F6ht den Schaden deines Schusses.\n[[YELLOW]]Der Zusatzschaden steigt mit deinem Bogen Level.\n[[YELLOW]]In den Standardeinstellungen steigt der Schaden um 10%\n[[YELLOW]]alle 50 Level, mit einem Maximum von 200% extra.
|
||||
Guides.Archery.Section.3=[[DARK_AQUA]]Wie Funktioniert Bet\u00E4ubung?\n[[YELLOW]]Du hast eine passive Wahrscheinlichkeit andere Spieler\n[[YELLOW]]zu bet\u00E4uben wenn du sie anschie\u00DFt. Der Spieler wird\n[[YELLOW]]gezwungen f\u00FCr eine kurze Weile senkrecht nach oben zu\n[[YELLOW]]schauen.\n[[YELLOW]]Ein Bet\u00E4ubungsschuss f\u00FCgt au\u00DFerdem 4 Schadenspunkte \n[[YELLOW]](2 Herzen) extra zu.
|
||||
Guides.Archery.Section.4=[[DARK_AQUA]]Wie funktioniert die Pfeilr\u00FCckgewinnung?\n[[YELLOW]]Du hast eine passive Wahrscheinlichkeit einige Pfeile\n[[YELLOW]]zur\u00FCckzubekommen wenn du Monster mit dem Bogen t\u00F6test.\n[[YELLOW]]Die Wahrscheinlichkeit steigt mit dem Bogen Level.\n[[YELLOW]]Standardm\u00E4\u00DFig steigt diese F\u00E4higkeit um 0.1% pro Level, bis\n[[YELLOW]]100% bei Level 1000.
|
||||
##Axes
|
||||
Guides.Axes.Section.0=[[DARK_AQUA]]\u00DCber Axt:\n[[YELLOW]]Mit dem Axt Skill kannst du die Axt f\u00FCr viel mehr als\n[[YELLOW]]nur abholzen verwenden! Du kannst Monster und Spieler\n[[YELLOW]]sprichw\u00F6rtlich weghacken und ihnen t\u00F6dliche\n[[YELLOW]]Schl\u00E4ge verpassen oder sie zur\u00FCckweichen lassen\n[[YELLOW]]Deine Axt zerst\u00F6rt au\u00DFerdem sehr gut R\u00FCstungen,\n[[YELLOW]]was mit h\u00F6herem Level noch mehr ansteigt.
|
||||
Guides.Axes.Section.1=[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um XP zu bekommen musst du Spieler oder Monster \n[[YELLOW]]mit einer Axt schlagen.
|
||||
Guides.Axes.Section.2=[[DARK_AQUA]]Wie funktioniert der Sch\u00E4delspalter?\n[[YELLOW]]Diese F\u00E4higkeit erlaubt dir einen Angriff mit Fl\u00E4chenschaden\n[[YELLOW]]auszuf\u00FChren.\n[[YELLOW]]Der Fl\u00E4chenschaden ist halb so gro\u00DF wie der \n[[YELLOW]]Hauptangriff, also perfekt f\u00FCr gro\u00DFe Ansammlungen von Mobs.
|
||||
Guides.Axes.Section.3=[[DARK_AQUA]]Wie funktionieren kritische Treffer?\n[[YELLOW]]Kritische Treffer sind eine passive F\u00E4higkeit\n[[YELLOW]]die ab und zu Zusatzschaden zuf\u00FCgen.\n[[YELLOW]]In den Standardeinstellungen wird alle 2 Level \n[[YELLOW]]die Wahrscheinlichkeit um 0.1% erh\u00F6ht. Das f\u00FCgt Mobs\n[[YELLOW]]doppelten und anderen Spielern 1,5 fachen Schaden zu.
|
||||
Guides.Axes.Section.4=[[DARK_AQUA]]Wie funktioniert die Axt-Beherrschung?\n[[YELLOW]]Axt Beherrschung ist eine passive F\u00E4higkeit die deinen\n[[YELLOW]]Axt-Schl\u00E4gen Zusatzschaden hinzuf\u00FCgt.\n[[YELLOW]]Standardm\u00E4\u00DFig steigt der Schaden um 1 alle 50 Level,\n[[YELLOW]]maximal auf 4 Extraschaden bei Level 200.
|
||||
Guides.Axes.Section.5=[[DARK_AQUA]]Wie funktioniert Wucht?\n[[YELLOW]]Schlage m\u00E4chtig zu und zerst\u00F6re R\u00FCstungen!\n[[YELLOW]]Wucht hat eine passive Wahrscheinlichkeit gegnerische\n[[YELLOW]]R\u00FCstung zu besch\u00E4digen. Dieser Schaden steigt mit deinem Axt\n[[YELLOW]]Level.
|
||||
Guides.Axes.Section.6=[[DARK_AQUA]]Wie funktioniert der Wucht-Schlag?\n[[YELLOW]]Du hast eine passive Chance Monster und\n[[YELLOW]]Spieler beim Schlag zur\u00FCckweichen zu lassen\n[[YELLOW]]Standardm\u00E4\u00DFig ist die Wahrscheinlichkeit 25%\n[[YELLOW]]Zus\u00E4tzlich f\u00FCgst du Zusatzschaden zu.
|
||||
##Excavation
|
||||
Guides.Excavation.Section.0=[[DARK_AQUA]]\u00DCber Graben:\n[[YELLOW]]Graben ist die F\u00E4higkeit Sch\u00E4tze im Dreck zu finden.\n[[YELLOW]]Durch Aufgraben des Landes wirst du Sch\u00E4tze finden\n[[YELLOW]]Je l\u00E4nger du das tust, desto mehr Sch\u00E4tze findest du.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]XP erh\u00E4ltst du durch Schaufeln.\n[[YELLOW]]Nur bestimmte Materialen geben XP und Sch\u00E4tze.
|
||||
Guides.Excavation.Section.1=[[DARK_AQUA]]Kompatible Materialien:\n[[YELLOW]]Gras, Erde, Sand, Lehm, Kies, Myzel, Seelensand, Schnee
|
||||
Guides.Excavation.Section.2=[[DARK_AQUA]]Wie funktioniert der Giga Bohrer?\n[[YELLOW]]Halte eine Schaufel in der Hand und mach Rechtsklick.\n[[YELLOW]]Von nun an hast du ca. 4 Sekunden um einen kompatiblem\n[[YELLOW]]Block abzubauen.\n[[YELLOW]]Daraufhin wird der Giga Bohrer aktiviert.
|
||||
Guides.Excavation.Section.3=[[DARK_AQUA]]Was ist der Giga Bohrer?\n[[YELLOW]]Giga Bohrer ist eine F\u00E4higkeit deren Dauer vom Graben Skill\n[[YELLOW]]abh\u00E4ngt.\n[[YELLOW]]Es verdreifacht die Wahrscheinlichkeit Sch\u00E4tze zu finden\n[[YELLOW]]und erm\u00F6glicht sofortiges Abbauen kompatibler Materialien.
|
||||
Guides.Excavation.Section.4=[[DARK_AQUA]]Wie funktioniert der Schatz J\u00E4ger?\n[[YELLOW]]Jeder m\u00F6gliche Schatz hat seine eigene Level Voraussetzung\n[[YELLOW]]um zu erscheinen, folglich ist es schwer[[YELLOW]]zu sagen inwiefern es \n[[YELLOW]]dir hilft ein höheres Level zu haben.\n[[YELLOW]]Je h\u00F6her das Level, desto mehr Sch\u00E4tze k\u00F6nnen gefunden\n[[YELLOW]]werden.
|
||||
Guides.Excavation.Section.5=Beachte au\u00DFerdem, dass jedes kompatible Material seine\n[[YELLOW]]eigenen einzigartigen Sch\u00E4tze hat.\n[[YELLOW]]Anders ausgedr\u00FCckt: Sch\u00E4tze die du in Kies findest\n[[YELLOW]]gibt es nicht zwingend in Erde.
|
||||
Guides.Excavation.Section.6=[[DARK_AQUA]]Bemerkung zu Graben:\n[[YELLOW]]Graben Drops sind vollkommen anpassbar\n[[YELLOW]]Ergebnisse unterscheiden sich deshalb von Server zu Server.
|
||||
##Fishing
|
||||
Guides.Fishing.Section.0=[[DARK_AQUA]]\u00DCber Angeln:\n[[YELLOW]]Mit dem Angeln Skill ist Angeln wieder aufregend!\n[[YELLOW]]Finde versteckte Sch\u00E4tze oder Rei\u00DFe Items von Monstern.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Fang Fische.
|
||||
Guides.Fishing.Section.1=[[DARK_AQUA]]Wie funktioniert der Schatz J\u00E4ger?\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du beim Angeln Sch\u00E4tze finden.\n[[YELLOW]]Diese k\u00F6nnen sogar verzaubert sein!\n[[YELLOW]]Jeder m\u00F6gliche Schatz kann mit jedem Level gefunden\n[[YELLOW]]werden. Die H\u00E4ufigkeit h\u00E4ngt von dem Wert des Items ab.\n[[YELLOW]]Je h\u00F6her der Angeln Skill ist, desto einfacher wird es\n[[YELLOW]]wertvolle Sch\u00E4tze zu finden.
|
||||
Guides.Fishing.Section.2=[[DARK_AQUA]]Wie funktioniert Eisangeln?\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du in Eisseen angeln!\n[[YELLOW]]Wirf deine Angeln in einem Eissee aus\n[[YELLOW]]um ein kleines Loch zum Angeln zu erstellen.
|
||||
Guides.Fishing.Section.3=[[DARK_AQUA]]Wie funktioniert die Profiangel?\n[[YELLOW]]Mit dieser passiven F\u00E4higkeit bei\u00DFen mehr Fische an.\n[[YELLOW]]Sobald die F\u00E4higkeit freigeschaltet ist bringt das Angeln\n[[YELLOW]]in einem Boot oder Ozean die doppelte \n[[YELLOW]]Anbei\u00DFwahrscheinlichkeit.
|
||||
Guides.Fishing.Section.4=[[DARK_AQUA]]Wie funktioniert Rei\u00DFen?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glich es Monstern Items zu entrei\u00DFen,\n[[YELLOW]]indem du sie an deine Angel h\u00E4ngst. \n[[YELLOW]]Die Monster lassen das Item, das sie normalerweise beim Tod\n[[YELLOW]]fallen lassen fallen.\n[[YELLOW]]Au\u00DFerdem gibt es eine kleine Wahrscheinlichkeit Monstersch\u00E4del\n[[YELLOW]]zu bekommen.
|
||||
Guides.Fishing.Section.5=[[DARK_AQUA]]Wie funktioniert die Fischer-Mahlzeit?\n[[YELLOW]]Du wirst beim Essen von Fisch besser satt.
|
||||
Guides.Fishing.Section.6=[[DARK_AQUA]]Bemerkung zum Angeln:\n[[YELLOW]]Angeln Drops sind vollkommen anpassbar.\n[[YELLOW]]Ergebnisse unterscheiden sich deshalb von Server zu Server.
|
||||
##Herbalism
|
||||
Guides.Herbalism.Section.0=[[DARK_AQUA]]\u00DCber Pflanzenkunde\n[[YELLOW]]In Pflanzenkunde geht es um das Ernten.\n\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Ernte Pflanzen.
|
||||
Guides.Herbalism.Section.1=[[DARK_AQUA]]Kompatible Blocks\n[[YELLOW]]Weizen, Kartoffeln, Karotten, Melonen, K\u00FCrbisse,\n[[YELLOW]]Zuckerrohr, Kakaobohnen, Blumen, Kakteen,\n[[YELLOW]]Pilze, Netherwarzen, Seerosen und Ranken.
|
||||
Guides.Herbalism.Section.2=[[DARK_AQUA]]Wie funktioniert Gr\u00FCnes Land?\n[[YELLOW]]Gr\u00FCnes Land ist eine aktive F\u00E4higkeit die du aktivierst indem du\n[[YELLOW]]mit einer Harke in der Hand rechtsklickst.\n[[YELLOW]]Gr\u00FCnes Land erm\u00f6glicht einen 3-fachen Ertrag beim Ernten.\n[[YELLOW]]Au\u00DFerdem erm\u00F6glich es Leben in zu hauchen und sie\n[[YELLOW]]mithilfe von Samen aus dem Inventar zu verwandeln.
|
||||
Guides.Herbalism.Section.3=[[DARK_AQUA]]Wie funktioniert der Gr\u00FCne Daumen (Samen)?\n[[YELLOW]]Diese passive F\u00E4higkeit pflanz automatisch beim Ernten nach.\n[[YELLOW]]Der Erfolg h\u00E4ngt vom Pflanzenkunde Level ab.
|
||||
Guides.Herbalism.Section.4=[[DARK_AQUA]]Wie funktioniert der Gr\u00FCne Daumen(Blocks)?\n[[YELLOW]]Diese aktive F\u00E4higkeit erm\u00F6glich es Bl\u00F6cke in ihre \n[[YELLOW]]"Naturverwandte" Form zu verwandeln. Klicke dazu mit der\n[[YELLOW]]rechten Maustaste auf einen Block, w\u00E4hrend du Samen in\n[[YELLOW]]der Hand h\u00E4ltst. \n[[YELLOW]]Pro Versuch kostet es dich einen Samen.\n[[YELLOW]]Der Erfolg h\u00E4ngt vom Pflanzenkunde Level ab.
|
||||
Guides.Herbalism.Section.5=[[DARK_AQUA]]Wie funktioniert das Bauernfr\u00FChst\u00FCck?\n[[YELLOW]]Du wirst beim Essen von Brot, Keksen, Melonen, Pilzsuppe,\n[[YELLOW]]Karotten und Kartoffeln satter.
|
||||
Guides.Herbalism.Section.6=[[DARK_AQUA]]Wie funktioniert Hylians Gl\u00FCck?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dir eine Chance Items zu finden\n[[YELLOW]]wenn du bestimmte Bl\u00F6cke mit dem Schwert abbaust.
|
||||
Guides.Herbalism.Section.7=[[DARK_AQUA]]Wie funktionieren Doppeldrops?\n[[YELLOW]]Du erh\u00E4ltst beim Ernten mehr Ertrag.
|
||||
##Mining
|
||||
Guides.Mining.Section.0=[[DARK_AQUA]]\u00DCber Bergbau:\n[[YELLOW]]Im Bergbau musst du Steine und Erze sammeln. Du erh\u00E4ltst\n[[YELLOW]]ab und zu zus\u00E4tzliche Drops.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um Erfahrung zu sammeln musst du mit der Spitzhacke abbauen.\n[[YELLOW]]Nur bestimmte Blocks geben XP.
|
||||
Guides.Mining.Section.1=[[DARK_AQUA]]Kompatible Materialien:\n[[YELLOW]]Stein, Kohleerz, Eisenerz, Golderz, Diamanterz, Redstoneerz,\n[[YELLOW]]Lapiserz, Obsidian, Bemooster Bruchstein, Endstein,\n[[YELLOW]]Glowstone, und Netherrack.
|
||||
Guides.Mining.Section.2=[[DARK_AQUA]]Wie funktioniert Super-Brecher?:\n[[YELLOW]]Mache einen Rechtsklick w\u00E4hrend du eine Spitzhacke in der\n[[YELLOW]]Hand h\u00E4ltst.\n[[YELLOW]]Von nun an hast du ungef\u00E4hr 4 Sekunden um ein mit Bergbau\n[[YELLOW]]kompatibles Material abzubauen, daraufhin wird Super-Brecher\n[[YELLOW]]aktiviert.
|
||||
Guides.Mining.Section.3=[[DARK_AQUA]]Was ist Super-Brecher?\n[[YELLOW]]Super-Brecher ist eine F\u00E4higkeit deren Dauer\n[[YELLOW]]vom Bergbau Skill abh\u00E4ngt. Es verdreifacht die \n[[YELLOW]]Wahrscheinlichkeit Sch\u00E4tze zu finden und erm\u00F6glicht\n[[YELLOW]]sofortiges Abbauen kompatibler Materialien.
|
||||
Guides.Mining.Section.4=[[DARK_AQUA]]Wie benutzt man Z\u00FCndstoff?:\n[[YELLOW]]Halte ein Feuerzeug in der Hand, b\u00FCck dich und klicke aus\n[[YELLOW]]sicherer Entfernung mit der rechten Maustaste auf das TNT.\n[[YELLOW]]Das TNT wird sofort explodieren.
|
||||
Guides.Mining.Section.5=[[DARK_AQUA]]Wie funktioniert Z\u00FCndstoff?\n[[YELLOW]]Z\u00FCndstoff ist eine F\u00E4higkeit mit einer Abklingzeit, deren St\u00E4rke\n[[YELLOW]]vom Level abh\u00E4ngt. Sie erlaubt dir beim Abbauen mit TNT dieses\n[[YELLOW]]aus der Ferne zu z\u00FCnden. Z\u00FCndstoff besteht aus 3 Teilen.\n[[YELLOW]]Erstens dem Sprengmeister mit gr\u00F6\u00DFeren Explosionen\n[[YELLOW]]Zweitens dem Explosions-Experten, der Schaden von TNT\n[[YELLOW]]reduziert.\n[[YELLOW]]Die dritte F\u00E4higkeit erh\u00F6ht einfach den Erzertrag und\n[[YELLOW]]und reduziert den Schutt.
|
||||
##Repair
|
||||
Guides.Repair.Section.0=[[DARK_AQUA]]\u00DCber Reparatur:\n[[YELLOW]]Reparatur erlaub dir an einem Eisenblock Werkzeuge und\n[[YELLOW]]Waffen zu reparieren.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Repariere Werkzeuge am Eisenblockamboss\n[[RED]]Achtung: [[YELLOW]]Das ist nicht der normale Minecraft Amboss!
|
||||
Guides.Repair.Section.1=[[DARK_AQUA]]Wie kann ich Reparatur verwenden?\n[[YELLOW]]Platziere einen mcMMO Amboss, halte das zu reparierende Item\n[[YELLOW]]in der Hand und klicke mit der rechten Maustaste auf ihn. Zum\n[[YELLOW]]Reparieren benötigst du die Ausgangsmaterialien im Inventar,\n[[YELLOW]]diese werden dir im Zuge der Reparatur abgezogen.
|
||||
Guides.Repair.Section.2=[[DARK_AQUA]]Wie funktioniert der Reparatur Meister?\n[[YELLOW]]Mit dem Reparatur Meister wird dein Werkzeug ein bisschen\n[[YELLOW]]besser als normalerweise repariert.\n[[YELLOW]]Der Bonus ist abh\u00E4ngig vom Reparatur Level.
|
||||
Guides.Repair.Section.3=[[DARK_AQUA]]Wie funktioniert Super Reparatur?\n[[YELLOW]]Mit Super Reparatur werden ab und zu deine Items\n[[YELLOW]]doppelt so gut repariert.
|
||||
Guides.Repair.Section.4=[[DARK_AQUA]]Wie funktioniert Arkanes Schmieden?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glicht dir mit einer gewissen\n[[YELLOW]]Wahrscheinlichkeit Verzauberungen auf Items zu erhalten.\n[[YELLOW]]Verzauberungen k\u00F6nnen erhalten, vermindert werden oder\n[[YELLOW]]ganz verloren gehen.
|
||||
##Salvage
|
||||
Guides.Salvage.Section.0=[[DARK_AQUA]]\u00DCber Verwerten:\n[[YELLOW]]Mit einem Goldamboss kannst du R\u00FCstungen und\n[[YELLOW]]Werkzeuge verwerten.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Verwerten ist ein vom Angeln und Reparieren abh\u00E4ngiger Skill\n[[YELLOW]]Sein Level ist die H\u00E4lfte von deren Summe.
|
||||
Guides.Salvage.Section.1=[[DARK_AQUA]]Wie funktioniert Verwerten?\n[[YELLOW]]Platziere einen Goldamboss und rechtsklicke mit dem Item in\n[[YELLOW]]der Hand. Das item wird zerst\u00F6rt und in seine\n[[YELLOW]]Bestandteile zerlegt.\n\n[[YELLOW]]Beispielsweise gibt eine Eisenaxt Eisenbarren.
|
||||
Guides.Salvage.Section.2=[[DARK_AQUA]]Wie funktioniert Fortgeschrittenes Verwerten?\n[[YELLOW]]Sobald freigeschaltet, kannst du besch\u00E4digte Items verwerten.\n[[YELLOW]]Der Ertrag steigt mit dem Level.\n[[YELLOW]]Der Mindestertrag ist immer 1 Item, ansonsten kannst du nicht\n[[YELLOW]]verwerten.
|
||||
Guides.Salvage.Section.3=[[DARK_AQUA]]Zur Verbildlichung ein Beispiel:\n[[YELLOW]]Sagen wir verwerten eine Goldene Spitzhacke mit 80%\n[[YELLOW]]Haltbarkeit, bedeutet das, dass wir nur 2 Gold bekommen\n[[YELLOW]]k\u00F6nnen (Spitzhacke=3 Goldbarren, also jeder 33,33%\n[[YELLOW]]Haltbarkeit) was 66% entspricht. Wenn dein\n[[YELLOW]]Ertragsprozentsatz unter 66% liegt wirst du keine 2 Barren\n[[YELLOW]]bekommen k\u00F6nnen. Wenn sie dar\u00FCber ist, kannst du den\n[[YELLOW]]"gesamten Betrag" bekommen, der aus 2 Eisenbarren besteht.
|
||||
Guides.Salvage.Section.4=[[DARK_AQUA]]Wie funktioniert Arkanes Verwerten?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glicht es verzauberte B\u00FCcher beim\n[[YELLOW]]Verwerten von verzauberten Items zu bekommen.\n[[YELLOW]]Verzauberungen k\u00F6nnen vollkommen oder teilweise extrahiert\n[[YELLOW]]werden.\n[[YELLOW]]Bei einer teilweisen Extraktion wird das Verzauberungslevel\n[[YELLOW]]reduziert.
|
||||
##Smelting
|
||||
Guides.Smelting.Section.0=Kommt irgendwann mal...
|
||||
Guides.Smelting.Section.1=Immer noch hier?
|
||||
##Swords
|
||||
Guides.Swords.Section.0=[[DARK_AQUA]]\u00DCber Schwerter:\n[[YELLOW]]Diese F\u00E4higkeit gibt Kampfboni bei Benutzung\n[[YELLOW]]des Schwertes.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Verletze Monster und Spieler mit dem Schwert.
|
||||
Guides.Swords.Section.1=[[DARK_AQUA]]Wie funktioniert der S\u00E4gezahnschlag??\n[[YELLOW]]S\u00E4gezahnschlag ist eine aktive F\u00E4higkeit die du mit Rechtsklick \n[[YELLOW]]aktivierst.\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du Fl\u00E4chenschaden verteilen. \n[[YELLOW]]Au\u00DFerdem blutet das Ziel f\u00FCr kurze Zeit.
|
||||
Guides.Swords.Section.2=[[DARK_AQUA]]Wie funktioniert der Gegenangriff?\n[[YELLOW]]Gegenangriff ist eine aktive F\u00E4higkeit,\n[[YELLOW]]bei der Angriffe von Monstern beim Blocken um bis zu 50%\n[[YELLOW]]des erhaltenen Schadens reflektiert werden k\u00F6nnen.
|
||||
Guides.Swords.Section.3=[[DARK_AQUA]]Wie funktioniert Blutung?\n[[YELLOW]]Blutung f\u00FCgt den Gegnern alle 2 Sekunden Schaden zu. Das\n[[YELLOW]]Bluten geht solange bis die F\u00E4higkeit ausl\u00E4uft oder der\n[[YELLOW]]Gegner stirbt.\n[[YELLOW]]Die Dauer der Blutung erh\u00F6ht sich mit dem Schwert Skill.
|
||||
##Taming
|
||||
Guides.Taming.Section.0=[[DARK_AQUA]]\u00DCber Z\u00E4hmen:\n[[YELLOW]]Z\u00E4hmen gibt dem Spieler diverse Kampfboni beim Kampf mit\n[[YELLOW]]gez\u00E4hmten W\u00F6lfen.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um XP zu bekommen musst du Tiere z\u00E4hmen oder mit\n[[YELLOW]]deinen W\u00F6lfen k\u00E4mpfen.
|
||||
Guides.Taming.Section.1=[[DARK_AQUA]]Wie funktioniert Ruf der Wildnis?\n[[YELLOW]]Ruf der Wildnis ist eine aktive F\u00E4higkeit die dir erlaubt\n[[YELLOW]]einen Wolf, einen Ozelot oder ein Pferd an deine Seite zu\n[[YELLOW]]rufen. \n[[YELLOW]]Das tust du, indem du Linksklickst w\u00E4hrend du Knochen, Fisch\n[[YELLOW]]oder \u00C4pfel in der Hand h\u00E4ltst.
|
||||
Guides.Taming.Section.2=[[DARK_AQUA]]Wie funktioniert Bestienkunde?\n[[YELLOW]]Bestienkunde erlaubt es die Haustiere zu inspizieren\n[[YELLOW]]Halte einen Knochen in der Hand und klick mit linker Maustaste\n[[YELLOW]]auf das Haustier um Bestienkunde zu aktivieren.
|
||||
Guides.Taming.Section.3=[[DARK_AQUA]]Wie funktioniert Aufschlitzen?\n[[YELLOW]]Aufschlitzen ist eine passive F\u00E4higkeit die beim Ziel\n[[YELLOW]]des Wolfes Blutungen hervorrufen kann. Der Erfolg h\u00E4ngt\n[[YELLOW]]vom Z\u00E4hmen Level ab.
|
||||
Guides.Taming.Section.4=[[DARK_AQUA]]Wie funktionieren gesch\u00E4rfte Klauen?\n[[YELLOW]]Gesch\u00E4rfte Klauen geben Zusatzschaden in Abh\u00E4ngigkeit\n[[YELLOW]]vom Z\u00E4hmen Level.
|
||||
Guides.Taming.Section.5=[[DARK_AQUA]]Wie funktioniert Umweltbewusst?\n[[YELLOW]]Diese passive F\u00E4higkeit erm\u00F6glich W\u00F6lfen sich zu dir zu\n[[YELLOW]]teleportieren wenn sie in die N\u00E4he von Gefahren wie \n[[YELLOW]]Kakteen/Lava kommen. \n[[YELLOW]]Zus\u00E4tzlich sind W\u00F6lfe immun gegen Fallschaden.
|
||||
Guides.Taming.Section.6=[[DARK_AQUA]]Wie funktioniert Dicker Pelz?\n[[YELLOW]]Diese passive F\u00E4higkeit reduziert Schaden und \n[[YELLOW]]macht W\u00F6lfe feuerresistent.
|
||||
Guides.Taming.Section.7=[[DARK_AQUA]]Wie funktioniert Schocksicher?\n[[YELLOW]]Diese passive F\u00E4higkeit reduziert den Schaden\n[[YELLOW]]durch Explosionen.
|
||||
Guides.Taming.Section.8=[[DARK_AQUA]]Wie funktioniert Schnell-Imbiss?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dem Wolf eine Chance sich zu \n[[YELLOW]]erholen wann immer er einen Gegner verletzt.
|
||||
##Unarmed
|
||||
Guides.Unarmed.Section.0=[[DARK_AQUA]]\u00DCber Unbewaffnet:\n[[YELLOW]]Mit Unbewaffnet kann der echte Mann endlich mit seinen\n[[YELLOW]]F\u00E4usten angemessen zuschlagen. \n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]K\u00E4mpfe unbewaffnet gegen Monster und andere Spieler
|
||||
Guides.Unarmed.Section.1=[[DARK_AQUA]]Wie funktioniert Berserker?\n[[YELLOW]]Berserker ist eine aktive F\u00E4higkeit die mit Rechtsklick\n[[YELLOW]]aktiviert wird.\n[[YELLOW]]Im Berserker Modus f\u00FCgst du 50% mehr Schaden zu und\n[[YELLOW]]kannst weiche Materiale wie Gras und Erde sofort abbauen.
|
||||
Guides.Unarmed.Section.2=[[DARK_AQUA]]Wie funktioniert der Eiserne Arm?\n[[YELLOW]]Eiserner Arm erh\u00F6ht den Monstern und Spielern mit den\n[[YELLOW]]F\u00E4usten zugef\u00FCgten Schaden.
|
||||
Guides.Unarmed.Section.3=[[DARK_AQUA]]Wie funktioniert Pfeilablenkung?\n[[YELLOW]]Pfeilablenkung ist eine passive F\u00E4higkeit die ab und zu\n[[YELLOW]]Pfeile von Skeletten und angreifenden Spielern ablenkt.\n[[YELLOW]]Diese Pfeile prallen einfach ab und fallen auf den Boden.
|
||||
Guides.Unarmed.Section.4=[[DARK_AQUA]]Wie funktioniert der Eiserne Griff?\n[[YELLOW]]Eiserner Griff ist eine passive F\u00E4higkeit die Entwaffnung\n[[YELLOW]]verhindert. Mit h\u00F6herem Level ist es umso einfacher\n[[YELLOW]]Entwaffnung zu verhindern.
|
||||
Guides.Unarmed.Section.5=[[DARK_AQUA]]Wie funktioniert Entwaffnen?\n[[YELLOW]]Diese passive F\u00E4higkeit erm\u00F6glich es den Gegner zu\n[[YELLOW]]entwaffnen, sodass seine Waffe auf den Boden f\u00E4llt.
|
||||
##Woodcutting
|
||||
Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u00DCber Holzf\u00E4ller:\n[[YELLOW]]Im Holzf\u00E4llen geht es um das F\u00E4llen von B\u00E4umen.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Du kriegst XP f\u00FCr das abholzen von Baumst\u00E4mmen.
|
||||
Guides.Woodcutting.Section.1=[[DARK_AQUA]]Wie funktioniert der Baumf\u00E4ller?\n[[YELLOW]]Baumf\u00E4ller ist eine aktive F\u00E4higkeit. Mache mit der Axt in der\n[[YELLOW]]Hand einen Rechtsklick um sie zu aktivieren. Der Baum\n[[YELLOW]]wird sofortig gef\u00E4llt und alle St\u00E4mme abgebaut.
|
||||
Guides.Woodcutting.Section.2=[[DARK_AQUA]]Wie funktioniert Bl\u00E4ttersturm?\n[[YELLOW]]Bl\u00E4ttersturm ist eine passive F\u00E4higkeit die Bl\u00E4tter\n[[YELLOW]]bei Ber\u00FChrung mit der Axt sofortig bricht. Standardm\u00E4\u00DFig\n[[YELLOW]]wird diese F\u00E4higkeit bei Level 100 freigeschaltet.
|
||||
Guides.Woodcutting.Section.3=[[DARK_AQUA]]Wie funktionieren Doppel-Drops?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dir ab und zu doppelten\n[[YELLOW]]Ertrag f\u00FCr jeden Stamm den du f\u00E4llst.
|
||||
#INSPECT
|
||||
Inspect.Offline=[[RED]]Du hast nicht die Rechte um offline Spieler zu inspizieren!
|
||||
Inspect.OfflineStats=mcMMO Stats f\u00FCr Offline Spieler [[YELLOW]]{0}
|
||||
Inspect.Stats=[[GREEN]]mcMMO Stats f\u00FCr [[YELLOW]]{0}
|
||||
Inspect.TooFar=Du bist zu weit entfernt um den Spieler zu inspizieren!
|
||||
#ITEMS
|
||||
Item.ChimaeraWing.Fail=**CHIMAERA FL\u00DCGEL GESCHEITERT!**
|
||||
Item.ChimaeraWing.Pass=**CHIMAERA FL\u00DCGEL*
|
||||
Item.ChimaeraWing.Name=Chimaera Fl\u00FCgel
|
||||
Item.ChimaeraWing.Lore=[[GRAY]]Teleportiert dich zu deinem Bett.
|
||||
Item.Generic.Wait=Du musst warten bis du das wieder verwenden kannst! [[YELLOW]]({0}s)
|
||||
Item.Injured.Wait=Du wurdest vor kurzem verletzt und musst warten bis du das verwenden kannst. [[YELLOW]]({0}s)
|
||||
Item.FluxPickaxe.Name=Flux Spitzhacke
|
||||
Item.FluxPickaxe.Lore.1=[[GRAY]]Hat eine Wahrscheinlichkeit Erze sofort zu schmelzen.
|
||||
Item.FluxPickaxe.Lore.2=[[GRAY]]Ben\u00F6tigt Schmelzen Level {0}+
|
||||
#TELEPORTATION
|
||||
Teleport.Commencing=[[GRAY]]Beginne Teleport in [[GOLD]]({0}) [[GRAY]]Sekunden, bitte stillhalten...
|
||||
Teleport.Cancelled=[[DARK_RED]]Teleport abgebrochen!
|
||||
#SKILLS
|
||||
Skills.Child=[[GOLD]](VERWANDTER SKILL)
|
||||
Skills.Disarmed=[[DARK_RED]]Du wurdest entwaffnet!
|
||||
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
|
||||
Skills.NeedMore=[[DARK_RED]]Du brauchst mehr[[GRAY]]{0}
|
||||
Skills.Parents=ELTERN
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.ChildStats={0}[[GREEN]]{1}
|
||||
Skills.TooTired=Du bist zu m\u00FCde um diese F\u00E4higkeit zu verwenden. [[YELLOW]]({0}s)
|
||||
Skills.Cancelled={0} abgebrochen!
|
||||
Skills.ConfirmOrCancel=[[GREEN]]Erneuter Rechtsklick zur Best\u00E4tigung [[GOLD]]{0}[[GREEN]]. Linksklick zum abbrechen.
|
||||
#STATISTICS
|
||||
Stats.Header.Combat=[[GOLD]]-=KAMPFSKILLS=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=SAMMELSKILLS=-
|
||||
Stats.Header.Misc=[[GOLD]]-=DIV.SKILLS=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] Stats
|
||||
#PERKS
|
||||
Perks.XP.Name=Erfahrung
|
||||
Perks.XP.Desc=Erhalte mehr Erfahrung in bestimmen Skills.
|
||||
Perks.Lucky.Name=Gl\u00FCck
|
||||
Perks.Lucky.Desc={0} Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert.
|
||||
Perks.Lucky.Desc.Login=Bestimmte Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert.
|
||||
Perks.Lucky.Bonus=[[GOLD]] ({0} mit Gl\u00FCcksbonus)
|
||||
Perks.Cooldowns.Name=Schnelle Erholung
|
||||
Perks.Cooldowns.Desc=Verk\u00FCrzt die Abklingzeit um {0}.
|
||||
Perks.ActivationTime.Name=Ausdauer
|
||||
Perks.ActivationTime.Desc=Erh\u00F6ht die F\u00E4higkeitszeit um {0} Sekunden.
|
||||
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s mit Ausdauer Bonus)
|
||||
#HARDCORE
|
||||
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Hardcore Modus {0} deaktiviert f\u00FCr {1}.
|
||||
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Hardcore Modus {0} aktiviert f\u00FCr {1}.
|
||||
Hardcore.DeathStatLoss.Name=Skillverlust bei Tod:
|
||||
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Du hast durch den Tod[[BLUE]]{0}[[DARK_RED]] Level verloren.
|
||||
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] Der Verlustprozentsatz wurde auf {0} ge\u00E4ndert.
|
||||
Hardcore.Vampirism.Name=Vampirismus
|
||||
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] war nicht erfahren genug um dir Wissen zu hinterlassen.
|
||||
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Du hast [[BLUE]]{0}[[DARK_AQUA]] Level von [[YELLOW]]{1} [[DARK_AQUA]] gestohlen.
|
||||
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] hat es nicht geschafft Wissen von dir zu stehlen!
|
||||
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] hat[[BLUE]]{1}[[DARK_RED]] Level von dir gestohlen!
|
||||
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] Der Vampirismus Prozentsatz wurde auf {0} ge\u00E4ndert.
|
||||
#MOTD
|
||||
MOTD.Donate=[[DARK_AQUA]]Spenden Info:
|
||||
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Hardcore Modus aktiviert: [[DARK_RED]]{0}
|
||||
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Skillverlust bei Tod: [[DARK_RED]]{0}%
|
||||
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Vampirismus Prozentsatz: [[DARK_RED]]{0}%
|
||||
MOTD.PerksPrefix=[mcMMO Boni]
|
||||
MOTD.Version=[[GOLD]][mcMMO] Verwende Version[[DARK_AQUA]]{0}
|
||||
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Webseite
|
||||
#SMELTING
|
||||
Smelting.Ability.FluxMining=Schmelztiegel: [[YELLOW]]{0}
|
||||
Smelting.Ability.FuelEfficiency=Brennstoff Effizienz Multiplikator: [[YELLOW]]{0}x
|
||||
Smelting.Ability.Locked.0=GESPERRT bis {0}+ Skill (XP BOOST)
|
||||
Smelting.Ability.Locked.1=GESPERRT bis {0}+ Skill (SCHMELZTIEGEL)
|
||||
Smelting.Ability.SecondSmelt=Extra Schmelzung: [[YELLOW]]{0}
|
||||
Smelting.Ability.VanillaXPBoost=Vanilla XP Multiplikator: [[YELLOW]]{0}x
|
||||
Smelting.SubSkill.FuelEfficiency.Name=Brennstoff Effizienz
|
||||
Smelting.SubSkill.FuelEfficiency.Description=Erh\u00F6he die Brenndauer des Brennstoffes in \u00D6fen
|
||||
Smelting.SubSkill.SecondSmelt.Name=Extra Schmelzung
|
||||
Smelting.SubSkill.SecondSmelt.Description=Verdoppelt den Ertrag beim Schmelzen
|
||||
Smelting.Effect.4=Vanilla XP Boost
|
||||
Smelting.Effect.5=Erh\u00F6ht die erhaltene Erfahrung beim Schmelzen
|
||||
Smelting.SubSkill.FluxMining.Name=Schmelztiegel
|
||||
Smelting.SubSkill.FluxMining.Description=M\u00F6glichkeit, Erze direkt beim Abbauen zu Schmelzen
|
||||
Smelting.Listener=Schmelzen:
|
||||
Smelting.SkillName=SCHMELZEN
|
||||
#COMMAND DESCRIPTIONS
|
||||
Commands.Description.addlevels=Gib einem Spieler mcMMO Level
|
||||
Commands.Description.adminchat=Schalte den mcMMO Adminchat an/aus oder sende Adminchat Nachrichten
|
||||
Commands.Description.addxp=Gib einem Spieler mcMMO XP
|
||||
Commands.Description.hardcore=\u00C4ndere den mcMMO hardcore Prozentsatz oder schalte den hardcore Modus an/aus
|
||||
Commands.Description.inspect=Sieh detaillierte mcMMO Informationen \u00FCber einen anderen Spieler
|
||||
Commands.Description.mcability=Schalte die Bereitschaft von mcMMO F\u00E4higkeiten bei Rechtsklick an/aus
|
||||
Commands.Description.mccooldown=Sieh alle mcMMO F\u00E4higkeiten Abklingzeiten
|
||||
Commands.Description.mcgod=Schalte mcMMO godmode an/aus
|
||||
Commands.Description.mchud=\u00C4ndere deinen mcMMO HUD Stil
|
||||
Commands.Description.mcmmo=Zeige eine kurze Beschreibung von mcMMO
|
||||
Commands.Description.mcnotify=Schalte die meisten mcMMO F\u00E4higkeiten Hinweise im Chat an/aus
|
||||
Commands.Description.mcpurge=Bereinige die mcMMO Datenbank von Spielern die {0} Monate nicht online waren oder 0 Level haben.
|
||||
Commands.Description.mcrank=Zeige das mcMMO Ranking f\u00FCr einen Spieler
|
||||
Commands.Description.mcrefresh=Aktualisiere alle Abklingzeiten f\u00FCr mcMMO
|
||||
Commands.Description.mcremove=Entferne einen Benutzer aus der mcMMO Datenbank
|
||||
Commands.Description.mcscoreboard=Verwalte deine mcMMO \u00DCbersicht
|
||||
Commands.Description.mcstats=Zeige deine mcMMO Level und XP
|
||||
Commands.Description.mctop=Zeige die mcMMO Bestenlisten
|
||||
Commands.Description.mmoedit=Editiere die mcMMO Level bei einem Benutzer
|
||||
Commands.Description.mmoupdate=Migriere die mcMMO Datenbank von einer alten Datenbank zur aktuellen
|
||||
Commands.Description.mcconvert=Konvertiert Datenbanktypen oder Erfahrungsformeln
|
||||
Commands.Description.mmoshowdb=Zeige den Namen der aktuellen Datenbank (zur Benutzung mit /mmoupdate)
|
||||
Commands.Description.party=Steuere verschiedene mcMMO Party Einstellungen
|
||||
Commands.Description.partychat=Schalte den mcMMO Party Chat an/aus oder send Party Nachrichten
|
||||
Commands.Description.ptp=Teleportiere zu einem mcMMO Party Mitglied
|
||||
Commands.Description.Skill=Zeige detaillierte Informationen zu einem mcMMO Skill {0}
|
||||
Commands.Description.skillreset=Setze die mcMMO Level f\u00FCr einen Spieler zur\u00FCck
|
||||
Commands.Description.vampirism=Schalte Vampirismus an/aus / \u00E4ndere den Vampirismus Prozentsatz
|
||||
Commands.Description.xplock=Setze deine mcMMO XP-Leiste auf einen bestimmten Skill fest
|
||||
Commands.Description.xprate=\u00C4ndere die mcMMO XP Rate oder starte ein XP Event
|
||||
#UPDATE CHECKER
|
||||
UpdateChecker.Outdated=Du verwendest eine veraltete mcMMO Version!
|
||||
UpdateChecker.NewAvailable=Eine neue Version ist auf BukkitDev erh\u00E4ltlich.
|
||||
#SCOREBOARD HEADERS
|
||||
Scoreboard.Header.PlayerStats=mcMMO Stats
|
||||
Scoreboard.Header.PlayerCooldowns=mcMMO Abklingzeiten
|
||||
Scoreboard.Header.PlayerRank=mcMMO Bestenlisten
|
||||
Scoreboard.Header.PlayerInspect=mcMMO Stats: {0}
|
||||
Scoreboard.Header.PowerLevel=Gesamt Level
|
||||
Scoreboard.Misc.PowerLevel=[[GOLD]]Gesamt Level
|
||||
Scoreboard.Misc.Level=[[DARK_AQUA]]Level
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]Aktuelle XP
|
||||
Scoreboard.Misc.RemainingXP=Verbliebene XP
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Abklingzeit
|
||||
Scoreboard.Misc.Overall=[[GOLD]]Insgesamt
|
||||
Scoreboard.Misc.Ability=F\u00E4higkeit
|
||||
#DATABASE RECOVERY
|
||||
Profile.Loading.Success=[[GREEN]]Your mcMMO profile has been loaded.
|
||||
Profile.Loading.Failure=mcMMO still cannot load your data. You may want to [[AQUA]]contact the server owner.\n[[YELLOW]]You can still play on the server, but you will have [[BOLD]]no mcMMO levels[[YELLOW]] and any XP you get [[BOLD]]will not be saved[[YELLOW]].
|
||||
Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO was unable to load the player data for [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Please inspect your database setup.
|
||||
@@ -1,162 +0,0 @@
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**Kecses Landol\u00e1s**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Elker\u00fclve**
|
||||
Acrobatics.Listener=Akrobatika:
|
||||
Acrobatics.SkillName=AKROBATIKA
|
||||
Acrobatics.Skillup=Akrobatika fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Archery.Listener=\u00cdj\u00e1szat:
|
||||
Archery.SkillName=\u00cdJ\u00c1SZAT
|
||||
Archery.Skillup=\u00cdj\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Axes.Ability.Bonus.0=Mesteri balta
|
||||
Axes.Ability.Lower=[[GRAY]]**LETETTED A BALT\u00c1DAT**
|
||||
Axes.Ability.Ready=[[GREEN]]**ELK\u00c9SZ\u00cdTETTED BALT\u00c1DAT**
|
||||
Axes.Combat.GI.Struck=**HATALMAS EREJ\u0170 \u00dcT\u00c9S**
|
||||
Axes.SubSkill.CriticalStrikes.Description=Dupla sebz\u00e9s
|
||||
Axes.SubSkill.AxeMastery.Name=Mesteri balta
|
||||
Axes.Listener=Balt\u00e1k:
|
||||
Axes.SkillName=BALT\u00c1K
|
||||
Axes.Skills.SS.On=[[GREEN]]**Koponya T\u00f6r\u0151 AKTIV\u00c1LVA**
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Koponya T\u00f6r\u0151t!
|
||||
Excavation.Ability.Lower=[[GRAY]]**LETETTED AZ \u00c1S\u00d3DAT**
|
||||
Excavation.Ability.Ready=[[GREEN]]**EL\u0150VETTED AZ \u00c1S\u00d3DAT**
|
||||
Excavation.Listener=\u00c1s\u00e1s:
|
||||
Excavation.SkillName=\u00c1S\u00c1S
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]A TE [[YELLOW]]Giga B\u00e1ny\u00e1sz B\u00e1ny\u00e1sz Cs\u00e1k\u00e1ny [[GREEN]]k\u00e9pesseged friss\u00fclt!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1latban [[RED]]Giga B\u00e1ny\u00e1sz Cs\u00e1k\u00e1ny!
|
||||
Excavation.Skillup=\u00c1s\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Fishing.SubSkill.IceFishing.Name=J\u00e9g Horg\u00e1szat
|
||||
Fishing.Listener=Horg\u00e1szat:
|
||||
Fishing.SkillName=HORG\u00c1SZAT
|
||||
Herbalism.Ability.Lower=[[GRAY]]**LETETTED A KAP\u00c1DAT**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**EL\u0150K\u00c9SZ\u00cdTETTED A KAP\u00c1DAT**
|
||||
Herbalism.Listener=Gy\u00f3gyn\u00f6v\u00e9nytan:
|
||||
Herbalism.SkillName=GY\u00d3GYN\u00d6V\u00c9NYTAN
|
||||
Herbalism.Skillup=Gy\u00f3gyn\u00f6v\u00e9nytan fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Mining.Ability.Length=Szupercs\u00e1k\u00e1ny t\u00e1vols\u00e1g: [[YELLOW]]{0}s
|
||||
Mining.Ability.Lower=[[GRAY]]**LETETTED A CS\u00c1K\u00c1NYOD**
|
||||
Mining.Ability.Ready=[[GREEN]]**CS\u00c1K\u00c1NYOD K\u00c9SZEN \u00c1LL**
|
||||
Mining.Listener=B\u00e1ny\u00e1sz\u00e1s:
|
||||
Mining.SkillName=B\u00c1NY\u00c1SZ\u00c1S
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A [[YELLOW]] Szuper Z\u00faz\u00f3 [[GREEN]]k\u00e9pess\u00e9ged \u00fajra haszn\u00e1lhat\u00f3!
|
||||
Mining.Skillup=B\u00e1ny\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Mining.Blast.Refresh=[[GREEN]]A [[YELLOW]]Robban\u00f3 B\u00e1ny\u00e1szat [[GREEN]]k\u00e9pess\u00e9ged \u00fajra el\u00e9rhet\u0151!
|
||||
Repair.SubSkill.Repair.Name=Jav\u00edt\u00e1s
|
||||
Repair.SubSkill.Repair.Description=Eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.GoldRepair.Description=Arany eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.IronRepair.Description=Vas eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.StoneRepair.Description=K\u0151 eszk\u00f6z\u00f6k jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.RepairMastery.Name=Jav\u00edt\u00f3 mester
|
||||
Repair.SubSkill.SuperRepair.Name=Szuper jav\u00edt\u00e1s
|
||||
Repair.SubSkill.DiamondRepair.Description=Gy\u00e9m\u00e1nt eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.ArcaneForging.Description=M\u00e1gikus t\u00e1rgyak megjav\u00edt\u00e1sa
|
||||
Repair.Listener=Jav\u00edt\u00e1s:
|
||||
Repair.SkillName=JAV\u00cdT\u00c1S
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy gy\u00e9m\u00e1nt t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy arany t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy vas t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy arany t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]Nem tudsz jav\u00edtani st\u00f3colt t\u00e1rgyakat
|
||||
Repair.Skillup=Jav\u00edt\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Repair.Pretty.Name=Jav\u00edt\u00e1s
|
||||
Repair.Arcane.Fail=A t\u00e1rgyon l\u00e9v\u0151 var\u00e1zslat szertefoszlott.
|
||||
Swords.Ability.Lower=[[GRAY]]**ELTETTED A KARDOD**
|
||||
Swords.Ability.Ready=[[GREEN]]**A KARDOD K\u00c9SZEN \u00c1LL**
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] V\u00e9rzel!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]A v\u00e9rz\u00e9s [[GREEN]]elm\u00falt[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**ELLENS\u00c9G V\u00c9RZIK**
|
||||
Swords.Listener=Kardok:
|
||||
Swords.SkillName=KARDOK
|
||||
Swords.Skills.SS.On=[[GREEN]]**F\u0170R\u00c9SZES CSAP\u00c1S AKTIV\u00c1LVA**
|
||||
Swords.Skillup=Harc fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Taming.SubSkill.ShockProof.Description=Robban\u00e1si Sebz\u00e9s Ellen\u00e1ll\u00e1s
|
||||
Taming.SubSkill.FastFoodService.Name=Gyors Kaja Szolg\u00e1ltat\u00e1s
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]A farkasod visszat\u00e9rt hozz\u00e1d...
|
||||
Taming.Listener=Szelid\u00edt\u00e9s:
|
||||
Taming.SkillName=SZELID\u00cdT\u00c9S
|
||||
Taming.Skillup=Szelid\u00edt\u00e9s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Unarmed.Ability.Lower=[[GRAY]]**LETETTED KEZEIDET**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**EL\u0150K\u00c9SZ\u00cdTETTED KEZEIDET**
|
||||
Unarmed.Listener=Fegyvertelen:
|
||||
Unarmed.SkillName=FEGYVERTELEN
|
||||
Unarmed.Skills.Berserk.Off=**Tombol\u00e1sod befejez\u0151d\u00f6tt**
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Tombol\u00e1st!
|
||||
Unarmed.Skillup=Fegyvertelen fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Woodcutting.Ability.0=Lev\u00e9l F\u00faj\u00f3
|
||||
Woodcutting.Ability.1=Elf\u00fajja a leveleket.
|
||||
Woodcutting.Listener=Fav\u00e1g\u00e1s:
|
||||
Woodcutting.SkillName=FAV\u00c1G\u00c1S
|
||||
Woodcutting.Skills.TreeFeller.Off=**Fa D\u00f6nt\u00e9s befejezve**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**FA D\u00d6NT\u0150 AKTIV\u00c1LVA **
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1latban [[RED]]Fa D\u00f6nt\u0151!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Ez a fa t\u00fal nagy!
|
||||
Woodcutting.Skillup=Fav\u00e1g\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Ability.Generic.Refresh=[[GREEN]]**K\u00c9PESS\u00c9GEK FRISS\u00cdTVE!**
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]\u00c9let ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Tulajdonos ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Bolyhosat \u00e9rintettem. Elsz\u00e9d\u00fcltem.
|
||||
Commands.AdminChat.Off=Admin Chat [[RED]]kikapcsolva
|
||||
Commands.AdminChat.On=Admin Chat [[RED]]bekapcsolva
|
||||
Commands.AdminToggle=- Admin chat \u00e1tv\u00e1ltva
|
||||
Commands.Disabled=Ez a parancs jelenleg le van tiltva.
|
||||
Commands.DoesNotExist=Ilyen nev\u0171 j\u00e1t\u00e9kos nincs az adatb\u00e1zisban!
|
||||
Commands.GodMode.Disabled=mcMMO Istenm\u00f3d letiltva
|
||||
Commands.GodMode.Forbidden=[mcMMO] Istenm\u00f3d nem lehets\u00e9ges ebben a vil\u00e1gban! (N\u00e9zd meg a jogokat)
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]Megh\u00edv\u00e1st sikeresen elfogadtad {0} party-ra!
|
||||
Commands.Invite.Success=[[GREEN]]Megh\u00edv\u00f3 sikeresen elk\u00fcldve.
|
||||
Commands.mcc.Header=---[][[YELLOW]]mcMMO Parancsok[[RED]][]---
|
||||
Commands.mcgod=- V\u00e1lt\u00e1s GodModba
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - M\u00f3dos\u00edtva
|
||||
Commands.Other=[[GREEN]]--Egy\u00e9b Parancsok--
|
||||
Commands.Party.Accept=- Parti megh\u00edv\u00e1s elfogadva
|
||||
Commands.Party.Chat.Off=Party Chat [[RED]]kikapcsolva
|
||||
Commands.Party.Chat.On=Party Chat [[GREEN]]bekapcsolva
|
||||
Commands.Party.Commands=[[GREEN]]--Party Parancsok--
|
||||
Commands.Party.Invite.0=FIGYELEM: [[GREEN]]Kapt\u00e1l egy party megh\u00edv\u00f3t a {0} party-ba. Megh\u00edv\u00f3: {1}
|
||||
Commands.Party.Rename=[[GRAY]]A party \u00faj neve: [[WHITE]]{0}
|
||||
Commands.Party.Kick=Kidobtak a csoportb\u00f3l {0}!
|
||||
Commands.Party.Leave=Elhagytad a party-t
|
||||
Commands.Party.Quit=- Kil\u00e9pt\u00e9l a jelenlegi partib\u00f3l
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Energia szint [[YELLOW]Ranglista--
|
||||
Commands.PowerLevel=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0}
|
||||
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Dics\u0151s\u00e9glista--
|
||||
Commands.Stats.Self=STATISZTIK\u00c1ID
|
||||
Commands.Stats=- mcMMO Statisztik\u00e1d
|
||||
Commands.ToggleAbility=- K\u00e9pess\u00e9g aktiv\u00e1l\u00e1sa jobb gombbal
|
||||
Commands.Usage.PartyName=n\u00e9v
|
||||
Commands.Usage.Password=jelsz\u00f3
|
||||
Party.InformedOnJoin={0} [[GREEN]]csatlakozott a party-dba
|
||||
Party.InformedOnQuit={0} [[GREEN]]elment a party-db\u00f3l
|
||||
Party.Player.Invalid=Nincs ilyen nev\u0171 j\u00e1t\u00e9kos.
|
||||
Party.Player.InSameParty={0} m\u00e1r bent van a party-dban!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} nincs benne a party-ba
|
||||
Party.Teleport.Dead=Nem teleport\u00e1lhatsz halott j\u00e1t\u00e9kosra.
|
||||
Party.Teleport.Target=[[GREEN]]{0} hozz\u00e1d teleport\u00e1lt.
|
||||
Party.Unlocked=[[GRAY]]Csoport nyitva
|
||||
Party.ShareType.Item=T\u00c1RGY
|
||||
Party.ShareMode.Random=V\u00c9LETLEN
|
||||
Party.ItemShare.Category.Mining=B\u00e1ny\u00e1sz\u00e1s
|
||||
Party.ItemShare.Category.Woodcutting=Fav\u00e1g\u00e1s
|
||||
Commands.XPGain.Acrobatics=Es\u00e9s
|
||||
Commands.XPGain.Axes=Sz\u00f6rnyek T\u00e1mad\u00e1sa
|
||||
Commands.XPGain.Excavation=\u00c1sni \u00e9s kincset tal\u00e1lni.
|
||||
Commands.XPGain.Herbalism=N\u00f6v\u00e9nyek betakar\u00edt\u00e1sa
|
||||
Commands.XPGain.Mining=K\u0151 \u00e9s \u00e9rcek kib\u00e1ny\u00e1sz\u00e1sa
|
||||
Commands.XPGain.Repair=Jav\u00edt\u00e1s
|
||||
Commands.XPGain.Swords=Sz\u00f6rnyek sebz\u00e9se
|
||||
Commands.XPGain.Taming=\u00c1llatok idom\u00edt\u00e1sa vagy harc a farkasoddal
|
||||
Commands.XPGain=[[DARK_GRAY]]KAPOTT TP: [[WHITE]]{0}
|
||||
Commands.xplock.unlocked=[[GOLD]]Az XP cs\u00edkod [[GREEN]]FELOLDVA[[GOLD]]!
|
||||
Commands.xprate.started.0=[[GOLD]]mcMMO XP event kezdet\u00e9t vette!
|
||||
XPRate.Event=[[GOLD]]mcMMO-ban most TP r\u00e1ta n\u00f6vel\u0151 esem\u00e9ny van! TP r\u00e1ta {0}x!
|
||||
Effects.Effects=EFFEKTEK
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
Guides.Page.OutOfRange=Ez a lap nem l\u00e9tezik, \u00f6sszesen {0} lap van.
|
||||
Guides.Smelting.Section.0=Hamarosan...
|
||||
Skills.Disarmed=[[DARK_RED]]Lefegyvereztek!
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.TooTired=T\u00fal f\u00e1radt vagy hogy haszn\u00e1ld ezt a k\u00e9pess\u00e9get. [[YELLOW]]({0}s)
|
||||
Stats.Header.Combat=[[GOLD]]-=HARCI K\u00c9PZETTS\u00c9GEK=-
|
||||
Stats.Header.Gathering=[[GOLD]]-= GY\u0170JT\u00d6GET\u0150 K\u00c9PESS\u00c9GEK=-
|
||||
Stats.Header.Misc=[[GOLD]]-=EGY\u00c9B SKILLEK=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] Statisztik\u00e1k
|
||||
MOTD.Version=[[GOLD]][mcMMO] Jelenlegi verzi\u00f3: [[DARK_AQUA]]{0}
|
||||
@@ -1,903 +0,0 @@
|
||||
#ACROBATICS
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**Atterraggio Aggraziato**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Schivato**
|
||||
Acrobatics.DodgeChance=Possibilit\u00E0 di Schivata: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.Name=Capriola
|
||||
Acrobatics.SubSkill.Roll.Description=Riduce o annulla il danno da caduta
|
||||
Acrobatics.SubSkill.GracefulRoll.Name=Capriola Aggraziata
|
||||
Acrobatics.SubSkill.GracefulRoll.Description=Il doppio pi\u00F9 efficiente di una normale Capriola
|
||||
Acrobatics.SubSkill.Dodge.Name=Schivata
|
||||
Acrobatics.SubSkill.Dodge.Description=Riduce il danno degli attacchi della met\u00E0
|
||||
Acrobatics.Listener=Acrobatica:
|
||||
Acrobatics.SubSkill.Roll.Chance=Possibilit\u00E0 di Capriola: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.GraceChance=Possibilit\u00E0 di Capriola Aggraziata: [[YELLOW]]{0}
|
||||
Acrobatics.Roll.Text=**Capriola Eseguita**
|
||||
Acrobatics.SkillName=ACROBATICA
|
||||
Acrobatics.Skillup=L'abilit\u00E0 Acrobatica \u00E8 aumentata di {0}. Totale ({1})
|
||||
#ALCHEMY
|
||||
Alchemy.SubSkill.Catalysis.Name=Catalisi
|
||||
Alchemy.SubSkill.Catalysis.Description=Aumenta la velocit\u00E0 di produzione delle pozioni
|
||||
Alchemy.SubSkill.Concoctions.Name=Intrugli
|
||||
Alchemy.SubSkill.Concoctions.Description=Crea pozioni con pi\u00F9 ingredienti
|
||||
Alchemy.Listener=Alchimia:
|
||||
Alchemy.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (CATALISI)
|
||||
Alchemy.Catalysis.Speed=Velocit\u00E0 di Preparazione: [[YELLOW]]{0}
|
||||
Alchemy.Concoctions.Rank=Grado Intrugli: [[YELLOW]]{0}/{1}
|
||||
Alchemy.Concoctions.Ingredients=Ingredienti [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
|
||||
Alchemy.SkillName=ALCHIMIA
|
||||
Alchemy.Skillup=L'abilit\u00E0 Alchimia \u00E8 aumentata di {0}. Totale ({1})
|
||||
#ARCHERY
|
||||
Archery.Combat.DazeChance=Possibilit\u00E0 di Stordire: [[YELLOW]]{0}
|
||||
Archery.Combat.RetrieveChance=Possibilit\u00E0 di Recuperare Frecce: [[YELLOW]]{0}
|
||||
Archery.Combat.SkillshotBonus=Bonus al Danno di Tiro da Maestro: [[YELLOW]]{0}
|
||||
Archery.SubSkill.SkillShot.Name=Tiro da Maestro
|
||||
Archery.SubSkill.SkillShot.Description=Aumenta il danno fatto con gli archi
|
||||
Archery.SubSkill.Daze.Name=Stordire (Giocatori)
|
||||
Archery.SubSkill.Daze.Description=Disorienta i nemici e infligge {0} Danni
|
||||
Archery.SubSkill.ArrowRetrieval.Name=Recupero Frecce
|
||||
Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00E0 di recuperare frecce dai cadaveri
|
||||
Archery.Listener=Tiro con l'Arco:
|
||||
Archery.SkillName=Arco
|
||||
Archery.Skillup=L'abilit\u00E0 Tiro con l'Arco \u00E8 aumentata di {0}. Totale ({1})
|
||||
#AXES
|
||||
Axes.Ability.Bonus.0=Maestria con l'Ascia
|
||||
Axes.Ability.Bonus.1={0} Danni Bonus
|
||||
Axes.Ability.Bonus.2=Sfonda Armature
|
||||
Axes.Ability.Bonus.3=Infliggi {0} Danni Bonus alle armature
|
||||
Axes.Ability.Bonus.4=Impatto Maggiore
|
||||
Axes.Ability.Bonus.5=Infliggi {0} danni bonus ai nemici senza armatura
|
||||
Axes.Ability.Lower=[[GRAY]]**ABBASSI L'ASCIA**
|
||||
Axes.Ability.Ready=[[GREEN]]**PREPARI L'ASCIA**
|
||||
Axes.Combat.CritStruck=[[DARK_RED]]Hai subito un colpo CRITICO!
|
||||
Axes.Combat.CritChance=Probabilit\u00E0 di un colpo critico: [[YELLOW]]{0}
|
||||
Axes.Combat.CriticalHit=COLPO CRITICO!
|
||||
Axes.Combat.GI.Proc=[[GREEN]]**COLPITO CON GRANDE FORZA**
|
||||
Axes.Combat.GI.Struck=**COLPITO DA IMPATTO MAGGIORE**
|
||||
Axes.Combat.SS.Struck=[[DARK_RED]]Colpito da SPACCA CRANI!
|
||||
Axes.Combat.SS.Length=Durata di Spacca Crani: [[YELLOW]]{0}s
|
||||
Axes.SubSkill.SkullSplitter.Name=Spacca Crani (Capacit\u00E0)
|
||||
Axes.SubSkill.SkullSplitter.Description=Infligge Danno ad Area
|
||||
Axes.SubSkill.CriticalStrikes.Name=Colpi Critici
|
||||
Axes.SubSkill.CriticalStrikes.Description=Doppio Danno
|
||||
Axes.SubSkill.AxeMastery.Name=Maestria con l'Ascia
|
||||
Axes.SubSkill.AxeMastery.Description=Aggiunge Danni bonus
|
||||
Axes.SubSkill.ArmorImpact.Name=Sfonda Armature
|
||||
Axes.SubSkill.ArmorImpact.Description=Colpisci con forza sufficiente da fracassare le armature
|
||||
Axes.SubSkill.GreaterImpact.Name=Impatto Maggiore
|
||||
Axes.SubSkill.GreaterImpact.Description=Infligge danno bonus ai nemici senza armatura
|
||||
Axes.Listener=Asce:
|
||||
Axes.SkillName=ASCE
|
||||
Axes.Skills.SS.Off=**Spacca Crani si \u00E8 esaurito**
|
||||
Axes.Skills.SS.On=[[GREEN]]**Spacca Crani ATTIVATA**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Spacca Crani [[GREEN]]si \u00E8 rigenerata!
|
||||
Axes.Skills.SS.Other.Off=Spacca Crani[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Spacca Crani!
|
||||
Axes.Skillup=L'abilit\u00E0 Asce \u00E8 aumentata di {0}. Totale ({1})
|
||||
#EXCAVATION
|
||||
Excavation.Ability.Lower=[[GRAY]]**ABBASSI LA PALA**
|
||||
Excavation.Ability.Ready=[[GREEN]]**PREPARI LA PALA**
|
||||
Excavation.SubSkill.GigaDrillBreaker.Name=Giga-Trivella Demolitrice (CAPACIT\u00C0)
|
||||
Excavation.SubSkill.GigaDrillBreaker.Description=Drop x3, XP x3, +Velocit\u00E0
|
||||
Excavation.SubSkill.TreasureHunter.Name=Cacciatore di Tesori
|
||||
Excavation.SubSkill.TreasureHunter.Description=Capacit\u00E0 di disseppellire tesori
|
||||
Excavation.Effect.Length=Durata di Giga-Trivella Demolitrice: [[YELLOW]]{0}s
|
||||
Excavation.Listener=Escavazione:
|
||||
Excavation.SkillName=ESCAVAZIONE
|
||||
Excavation.Skills.GigaDrillBreaker.Off=**Giga-Trivella Demolitrice si \u00E8 esaurita**
|
||||
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA-TRIVELLA DEMOLITRICE ATTIVATA**
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Giga-Trivella Demolitrice [[GREEN]]si \u00E8 rigenerata!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.Off=Giga-Trivella Demolitrice[[GREEN]] si \u00E8 esaurita per [[YELLOW]]{0}
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Giga-Trivella Demolitrice!
|
||||
Excavation.Skillup=L'abilit\u00E0 Escavazione \u00E8 aumentata di {0}. Totale ({1})
|
||||
#FISHING
|
||||
Fishing.Ability.Chance=Possibilit\u00E0 di Morso: [[YELLOW]]{0}
|
||||
Fishing.Ability.Info=Cacciatore di Magia: [[GRAY]] **Migliora insieme al Grado di Cacciatore di Tesori**
|
||||
Fishing.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SCUOTERE)
|
||||
Fishing.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PESCA SUL GHIACCIO)
|
||||
Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PESCATORE PROVETTO)
|
||||
Fishing.Ability.Rank=Grado di Cacciatore di Tesori: [[YELLOW]]{0}/5
|
||||
Fishing.Ability.TH.DropRate=Tasso di Drop: [[DARK_RED]]Trap: [[YELLOW]]{0} [[GRAY]]Comune: [[YELLOW]]{1} [[GREEN]]Non Comune: [[YELLOW]]{2}\n[[BLUE]]Raro: [[YELLOW]]{3} [[LIGHT_PURPLE]]Epico: [[YELLOW]]{4} [[GOLD]]Leggendario: [[YELLOW]]{5} [[AQUA]]Record: [[YELLOW]]{6}
|
||||
Fishing.Ability.TH.MagicRate=Possibilit\u00E0 di Cacciatore di Magia: [[YELLOW]]{0}
|
||||
Fishing.Ability.Shake=Probabilit\u00E0 di Scuotere: [[YELLOW]]{0}
|
||||
Fishing.Ability.IceFishing=Pesca sul Ghiaccio: Vai a pescare sul ghiaccio
|
||||
Fishing.Ability.FD=Dieta del Pescatore: [[YELLOW]]Grado {0}
|
||||
Fishing.SubSkill.TreasureHunter.Name=Cacciatore di Tesori (Passivo)
|
||||
Fishing.SubSkill.TreasureHunter.Description=Ripesca oggetti vari
|
||||
Fishing.SubSkill.MagicHunter.Name=Cacciatore di Magia
|
||||
Fishing.SubSkill.MagicHunter.Description=Trova Oggetti Incantati
|
||||
Fishing.SubSkill.Shake.Name=Scuotere (contro Entit\u00E0)
|
||||
Fishing.SubSkill.Shake.Description=Scrolla oggetti di dosso ai mob con una canna da pesca
|
||||
Fishing.SubSkill.FishermansDiet.Name=Dieta del Pescatore
|
||||
Fishing.SubSkill.FishermansDiet.Description=Aumenta la fame recuperata tramite cibi pescati
|
||||
Fishing.SubSkill.MasterAngler.Name=Pescatore Provetto
|
||||
Fishing.SubSkill.MasterAngler.Description=Migliora le possibilit\u00E0 di ricevere un morso mentre si pesca
|
||||
Fishing.SubSkill.IceFishing.Name=Pesca sul Ghiaccio
|
||||
Fishing.SubSkill.IceFishing.Description=Ti permette di pescare nei biomi ghiacciati
|
||||
Fishing.Chance.Raining=[[BLUE]] Bonus Pioggia
|
||||
Fishing.Listener=Pesca:
|
||||
Fishing.Ability.TH.MagicFound=[[GRAY]]Senti un tocco di magia in questa cattura...
|
||||
Fishing.Ability.TH.Boom=[[GRAY]]TEMPO DI BOOM!!!
|
||||
Fishing.Ability.TH.Poison=[[GRAY]]C'\u00E8 qualcosa che non va bene...
|
||||
Fishing.SkillName=PESCA
|
||||
Fishing.Skillup=L'abilit\u00E0 Pesca \u00E8 aumentata di {0}. Totale ({1})
|
||||
#HERBALISM
|
||||
Herbalism.Ability.DoubleDropChance=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
|
||||
Herbalism.Ability.FD=Dieta del Contadino: [[YELLOW]]Grado {0}
|
||||
Herbalism.Ability.GTe.Length=Durata di Terra Verde: [[YELLOW]]{0}s
|
||||
Herbalism.Ability.GTe.NeedMore=Ti servono pi\u00F9 semi per diffondere Terra Verde.
|
||||
Herbalism.Ability.GTh.Chance=Possibilit\u00E0 di Pollice Verde: [[YELLOW]]{0}
|
||||
Herbalism.Ability.GTh.Fail=[[RED]]**POLLICE VERDE FALLITO**
|
||||
Herbalism.Ability.GTh.Stage=Stadio di Pollice Verde: [[YELLOW]] Il raccolto cresce allo stadio {0}
|
||||
Herbalism.Ability.GTh=[[GREEN]]**POLLICE VERDE**
|
||||
Herbalism.Ability.HylianLuck=Probabilit\u00E0 di Fortuna Hylian: [[YELLOW]]{0}
|
||||
Herbalism.Ability.Lower=[[GRAY]]**ABBASSI LA ZAPPA**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**PREPARI LA ZAPPA**
|
||||
Herbalism.Ability.ShroomThumb.Chance=Possibilit\u00E0 di Pollice Fungo: [[YELLOW]]{0}
|
||||
Herbalism.Ability.ShroomThumb.Fail=**POLLICE FUNGO FALLITO**
|
||||
Herbalism.SubSkill.GreenTerra.Name=Terra Verde (CAPACIT\u00C0)
|
||||
Herbalism.SubSkill.GreenTerra.Description=Diffonde il Verde, Drop x3
|
||||
Herbalism.SubSkill.GreenThumb.Name=Pollice Verde (Grano)
|
||||
Herbalism.SubSkill.GreenThumb.Description=Auto-Pianta il grano quando viene raccolto
|
||||
Herbalism.Effect.4=Pollice Verde (Blocchi)
|
||||
Herbalism.SubSkill.GreenThumb.Description.2=Rende i mattoni muscosi, o fa crescere l'erba
|
||||
Herbalism.SubSkill.FarmersDiet.Name=Dieta del Contadino
|
||||
Herbalism.SubSkill.FarmersDiet.Description=Aumenta la fame recuperata tramite cibi coltivati
|
||||
Herbalism.SubSkill.DoubleDrops.Name=Doppi Drop (Ogni Pianta)
|
||||
Herbalism.SubSkill.DoubleDrops.Description=Raddoppia il normale drop
|
||||
Herbalism.SubSkill.HylianLuck.Name=Fortuna Hylian
|
||||
Herbalism.SubSkill.HylianLuck.Description=D\u00E0 una modesta possibilit\u00E0 di trovare oggetti rari
|
||||
Herbalism.SubSkill.ShroomThumb.Name=Pollice Fungo
|
||||
Herbalism.SubSkill.ShroomThumb.Description=Diffonde il micelio su terra & erba
|
||||
Herbalism.HylianLuck=[[GREEN]]Oggi la fortuna di Hyrule \u00E8 con te!
|
||||
Herbalism.Listener=Erboristeria:
|
||||
Herbalism.SkillName=ERBORISTERIA
|
||||
Herbalism.Skills.GTe.Off=**Terra Verde si \u00E8 esaurita**
|
||||
Herbalism.Skills.GTe.On=[[GREEN]]**TERRA VERDE ATTIVATA**
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]La tua abilit\u00E0 [[YELLOW]]Terra Verde [[GREEN]]si \u00E8 rigenerata!
|
||||
Herbalism.Skills.GTe.Other.Off=Terra Verde[[GREEN]] si \u00E8 esaurita per [[YELLOW]]{0}
|
||||
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Terra Verde!
|
||||
Herbalism.Skillup=L'abilit\u00E0 Erboristeria \u00E8 aumentata di {0}. Totale ({1})
|
||||
#MINING
|
||||
Mining.Ability.Length=Durata di Super Demolitore: [[YELLOW]]{0}s
|
||||
Mining.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ESTRAZIONE ESPLOSIVA)
|
||||
Mining.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0} (BOMBE PI\u00D9 GRANDI)
|
||||
Mining.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PERIZIA NELLE DEMOLIZIONI)
|
||||
Mining.Ability.Lower=[[GRAY]]**ABBASSI IL PICCONE**
|
||||
Mining.Ability.Ready=[[GREEN]]**PREPARI IL PICCONE**
|
||||
Mining.SubSkill.SuperBreaker.Name=Super Demolitore (CAPACIT\u00C0)
|
||||
Mining.SubSkill.SuperBreaker.Description=+ Velocit\u00E0, Possibilit\u00E0 di Triplo Drop
|
||||
Mining.SubSkill.DoubleDrops.Name=Doppi Drop
|
||||
Mining.SubSkill.DoubleDrops.Description=Raddoppia il normale drop
|
||||
Mining.SubSkill.BlastMining.Name=Estrazione Esplosiva
|
||||
Mining.SubSkill.BlastMining.Description=Bonus a estrarre minerali col TNT
|
||||
Mining.SubSkill.BiggerBombs.Name=Bombe Pi\u00F9 Grandi
|
||||
Mining.SubSkill.BiggerBombs.Description=Incrementa il raggio di esplosione del TNT
|
||||
Mining.SubSkill.DemolitionsExpertise.Name=Perizia nelle Demolizioni
|
||||
Mining.SubSkill.DemolitionsExpertise.Description=Riduce il danno da esplosioni di TNT
|
||||
Mining.Effect.Decrease=Riduzione del Danno da Esperto di Demolizioni: [[YELLOW]]{0}
|
||||
Mining.Effect.DropChance=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
|
||||
Mining.Listener=Estrazione:
|
||||
Mining.SkillName=ESTRAZIONE
|
||||
Mining.Skills.SuperBreaker.Off=**Super Demolitore si \u00E8 esaurito**
|
||||
Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER DEMOLITORE ATTIVATO**
|
||||
Mining.Skills.SuperBreaker.Other.Off=Super Demolitore[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
|
||||
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Super Demolitore!
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Super Demolitore [[GREEN]]si \u00E8 rigenerata!
|
||||
Mining.Skillup=L'abilit\u00E0 Estrazione \u00E8 aumentata di {0}. Totale ({1})
|
||||
#Blast Mining
|
||||
Mining.Blast.Boom=[[GRAY]]**BOOM**
|
||||
Mining.Blast.Effect=+{0} minerale raccolto, -{1} macerie prodotte, drop x{2}
|
||||
Mining.Blast.Radius.Increase=Incremento del Raggio di Esplosione: [[YELLOW]]+{0}
|
||||
Mining.Blast.Rank=Estrazione Esplosiva: [[YELLOW]] Grado {0}/8 [[GRAY]]({1})
|
||||
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Estrazione Esplosiva!
|
||||
Mining.Blast.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Estrazione Esplosiva [[GREEN]]si \u00E8 rigenerata!
|
||||
#REPAIR
|
||||
Repair.SubSkill.Repair.Name=Riparazione
|
||||
Repair.SubSkill.Repair.Description=Ripara Attrezzi & Armature
|
||||
Repair.SubSkill.GoldRepair.Name=Riparazione Oro (ABILIT\u00C0 {0}+)
|
||||
Repair.SubSkill.GoldRepair.Description=Ripara Attrezzi & Armature d'Oro
|
||||
Repair.SubSkill.IronRepair.Name=Riparazione Ferro (ABILIT\u00C0 {0}+)
|
||||
Repair.SubSkill.IronRepair.Description=Ripara Attrezzi & Armature di Ferro
|
||||
Repair.SubSkill.StoneRepair.Name=Riparazione Pietra (ABILIT\u00C0 {0}+)
|
||||
Repair.SubSkill.StoneRepair.Description=Ripara Attrezzi di Pietra
|
||||
Repair.SubSkill.RepairMastery.Name=Maestria nella Riparazione
|
||||
Repair.SubSkill.RepairMastery.Description=Riparazione incrementata
|
||||
Repair.SubSkill.SuperRepair.Name=Super Riparazione
|
||||
Repair.SubSkill.SuperRepair.Description=Doppia efficacia
|
||||
Repair.SubSkill.DiamondRepair.Name=Ripara Diamante (ABILIT\u00C0 {0}+)
|
||||
Repair.SubSkill.DiamondRepair.Description=Ripara Attrezzi & Armature di Diamante
|
||||
Repair.SubSkill.ArcaneForging.Name=Forgiatura Arcana
|
||||
Repair.SubSkill.ArcaneForging.Description=Ripara oggetti magici
|
||||
Repair.Error=[[DARK_RED]]mcMMO si \u00E8 imbattuto in un errore mentre tentava di riparare questo oggetto!
|
||||
Repair.Listener.Anvil=[[DARK_RED]]Hai piazzato un'incudine; le incudini possono riparare attrezzi e armature.
|
||||
Repair.Listener=Riparazione:
|
||||
Repair.SkillName=RIPARAZIONE
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Non sei abbastanza abile da riparare il Diamante.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Non sei abbastanza abile da riparare l'Oro.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]Non sei abbastanza abile da riparare il Ferro.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Non sei abbastanza abile da riparare la Pietra.
|
||||
Repair.Skills.Adept=Devi essere di livello [[YELLOW]]{0}[[RED]] per riparare [[YELLOW]]{1}
|
||||
Repair.Skills.FeltEasy=[[GRAY]]Ti \u00E8 sembrato facile.
|
||||
Repair.Skills.FullDurability=[[GRAY]]\u00C8 gi\u00E0 a piena durevolezza.
|
||||
Repair.Skills.Mastery=Maestria nella Riparazione: [[YELLOW]]{0} durabilit\u00E0 aggiuntiva ripristinata
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]Non puoi riparare oggetti ammucchiati.
|
||||
Repair.Skills.Super.Chance=Possibilit\u00E0 Super Riparazione: [[YELLOW]]{0}
|
||||
Repair.Skillup=L'abilit\u00E0 Riparazione \u00E8 aumentata di {0}. Totale ({1})
|
||||
Repair.Pretty.Name=Riparazione
|
||||
#Arcane Forging
|
||||
Repair.Arcane.Chance.Downgrade=[[GRAY]]Probabilit\u00E0 di Degradazione di FA: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]Tasso di Successo di FA: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Downgrade=Il potere arcano di questo oggetto \u00E8 diminuito.
|
||||
Repair.Arcane.Fail=Il potere arcano ha abbandonato l'oggetto permanentemente.
|
||||
Repair.Arcane.Lost=Non sei stato abbastanza abile da mantenere alcun incantesimo.
|
||||
Repair.Arcane.Perfect=[GREEN]]Hai mantenuto le energie arcane in questo oggetto.
|
||||
Repair.Arcane.Rank=Forgiatura Arcana: [[YELLOW]]Grado {0}/4
|
||||
#SALVAGE
|
||||
Salvage.Pretty.Name=Rottamazione
|
||||
Salvage.SubSkill.AdvancedSalvage.Name=Rottamazione Avanzata
|
||||
Salvage.SubSkill.AdvancedSalvage.Description=Rottama oggetti danneggiati
|
||||
Salvage.SubSkill.ArcaneSalvaging.Name=Rottamazione Arcana
|
||||
Salvage.SubSkill.ArcaneSalvaging.Description=Estrai incantesimi dagli oggetti
|
||||
Salvage.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ROTTAMAZIONE AVANZATA)
|
||||
Salvage.Ability.Bonus.0=Rottamazione Avanzata
|
||||
Salvage.Ability.Bonus.1=Massima resa {0} oggetti distrutti
|
||||
Salvage.Arcane.Rank=Recupero Arcano: [[YELLOW]]Grado {0}/{1}
|
||||
Salvage.Arcane.ExtractFull=[[GRAY]]Probabilit\u00E0 di incantamento AS completo
|
||||
Salvage.Arcane.ExtractPartial=[[GRAY]]Probabilit\u00E0 di incantamento AS parziale
|
||||
Salvage.Skills.Success=[[GREEN]]Oggetto rottamato!
|
||||
Salvage.Skills.Adept.Damaged=[[DARK_RED]]Non sei abbastanza abile da rottamare gli oggetti danneggiati.
|
||||
Salvage.Skills.Adept.Level=Devi essere di livello [[YELLOW]]{0}[[RED]] per rottamare [[YELLOW]]{1}
|
||||
Salvage.Skills.TooDamaged=[[DARK_RED]]Questo oggetto \u00E8 troppo danneggiato per essere rottamato.
|
||||
Salvage.Skills.ArcaneFailed=Non sei stato capace di estrarre la conoscenza contenuta in questo oggetto.
|
||||
Salvage.Skills.ArcanePartial=Sei stato solo in grado di estrarre alcune delle conoscenze contenute all'interno di questo oggetto.
|
||||
Salvage.Skills.ArcaneSuccess=[[GREEN]]Sei in grado di estrarre tutte le conoscenze contenute in questo oggetto!
|
||||
Salvage.Listener.Anvil=[[DARK_RED]]Hai piazzato un'incudine da Rottamazione, usala per Rottamare attrezzi e armature.
|
||||
Salvage.Listener=Rottamazione:
|
||||
Salvage.SkillName=ROTTAMAZIONE
|
||||
#SWORDS
|
||||
Swords.Ability.Lower=[[GRAY]]**ABBASSI LA SPADA**
|
||||
Swords.Ability.Ready=[[GREEN]]**PREPARI LA SPADA**
|
||||
Swords.Combat.Bleed.Chance=Possibilit\u00E0 di Emorragia: [[YELLOW]]{0}
|
||||
Swords.Combat.Bleed.Length=Durata di Emorragia: [[YELLOW]]{0} tick
|
||||
Swords.Combat.Bleed.Note=[[GRAY]]NOTA: [[YELLOW]]1 Tick si verifica ogni 2 secondi
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] Stai sanguinando!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]L'emorragia si \u00E8 [[GREEN]]fermata[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**IL NEMICO HA UN'EMORRAGIA**
|
||||
Swords.Combat.Counter.Chance=Possibilit\u00E0 di Contrattacco: [[YELLOW]]{0}
|
||||
Swords.Combat.Counter.Hit=[[DARK_RED]]Colpisci con un contrattacco!
|
||||
Swords.Combat.Countered=[[GREEN]]**CONTRATTACCATO**
|
||||
Swords.Combat.SS.Struck=[[DARK_RED]]Colpito da COLPI SEGHETTATI!
|
||||
Swords.SubSkill.CounterAttack.Name=Contrattacco
|
||||
Swords.SubSkill.CounterAttack.Description=Riflette il {0} del danno sub\u00ECto mentre si blocca
|
||||
Swords.SubSkill.SerratedStrikes.Name=Colpi Seghettati (CAPACIT\u00C0)
|
||||
Swords.SubSkill.SerratedStrikes.Description={0} Danni EaA, Emorragia+ EaA
|
||||
Swords.Effect.4=Colpi Seghettati Emorragia+
|
||||
Swords.Effect.5={0} Tick di Emorragia
|
||||
Swords.SubSkill.Bleed.Name=Emorragia
|
||||
Swords.SubSkill.Bleed.Description=Infligge danno ciclico da sanguinamento
|
||||
Swords.Listener=Spade:
|
||||
Swords.SkillName=SPADE
|
||||
Swords.Skills.SS.Off=**Colpi Seghettati si \u00E8 esaurito**
|
||||
Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED**
|
||||
Swords.Skills.SS.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Colpi Seghettati [[GREEN]]si \u00E8 rigenerata!
|
||||
Swords.Skills.SS.Other.Off=Colpi Seghettati[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Colpi Seghettati!
|
||||
Swords.Skillup=L'abilit\u00E0 Spade \u00E8 aumentata di {0}. Totale ({1})
|
||||
Swords.SS.Length=Durata di Colpi Seghettati: [[YELLOW]]{0}s
|
||||
#TAMING
|
||||
Taming.Ability.Bonus.0=Sicurezza Ambientale
|
||||
Taming.Ability.Bonus.1=I lupi evitano il pericolo
|
||||
Taming.Ability.Bonus.2=Pelliccia Folta
|
||||
Taming.Ability.Bonus.3=1/{0} Danno, Resistenza al Fuoco
|
||||
Taming.Ability.Bonus.4=A Prova d'Urto
|
||||
Taming.Ability.Bonus.5=Gli esplosivi fanno 1/{0} del normale danno
|
||||
Taming.Ability.Bonus.6=Artigli Affilati
|
||||
Taming.Ability.Bonus.7=+{0} al Danno
|
||||
Taming.Ability.Bonus.8=Servizio Fast Food
|
||||
Taming.Ability.Bonus.9={0} Probabilit\u00E0 di guarire quando si attacca
|
||||
Taming.Ability.Bonus.10=Segugio del Cielo
|
||||
Taming.Ability.Bonus.11=Recupera salute quando viene danneggiato da magia o veleno
|
||||
Taming.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SICUREZZA AMBIENTALE)
|
||||
Taming.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PELLICCIA FOLTA)
|
||||
Taming.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (A PROVA D'URTO)
|
||||
Taming.Ability.Locked.3=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ARTIGLI AFFILATI)
|
||||
Taming.Ability.Locked.4=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SERVIZIO FAST FOOD)
|
||||
Taming.Ability.Locked.5=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SEGUGIO DEL CIELO)
|
||||
Taming.Combat.Chance.Gore=Possibilit\u00E0 di Sbranare: [[YELLOW]]{0}
|
||||
Taming.SubSkill.BeastLore.Name=Conoscenza delle Bestie
|
||||
Taming.SubSkill.BeastLore.Description=Esamina lupi e ocelot picchiandoli con un osso
|
||||
Taming.SubSkill.ShockProof.Name=A Prova d'Urto
|
||||
Taming.SubSkill.ShockProof.Description=Riduzione del Danno da Esplosione.
|
||||
Taming.SubSkill.CallOfTheWild.Name=Richiamo della Natura
|
||||
Taming.SubSkill.CallOfTheWild.Description=Evoca un animale al tuo fianco
|
||||
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW: Accovacciati e fai click destro con\n {0} {1} (Ocelot), {2} {3} (Lupo), {4} {5} (Cavallo)
|
||||
Taming.SubSkill.FastFoodService.Name=Servizio Fast Food
|
||||
Taming.SubSkill.FastFoodService.Description=Probabilit\u00E0 per i lupi di guarire quando attaccano
|
||||
Taming.SubSkill.HolyHound.Name=Segugio del Cielo
|
||||
Taming.SubSkill.HolyHound.Description=Guarito da Magia & Veleno
|
||||
Taming.SubSkill.Gore.Name=Sbranare
|
||||
Taming.SubSkill.Gore.Description=Colpo Critico che applica Emorragia
|
||||
Taming.SubSkill.SharpenedClaws.Name=Artigli Affilati
|
||||
Taming.SubSkill.SharpenedClaws.Description=Danno Bonus
|
||||
Taming.SubSkill.EnvironmentallyAware.Name=Sicurezza Ambientale
|
||||
Taming.SubSkill.EnvironmentallyAware.Description=Evita Cactus/Lava, Immune alle Cadute
|
||||
Taming.SubSkill.ThickFur.Name=Pelliccia Folta
|
||||
Taming.SubSkill.ThickFur.Description=Riduzione del Danno, Resistenza al Fuoco
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]Il tuo lupo si precipita da te...
|
||||
Taming.Listener=Addomesticamento:
|
||||
Taming.SkillName=ADDOMESTICAMENTO
|
||||
Taming.Skillup=L'abilit\u00E0 Addomesticamento \u00E8 aumentata di {0}. Totale ({1})
|
||||
Taming.Summon.Complete=[[GREEN]]Evocazione completa
|
||||
Taming.Summon.Lifespan=(Durata: {0}s)
|
||||
Taming.Summon.Fail.Ocelot=Hai troppi ocelot vicino per poterne evocare degli altri.
|
||||
Taming.Summon.Fail.Wolf=Hai troppi lupi vicino per poterne evocare degli altri.
|
||||
Taming.Summon.Fail.Horse=Hai troppi cavalli nelle vicinanze per evocarne altri.
|
||||
Taming.Summon.Fail.TooMany=Hai raggiunto il limite massimo di animali evocabili. [[YELLOW]]({0})
|
||||
Taming.Summon.Name.Format={1} di {0}
|
||||
#UNARMED
|
||||
Unarmed.Ability.Berserk.Length=Durata di Furore: [[YELLOW]]{0}s
|
||||
Unarmed.Ability.Bonus.0=Stile del Braccio di Ferro
|
||||
Unarmed.Ability.Bonus.1=Potenziamento Danno +{0}
|
||||
Unarmed.Ability.Chance.ArrowDeflect=Possibilit\u00E0 di Deviare Freccia: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.Disarm=Possibilit\u00E0 di Disarmare: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.IronGrip=Probabilit\u00E0 di Presa di Ferro: [[YELLOW]{0}
|
||||
Unarmed.Ability.IronGrip.Attacker=Il tuo avversario ha una presa di ferro!
|
||||
Unarmed.Ability.IronGrip.Defender=[[GREEN]]La tua presa di ferro ha evitato che venissi disarmato!
|
||||
Unarmed.Ability.Lower=[[GRAY]]**ABBASSI I PUGNI**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**PREPARI I PUGNI**
|
||||
Unarmed.SubSkill.Berserk.Name=Furore (CAPACIT\u00C0)
|
||||
Unarmed.SubSkill.Berserk.Description=+50% Danni, Rompe materiali fragili
|
||||
Unarmed.SubSkill.Disarm.Name=Disarmare (Giocatori)
|
||||
Unarmed.SubSkill.Disarm.Description=Fa cadere l'oggetto tenuto in mano dal nemico
|
||||
Unarmed.SubSkill.IronArmStyle.Name=Stile del Braccio di Ferro
|
||||
Unarmed.SubSkill.IronArmStyle.Description=Ti indurisce il braccio col passare del tempo
|
||||
Unarmed.SubSkill.ArrowDeflect.Name=Deviazione Frecce
|
||||
Unarmed.SubSkill.ArrowDeflect.Description=Deviare frecce
|
||||
Unarmed.SubSkill.IronGrip.Name=Presa di Ferro
|
||||
Unarmed.SubSkill.IronGrip.Description=Ti impedisce di venire disarmato
|
||||
Unarmed.Listener=Lotta:
|
||||
Unarmed.SkillName=LOTTA
|
||||
Unarmed.Skills.Berserk.Off=**Furore si \u00E8 esaurito**
|
||||
Unarmed.Skills.Berserk.On=[[GREEN]]**FURORE ATTIVATO**
|
||||
Unarmed.Skills.Berserk.Other.Off=Furore[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Furore!
|
||||
Unarmed.Skills.Berserk.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Furore [[GREEN]]si \u00E8 rigenerata!
|
||||
Unarmed.Skillup=L'abilit\u00E0 Lotta \u00E8 aumentata di {0}. Totale ({1})
|
||||
#WOODCUTTING
|
||||
Woodcutting.Ability.0=Soffia Foglie
|
||||
Woodcutting.Ability.1=Soffia via le foglie
|
||||
Woodcutting.Ability.Chance.DDrop=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
|
||||
Woodcutting.Ability.Length=Durata di Abbatti Alberi: [[YELLOW]]{0}s
|
||||
Woodcutting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SOFFIA FOGLIE)
|
||||
Woodcutting.SubSkill.TreeFeller.Name=Abbattitore d'Alberi (CAPACIT\u00C0)
|
||||
Woodcutting.SubSkill.TreeFeller.Description=Fa esplodere gli alberi
|
||||
Woodcutting.SubSkill.LeafBlower.Name=Soffia Foglie
|
||||
Woodcutting.SubSkill.LeafBlower.Description=Soffia via le foglie
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=Doppi Drop
|
||||
Woodcutting.SubSkill.HarvestLumber.Description=Raddoppia il normale drop
|
||||
Woodcutting.Listener=Taglialegna:
|
||||
Woodcutting.SkillName=TAGLIALEGNA
|
||||
Woodcutting.Skills.TreeFeller.Off=**Abbattitore d'Alberi si \u00E8 esaurito**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**ABBATTITORE D'ALBERI ATTIVATO**
|
||||
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Abbattitore d'Alberi [[GREEN]]si \u00E8 rigenerata!
|
||||
Woodcutting.Skills.TreeFeller.Other.Off=Abbattitore d'Alberi[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Abbattitore d'Alberi!
|
||||
Woodcutting.Skills.TreeFeller.Splinter=LA TUA ASCIA SI FRANTUMA IN DECINE DI PEZZI!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Quell'albero \u00E8 troppo grande!
|
||||
Woodcutting.Skillup=L'abilit\u00E0 Taglialegna \u00E8 aumentata di {0}. Totale ({1})
|
||||
#ABILITIY
|
||||
##generic
|
||||
Ability.Generic.Refresh=[[GREEN]]**CAPACIT\u00C0 RIGENERATE!**
|
||||
Ability.Generic.Template.Lock=[[GRAY]]{0}
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
#COMBAT
|
||||
Combat.ArrowDeflect=[[WHITE]]**FRECCIA DEVIATA**
|
||||
Combat.BeastLore=[[GREEN]]**CONOSCENZA DELLE BESTIE**
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]Salute ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Proprietario ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]**SBRANATO**
|
||||
Combat.StruckByGore=**SEI STATO SBRANATO**
|
||||
Combat.TargetDazed=Il bersaglio \u00E8 rimasto [[DARK_RED]]Stordito
|
||||
Combat.TouchedFuzzy=Urto Stordino. Vado nel Pallone.
|
||||
#COMMANDS
|
||||
##generic
|
||||
mcMMO.Description=[[DARK_AQUA]]Riguardo il [[DARK_AQUA]]Progetto [[YELLOW]]mcMMO:,[[GOLD]]mcMMO \u00E8 una mod GdR [[RED]]open source[[GOLD]] creata nel Febbraio 2011,[[GOLD]]da [[BLUE]]com.gmail.nossr50[[GOLD]]. L'obiettivo \u00E8 quello di fornire un'esperienza GdR di qualit\u00E0.,[[DARK_AQUA]]Suggerimenti:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] per vedere i comandi,[[GOLD]] - [[GREEN]]Digita [[RED]]/NOMEABILIT\u00C0[[GREEN]] per vedere informazioni dettagliate su un'abilit\u00E0,[[DARK_AQUA]]Sviluppatori:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Fondatore),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Capo Progetto),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Sviluppatore),[[DARK_AQUA]]Link Utili:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Segnalazione Bug,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in tutte le abilit\u00E0!
|
||||
Commands.addlevels.AwardAll.2=Tutte le abilit\u00E0 sono state modificate per {0}.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in {1}!
|
||||
Commands.addlevels.AwardSkill.2={0} \u00E8 stata modificata per {1}.
|
||||
Commands.addxp.AwardAll=[[GREEN]]Ti sono stati aggiudicati {0} punti esperienza in tutte le abilit\u00E0!
|
||||
Commands.addxp.AwardSkill=[[GREEN]]Ti sono stati aggiudicati {0} punti esperienza in {1}!
|
||||
Commands.Ability.Off=Uso delle capacit\u00E0 [[RED]]disattivato
|
||||
Commands.Ability.On=Uso delle capacit\u00E0 [[GREEN]]attivato
|
||||
Commands.Ability.Toggle=L'uso delle abilit\u00E0 \u00E8 stato attivato/disattivato per [[YELLOW]]{0}
|
||||
Commands.AdminChat.Off=Chat solo Amministratori [[RED]]Inattiva
|
||||
Commands.AdminChat.On=Chat solo Amministratori [[GREEN]]Attiva
|
||||
Commands.AdminToggle=[[GREEN]]- Attiva/disattiva la chat amministratori
|
||||
Commands.Chat.Console=*Console*
|
||||
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]Ricariche Abilit\u00E0 mcMMO[[GOLD]] =--
|
||||
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} secondi rimanenti
|
||||
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Pronto!
|
||||
Commands.Database.Cooldown=Devi aspettare {0} secondi prima di poter usare questo comando ancora.
|
||||
Commands.Database.Processing=Il comando precedente \u00E8 ancora in fase di elaborazione. Attendere prego.
|
||||
Commands.Disabled=Questo comando \u00E8 disabilitato.
|
||||
Commands.DoesNotExist=Il giocatore non esiste nel database!
|
||||
Commands.GodMode.Disabled=Modalit\u00E0 Dio di mcMMO Disabilitata
|
||||
Commands.GodMode.Enabled=Modalit\u00E0 Dio di mcMMO Abilitata
|
||||
Commands.GodMode.Forbidden=[mcMMO] Modalit\u00E0 Dio non permessa in questo mondo (Vedi i Permessi)
|
||||
Commands.GodMode.Toggle=La modalit\u00E0 Dio \u00E8 stata attivata/disattivata per [[YELLOW]]{0}
|
||||
Commands.Healthbars.Changed.HEARTS=[mcMMO] Il tuo tipo di barra della salute \u00E8 stato cambiato a [[RED]]Cuori[[WHITE]].
|
||||
Commands.Healthbars.Changed.BAR=[mcMMO] Il tuo tipo di barra della salute \u00E8 stato cambiato a [[YELLOW]]Caselle[[WHITE]].
|
||||
Commands.Healthbars.Changed.DISABLED=[mcMMO] Le tue barre di salute dei mob sono state [[GRAY]]disabilitate[[WHITE]].
|
||||
Commands.Healthbars.Invalid=Tipo di barra della salute non valido!
|
||||
Commands.Inspect=<giocatore> [[GREEN]]- Visualizza informazioni dettagliate sul giocatore
|
||||
Commands.Invite.Success=[[GREEN]]Invito inviato con successo.
|
||||
Commands.Leaderboards=<abilit\u00E0> <pagina> [[GREEN]]- Classifiche
|
||||
Commands.mcc.Header=---[][[GREEN]]Comandi di mcMMO[[RED]][]---
|
||||
Commands.mcgod=[[GREEN]]- Attiva o disattiva la Modalit\u00E0 Dio
|
||||
Commands.mchud.Invalid=Quello non \u00E8 un tipo di HUD valido.
|
||||
Commands.mcpurge.Success=[[GREEN]]Il database \u00E8 stato ripulito con successo!
|
||||
Commands.mcrank.Heading=[[GOLD]]-=GRADUATORIA PERSONALE=-
|
||||
Commands.mcrank.Overall=Complessivo[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{0}
|
||||
Commands.mcrank.Player=BERSAGLIO: [[WHITE]]{0}
|
||||
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{1}
|
||||
Commands.mcrank.Unranked=[[WHITE]]Non Classificato
|
||||
Commands.mcrefresh.Success=Le ricariche di {0} sono stati rigenerate.
|
||||
Commands.mcremove.Success=[[GREEN]]{0} \u00E8 stato rimosso con successo dal database!
|
||||
Commands.mctop.Tip=[[GOLD]]Suggerimento: Usa [[RED]]/mcrank[[GOLD]] per visualizzare tutte le tue graduatorie personali!
|
||||
Commands.mmoedit=[giocatore] <abilit\u00E0> <nuovovalore> [[GREEN]] - Modifica il bersaglio
|
||||
Commands.mmoedit.AllSkills.1=[[GREEN]]Il tuo livello in tutte le abilit\u00E0 \u00E8 stato portato a {0}!
|
||||
Commands.mmoedit.Modified.1=[[GREEN]]Il tuo livello di {0} \u00E8 stato portato a {1}!
|
||||
Commands.mmoedit.Modified.2={0} \u00E8 stata modificata per {1}.
|
||||
Commands.mcconvert.Database.Same=Stai gi\u00E0 usando il database {0}!
|
||||
Commands.mcconvert.Database.InvalidType={0} non \u00E8 un tipo di database valido.
|
||||
Commands.mcconvert.Database.Start=[[GRAY]]Avviando la conversione da {0} a {1}...
|
||||
Commands.mcconvert.Database.Finish=[[GRAY]]Migrazione del database completa; il database {1} ora ha tutti i dati dal database {0}.
|
||||
Commands.mmoshowdb=Il database attualmente in uso \u00E8 [[GREEN]]{0}
|
||||
Commands.mcconvert.Experience.Invalid=Tipo di formula sconosciuta! I tipi validi sono: [[GREEN]]LINEAR [[RED]]e [[GREEN]]EXPONENTIAL.
|
||||
Commands.mcconvert.Experience.Same=Tipo di formula {0} gi\u00E0 in uso
|
||||
Commands.mcconvert.Experience.Start=[[GRAY]]Avviando conversione da {0} a {1}
|
||||
Commands.mcconvert.Experience.Finish=[[GRAY]]Conversione formula completata; adesso in uso {0} XP.
|
||||
Commands.ModDescription=[[GREEN]]- Leggi breve descrizione di mod
|
||||
Commands.NoConsole=Questo comando non supporta l'uso da console.
|
||||
Commands.Notifications.Off=Notifiche delle capacit\u00E0 [[RED]]disattivate
|
||||
Commands.Notifications.On=Notifiche delle capacit\u00E0 [[GREEN]]attivate
|
||||
Commands.Offline=Questo comando non funziona per i giocatori offline.
|
||||
Commands.NotLoaded=Il profilo del giocatore non \u00E8 stato ancora caricato.
|
||||
Commands.Other=---[][[GREEN]]ALTRI COMANDI[[RED]][]---
|
||||
Commands.Party.Header=-----[][[GREEN]]GRUPPO[[RED]][]-----
|
||||
Commands.Party.Features.Header=-----[][[GREEN]]CARATTERISTICHE[[RED]][]-----
|
||||
Commands.Party.Status=[[DARK_GRAY]]NOME: [[WHITE]]{0} {1} [[DARK_GRAY]]LIVELLO: [[DARK_AQUA]]{2}
|
||||
Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLEATO: [[WHITE]]{0}
|
||||
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Caratteristiche sbloccate: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.ShareMode=[[DARK_GRAY]]MODALIT\u00C0 SPARTIZIONE:
|
||||
Commands.Party.ItemShare=[[GRAY]]OGGETTI [[DARK_AQUA]]({0})
|
||||
Commands.Party.ExpShare=[[GRAY]]ESPERIENZA [[DARK_AQUA]]({0})
|
||||
Commands.Party.ItemShareCategories=[[DARK_GRAY]]Condivisione Oggetti: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.MembersNear=[[DARK_GRAY]]VICINO A TE [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
|
||||
Commands.Party.Accept=[[GREEN]]- Accetta l'invito di un gruppo
|
||||
Commands.Party.Chat.Off=Chat Gruppo [[GREEN]]Inattiva
|
||||
Commands.Party.Chat.On=Chat Gruppo [[GREEN]]Attiva
|
||||
Commands.Party.Commands=---[][[GREEN]]COMANDI GRUPPO[[RED]][]---
|
||||
Commands.Party.Invite.0=AVVISO: [[GREEN]]Hai ricevuto un invito ad unirti al gruppo {0} da {1}
|
||||
Commands.Party.Invite.1=Digita [[GREEN]]/party accept[[YELLOW]] per accettare l'invito
|
||||
Commands.Party.Invite=[[GREEN]]- Invia un invito a entrare nel gruppo
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]Invito Accettato. Ti sei unito al gruppo {0}
|
||||
Commands.Party.Join=[[GRAY]]Ti sei unito al Gruppo: {0}
|
||||
Commands.Party.Create=[[GRAY]]Creato il Gruppo: {0}
|
||||
Commands.Party.Rename=[[GRAY]]Nome del gruppo cambiato a: [[WHITE]]{0}
|
||||
Commands.Party.SetSharing=[[GRAY]]Modalit\u00E0 spartizione del gruppo {0} impostata a: [[DARK_AQUA]]{1}
|
||||
Commands.Party.ToggleShareCategory=[[GRAY]]La condivisione oggetti del gruppo per [[GOLD]]{0} [[GRAY]]\u00E8 stata [[DARK_AQUA]]{1}
|
||||
Commands.Party.AlreadyExists=[[DARK_RED]]Il gruppo {0} esiste gi\u00E0!
|
||||
Commands.Party.Kick=Sei stato espulso dal gruppo {0}!
|
||||
Commands.Party.Leave=Hai abbandonato quel gruppo
|
||||
Commands.Party.Members.Header=-----[][[GREEN]]MEMBRI[[RED]][]-----
|
||||
Commands.Party.None=Non sei in un gruppo.
|
||||
Commands.Party.Quit=[[GREEN]]- Abbandona il tuo gruppo attuale
|
||||
Commands.Party.Teleport=[[GREEN]]- Teletrasportati da un membro del gruppo
|
||||
Commands.Party.Toggle=[[GREEN]]- Attiva/disattiva la Chat Gruppo
|
||||
Commands.Party1=[[GREEN]]- Crea un nuovo gruppo
|
||||
Commands.Party2=[[GREEN]]- Unisciti a un gruppo di giocatori
|
||||
Commands.Party.Alliance.Header=-----[][[GREEN]]ALLEANZA DEL GRUPPO[[RED]][]-----
|
||||
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u00C8 ALLEATO CON: [[WHITE]]{1}
|
||||
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]MEMBRI ALLEANZA[[RED]][]-----
|
||||
Commands.Party.Alliance.Invite.0=AVVISO: [[GREEN]]Hai ricevuto un invito di alleanza del gruppo per {0} da {1}
|
||||
Commands.Party.Alliance.Invite.1=Digita [[GREEN]]/party alliance accept[[YELLOW]] per accettare l'invito
|
||||
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Invito di alleanza accettato.
|
||||
Commands.Party.Alliance.None=Il tuo gruppo non ha un alleato.
|
||||
Commands.Party.Alliance.AlreadyAllies=Il tuo gruppo ha gi\u00E0 un'alleato. Sciogli l'alleanza con [[DARK_AQUA]]/party alliance disband
|
||||
Commands.Party.Alliance.Help.0=Questo gruppo non ha formato un'alleanza. Invita un capo gruppo.
|
||||
Commands.Party.Alliance.Help.1=fai un'alleanza con [[DARK_AQUA]]/party alliance invite <giocatore>[[RED]].
|
||||
Commands.ptp.Enabled=Teletrasporto del gruppo [[GREEN]]abilitato
|
||||
Commands.ptp.Disabled=Teletrasporto del gruppo [[RED]]disabilitato
|
||||
Commands.ptp.NoRequests=Non hai richieste di teletrasporto in questo momento
|
||||
Commands.ptp.NoWorldPermissions=[mcMMO] Non hai il permesso di teletrasportarti verso il mondo {0}.
|
||||
Commands.ptp.Request1={0} [[GREEN]]ha richiesto di teletrasportarsi da te.
|
||||
Commands.ptp.Request2=[[GREEN]]Per teletrasportarti digita [[YELLOW]]/ptp accept[[GREEN]]. La richiesta scadr\u00E0 tra [[RED]]{0} [[GREEN]]secondi.
|
||||
Commands.ptp.AcceptAny.Enabled=Conferma delle richieste di teletrasporto del gruppo [[GREEN]]abilitata
|
||||
Commands.ptp.AcceptAny.Disabled=Conferma delle richieste di teletrasporto del gruppo [[RED]]disabilitata
|
||||
Commands.ptp.RequestExpired=La richiesta di teletrasporto del gruppo \u00E8 scaduta!
|
||||
Commands.PowerLevel.Leaderboard=--Classifica mcMMO dei [[BLUE]]Livelli di Potere[[YELLOW]]--
|
||||
Commands.PowerLevel.Capped=[[DARK_RED]]LIVELLO DI POTERE: [[GREEN]]{0} [[DARK_RED]]LIVELLO MASSIMO: [[YELLOW]]{1}
|
||||
Commands.PowerLevel=[[DARK_RED]]LIVELLO DI POTERE: [[GREEN]]{0}
|
||||
Commands.Reset.All=[[GREEN]]Tutti i tuoi livelli di abilit\u00E0 sono stati azzerati con successo.
|
||||
Commands.Reset.Single=[[GREEN]]La tua abilit\u00E0 {0} \u00E8 stata azzerata con successo.
|
||||
Commands.Reset=[[GREEN]]- Reimposta un livello di abilit\u00E0 a 0
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]scoreboard mcMMO cancellata.
|
||||
Commands.Scoreboard.NoBoard=La scoreboard mcMMO non \u00E8 attiva.
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]La scoreboard mcMMO rimmarr\u00E0 fino a quando non userai [[GREEN]]/mcscoreboard clear[[DARK_AQUA]].
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]La scoreboard mcMMO sar\u00E0 cancellata tra [[GOLD]]{0}[[DARK_AQUA]] secondi da adesso.
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Aiuto per [[RED]]/mcscoreboard[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - cancella la scoreboard McMMO
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mantiene la scoreboard mcMMO attiva
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - cancella la scoreboard McMMO dopo [[LIGHT_PURPLE]]n[[WHITE]] secondi
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]Suggerimento: Usa [[RED]]/mcscoreboard keep[[GOLD]] mentre la scoreboard \u00E8 attiva per evitare che vada via.
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]Suggerimento: Usa [[RED]]/mcscoreboard clear[[GOLD]] per sbarazzarti della scoreboard.
|
||||
Commands.Skill.Invalid=Questo non \u00E8 un nome di abilit\u00E0 valido!
|
||||
Commands.Skill.Leaderboard=--Classifica mcMMO di [[BLUE]]{0}[[YELLOW]]--
|
||||
Commands.SkillInfo=[[GREEN]]- Vedi informazioni dettagliate su un'abilit\u00E0
|
||||
Commands.Stats.Self=LE TUE STATISTICHE
|
||||
Commands.Stats=[[GREEN]]- Visualizza le tue statistiche mcMMO
|
||||
Commands.ToggleAbility=[[GREEN]]- Attiva o disattiva l'attivazione delle abilit\u00E0 con click destro
|
||||
Commands.Usage.0=[[RED]]L'uso appropriato \u00E8 /{0}
|
||||
Commands.Usage.1=L'uso appropriato \u00E8 /{0} {1}
|
||||
Commands.Usage.2=L'uso appropriato \u00E8 /{0} {1} {2}
|
||||
Commands.Usage.3=L'uso appropriato \u00E8 /{0} {1} {2} {3}
|
||||
Commands.Usage.FullClassName=nome classe
|
||||
Commands.Usage.Level=livello
|
||||
Commands.Usage.Message=messaggio
|
||||
Commands.Usage.Page=pagina
|
||||
Commands.Usage.PartyName=nome
|
||||
Commands.Usage.Password=password
|
||||
Commands.Usage.Player=giocatore
|
||||
Commands.Usage.Rate=tasso
|
||||
Commands.Usage.Skill=abilit\u00E0
|
||||
Commands.Usage.XP=xp
|
||||
mcMMO.NoInvites=Non hai inviti in questo momento
|
||||
mcMMO.NoPermission=[[DARK_RED]]Permessi insufficienti.
|
||||
mcMMO.NoSkillNote=[[DARK_GRAY]]Se non hai accesso a un'abilit\u00E0 non sar\u00E0 mostrata qui.
|
||||
##party
|
||||
Party.Forbidden=[mcMMO] I gruppi non sono permessi in questo mondo (vedi i Permessi)
|
||||
Party.Help.0=L'uso appropriato \u00E8 [[DARK_AQUA]]{0} <giocatore> [password].
|
||||
Party.Help.1=Per creare un gruppo, usa [[DARK_AQUA]]{0} <nome> [password].
|
||||
Party.Help.2=Consulta [[DARK_AQUA]]{0} [[RED]]per maggiori informazioni
|
||||
Party.Help.3=Usa [[DARK_AQUA]]{0} <giocatore> [password] [[RED]]per unirti o [[DARK_AQUA]]{1} [[RED]]per congedarti
|
||||
Party.Help.4=Per chiudere o aprire il tuo gruppo, usa [[DARK_AQUA]]{0}
|
||||
Party.Help.5=Per proteggere il tuo gruppo con una password, usa [[DARK_AQUA]]{0} <password>
|
||||
Party.Help.6=Per espellere un giocatore dal tuo gruppo, usa [[DARK_AQUA]]{0} <giocatore>
|
||||
Party.Help.7=Per trasferire la propriet\u00E0 del tuo gruppo, usa [[DARK_AQUA]]{0} <giocatore>
|
||||
Party.Help.8=Per sciogliere il tuo gruppo, usa [[DARK_AQUA]]{0}
|
||||
Party.Help.9=Usa [[DARK_AQUA]]{0} [[RED]]per condividere oggetti con i membri del tuo gruppo
|
||||
Party.Help.10=Usa [[DARK_AQUA]]{0} [[RED]]per abilitare la condivisione di XP con i membri del tuo gruppo
|
||||
Party.InformedOnJoin={0} [[GREEN]]si \u00E8 unito al tuo gruppo
|
||||
Party.InformedOnQuit={0} [[GREEN]]ha abbandonato il tuo gruppo
|
||||
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]ha impostato il nome del gruppo a [[WHITE]]{1}
|
||||
Party.InvalidName=[[DARK_RED]]Questo non \u00E8 un nome di gruppo valido.
|
||||
Party.Invite.Self=Non puoi invitare te stesso!
|
||||
Party.IsLocked=Questo gruppo \u00E8 gi\u00E0 chiuso!
|
||||
Party.IsntLocked=Questo gruppo non \u00E8 chiuso!
|
||||
Party.Locked=Il gruppo \u00E8 chiuso, solo il capo del gruppo pu\u00F2 fare inviti.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} non \u00E8 nel tuo gruppo
|
||||
Party.NotOwner=[[DARK_RED]]Non sei il capo del gruppo.
|
||||
Party.Target.NotOwner=[[DARK_RED]]{0} non \u00E8 il capo del gruppo.
|
||||
Party.Owner.New=[[GREEN]]{0} \u00E8 il nuovo capo del gruppo.
|
||||
Party.Owner.NotLeader=[[DARK_RED]]Non sei pi\u00F9 il capo del gruppo.
|
||||
Party.Owner.Player=[[GREEN]]Ora sei il capo del gruppo.
|
||||
Party.Password.None=Questo gruppo \u00E8 protetto da password. Sei pregato di fornire una password per unirti ad esso.
|
||||
Party.Password.Incorrect=La password del gruppo \u00E8 errata.
|
||||
Party.Password.Set=[[GREEN]]Password del gruppo impostata a {0}
|
||||
Party.Password.Removed=[[GREEN]]La password del gruppo \u00E8 stata rimossa.
|
||||
Party.Player.Invalid=Quello non \u00E8 un giocatore valido.
|
||||
Party.NotOnline=[[DARK_RED]]{0} non \u00E8 online!
|
||||
Party.Player.InSameParty={0} \u00E8 gi\u00E0 nel tuo gruppo!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} non \u00E8 in un gruppo
|
||||
Party.Specify=Devi specificare un gruppo.
|
||||
Party.Teleport.Dead=Non puoi teletrasportarti da un giocatore morto.
|
||||
Party.Teleport.Hurt=Sei stato ferito negli ultimi {0} secondi e non puoi teletrasportarti.
|
||||
Party.Teleport.Player=[[GREEN]]Ti sei teletrasportato da {0}.
|
||||
Party.Teleport.Self=Non puoi teletrasportarti verso te stesso!
|
||||
Party.Teleport.Target=[[GREEN]]{0} ti ha teletrasportato.
|
||||
Party.Teleport.Disabled={0} non consente il teletrasporto del gruppo.
|
||||
Party.Rename.Same=Questo \u00E8 gi\u00E0 il nome del tuo gruppo!
|
||||
Party.Join.Self=Non puoi unirti a te stesso!
|
||||
Party.Unlocked=[[GRAY]]Il gruppo \u00E8 aperto
|
||||
Party.Disband=[[GRAY]]Il gruppo \u00E8 stato sciolto
|
||||
Party.Alliance.Formed=[[GRAY]]Il tuo gruppo \u00E8 ora alleato con [[GREEN]]{0}
|
||||
Party.Alliance.Disband=[[GRAY]]Il tuo gruppo non \u00E8 pi\u00F9 alleato con [[RED]]{0}
|
||||
Party.Status.Locked=[[DARK_RED]](SOLO SU INVITO)
|
||||
Party.Status.Unlocked=[[DARK_GREEN]](APERTO)
|
||||
Party.LevelUp=Livello del gruppo aumentato di {0}. Totale ({1})
|
||||
Party.Feature.Chat=Chat Gruppo
|
||||
Party.Feature.Teleport=Teletrasporto del Gruppo
|
||||
Party.Feature.Alliance=Alleanze
|
||||
Party.Feature.ItemShare=Condivisione Oggetti
|
||||
Party.Feature.XpShare=Condivisione XP
|
||||
Party.Feature.Locked.Chat=BLOCCATO FINO A {0}+ (CHAT GRUPPO)
|
||||
Party.Feature.Locked.Teleport=BLOCCATO FINO A {0}+ (TELETRASPORTO DEL GRUPPO)
|
||||
Party.Feature.Locked.Alliance=BLOCCATO FINO A {0}+ (ALLEANZE)
|
||||
Party.Feature.Locked.ItemShare=BLOCCATO FINO A {0}+ (CONDIVISIONE OGGETTI)
|
||||
Party.Feature.Locked.XpShare=BLOCCATO FINO A {0}+ (CONDIVISIONE XP)
|
||||
Party.Feature.Disabled.1=La chat del gruppo non \u00E8 stata ancora sbloccata.
|
||||
Party.Feature.Disabled.2=Il teletrasporto del gruppo non \u00E8 stato ancora sbloccato.
|
||||
Party.Feature.Disabled.3=Le alleanze del gruppo non sono ancora state sbloccate.
|
||||
Party.Feature.Disabled.4=La condivisione del gruppo degli oggetti non \u00E8 ancora sbloccata.
|
||||
Party.Feature.Disabled.5=La condivisione di XP del gruppo non \u00E8 stata ancora sbloccata.
|
||||
Party.ShareType.Xp=XP
|
||||
Party.ShareType.Item=OGGETTO
|
||||
Party.ShareMode.None=NESSUNA
|
||||
Party.ShareMode.Equal=EQUA
|
||||
Party.ShareMode.Random=CASUALE
|
||||
Party.ItemShare.Category.Loot=Bottino
|
||||
Party.ItemShare.Category.Mining=Estrazione
|
||||
Party.ItemShare.Category.Herbalism=Erboristeria
|
||||
Party.ItemShare.Category.Woodcutting=Taglialegna
|
||||
Party.ItemShare.Category.Misc=Varie
|
||||
##xp
|
||||
Commands.XPGain.Acrobatics=Cadere
|
||||
Commands.XPGain.Alchemy=Preparazione Pozioni
|
||||
Commands.XPGain.Archery=Attaccare Mostri
|
||||
Commands.XPGain.Axes=Attaccando Mostri
|
||||
Commands.XPGain.Child=Ottiene livelli dalle Abilit\u00E0 Madri
|
||||
Commands.XPGain.Excavation=Scavare e trovare tesori
|
||||
Commands.XPGain.Fishing=Pescare (ma va'?!)
|
||||
Commands.XPGain.Herbalism=Raccogliere Piante
|
||||
Commands.XPGain.Mining=Estrarre Pietra e Minerali Grezzi
|
||||
Commands.XPGain.Repair=Riparare
|
||||
Commands.XPGain.Swords=Attaccare Mostri
|
||||
Commands.XPGain.Taming=Addomesticare Animali, o combattere con i tuoi lupi
|
||||
Commands.XPGain.Unarmed=Attaccare Mostri
|
||||
Commands.XPGain.Woodcutting=Abbattere alberi
|
||||
Commands.XPGain=[[DARK_GRAY]]GUADAGNO XP: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]La tua BARRA XP \u00E8 ora bloccata a {0}!
|
||||
Commands.xplock.unlocked=[[GOLD]]La tua BARRA XP \u00E8 ora [[GREEN]]SBLOCCATA[[GOLD]]!
|
||||
Commands.xprate.modified=Il TASSO XP \u00E8 stato portato a {0}
|
||||
Commands.xprate.over=L'evento mcMMO di tasso XP \u00E8 FINITO!!
|
||||
Commands.xprate.proper.0=L'uso corretto per cambiare il tasso di XP \u00E8 /xprate <numero intero> <true/false>
|
||||
Commands.xprate.proper.1=L'uso corretto per ripristinare il tasso di XP al valore originale \u00E8 /xprate reset
|
||||
Commands.xprate.proper.2=Per favore specifica "true" o "false" per indicare se questo \u00E8 un evento XP o meno
|
||||
Commands.xprate.started.0=[[GOLD]]\u00C8 INIZIATO UN EVENTO XP PER mcMMO!
|
||||
Commands.xprate.started.1=[[GOLD]]IL TASSO DI XP DI mcMMO ORA \u00C8 {0}x!
|
||||
XPRate.Event=[[GOLD]]\u00C8 in corso un evento mcMMO sul tasso XP! Il tasso XP \u00E8 {0}x!
|
||||
#EFFECTS
|
||||
##generic
|
||||
Effects.Effects=EFFETTI
|
||||
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
|
||||
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
|
||||
Effects.Parent=[[GOLD]]{0} -
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
#GUIDES
|
||||
Guides.Available=[[GRAY]]Guida per {0} disponibile - digita /{1} ? [pagina]
|
||||
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guida[[GOLD]]=-
|
||||
Guides.Page.Invalid=Non \u00E8 un numero di pagina valido!
|
||||
Guides.Page.OutOfRange=Quella pagina non esiste, ci sono solo {0} pagine in totale.
|
||||
Guides.Usage=L'uso \u00E8 /{0} ? [pagina]
|
||||
##Acrobatics
|
||||
Guides.Acrobatics.Section.0=[[DARK_AQUA]]Riguardo L'Acrobatica:\n[[YELLOW]]L'Acrobatica \u00E8 l'arte di muoversi con grazia in mcMMO.\n[[YELLOW]]Essa fornisce bonus di combattimento e bonus di danni ambientali.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 \u00E8 necessario\n[[YELLOW]]eseguire schivate in combattimento\n[[YELLOW]]o sopravvivere a cadute che danneggiano.
|
||||
Guides.Acrobatics.Section.1=[[DARK_AQUA]]Come funziona Rotolamento?\n[[YELLOW]]Hai una possibilit\u00E0 passiva quando prendi danni da caduta\n[[YELLOW]]di annullare il danno subito. Puoi tenere premuto il pulsante di\n[[YELLOW]]accovacciata per raddoppiare la possibilit\u00E0 durante la caduta.\n[[YELLOW]]Questo attiva una Capriola Aggraziata invece di quella\n[[YELLOW]]standard. Le Capriole Aggraziate sono come quelle normali\n[[YELLOW]]ma hanno il doppio delle probabilit\u00E0 di verificarsi e forniscono\n[[YELLOW]]pi\u00F9 sicurezza. La possibilit\u00E0 di capriola \u00E8 legata al livello abilit\u00E0
|
||||
Guides.Acrobatics.Section.2=[[DARK_AQUA]]Come funziona la Schivata?\n[[YELLOW]]La Schivata \u00E8 una possibilit\u00E0 passiva quando si \u00E8\n[[YELLOW]]feriti in combattimento di dimezzare il danno preso.\n[[YELLOW]]\u00C8 legato al tuo livello di abilit\u00E0.
|
||||
##Alchemy
|
||||
Guides.Alchemy.Section.0=[[DARK_AQUA]]Riguardo l'Alchimia:\n[[YELLOW]]L'Alchimia riguarda il preparare pozioni.\n[[YELLOW]]Fornisce un aumento di velocit\u00E0 nella produzione di pozioni, cos\u00EC\n[[YELLOW]]come l'aggiunta di nuove (prima) pozioni introvabili.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 devi preparare pozioni.
|
||||
Guides.Alchemy.Section.1=[[DARK_AQUA]]Come funziona la Catalisi?\n[[YELLOW]]La Catalisi accelera il processo di preparazione,\n[[YELLOW]]con una velocit\u00E0 massima di 4x al livello 1000.\n[[YELLOW]]Questa abilit\u00E0 \u00E8 sbloccata al livello 100 di default.
|
||||
Guides.Alchemy.Section.2=[[DARK_AQUA]]Come funziona Intrugli?\n[[YELLOW]]Intrugli consente di preparare pi\u00F9 pozioni con ingredienti\n[[YELLOW]]personalizzati. Quali ingredienti speciali sono sbloccati\n[[YELLOW]]\u00C8 determinato dal tuo Grado. Ci sono 8 Gradi da sbloccare.
|
||||
Guides.Alchemy.Section.3=[[DARK_AQUA]]Ingredienti Intrugli livello 1:\n[[YELLOW]]Polvere di Blaze, Occhio di Ragno Fermentato, Lacrima di Ghast,\n[[YELLOW]]Polvere di Luminite, Zucchero, Melone Luccicante,\n[[YELLOW]]Carota d'Oro, Crema di Magma, Verruca del Nether,\n[[YELLOW]]Occhio di Ragno, Zolfo, Ninfea, Pesce Palla\n[[YELLOW]](Pozioni Vanilla)
|
||||
Guides.Alchemy.Section.4=[[DARK_AQUA]]Ingredienti Intrugli livello 2:\n[[YELLOW]]Carota (Pozione della Velocit\u00E0)\n[[YELLOW]]Palla di Gelatina (Pozione di Noia)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 3:\n[[YELLOW]]Quarzo (Pozione di Assorbimento)\n[[YELLOW]]Fungo Rosso (Pozione del Salto)
|
||||
Guides.Alchemy.Section.5=[[DARK_AQUA]]Ingredienti Intrugli livello 4:\n[[YELLOW]]Mela (Pozione di Potenziamento Salute)\n[[YELLOW]]Carne Marcia (Pozione della Fame)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 5:\n[[YELLOW]]Fungo Marrone (Pozione di Nausea)\n[[YELLOW]]Sacca d'Inchiostro (Pozione di Cecit\u00E0)
|
||||
Guides.Alchemy.Section.6=[[DARK_AQUA]]Ingredienti Intrugli livello 6:\n[[YELLOW]]Felce (Pozione di Saturazione)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 7:\n[[YELLOW]]Patata Velenosa (Pozione di Decadimento)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Mela d'Oro (Pozione di Resistenza)
|
||||
##Archery
|
||||
Guides.Archery.Section.0=[[DARK_AQUA]]Riguardo Tiro con l'Arco:\n[[YELLOW]]Tiro con l'Arco riguarda il tirare con arco e freccia.\n[[YELLOW]]Fornisce vari bonus di combattimento, come un incremento\n[[YELLOW]]di danno che scala con il livello e l'abilit\u00E0 di stordire i tuoi\n[[YELLOW]]avversari in PvP. Inoltre puoi recuperare alcune delle\n[[YELLOW]]frecce spese dai cadaveri dei tuoi nemici.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 \u00E8 necessario\n[[YELLOW]]colpire i mob o gli altri giocatori.
|
||||
Guides.Archery.Section.1=[[DARK_AQUA]]Come funziona Tiro da Maestro?\n[[YELLOW]]Tiro da Maestro fornisce un danno aggiuntivo ai tuoi colpi.\n[[YELLOW]]Il danno bonus da Tiro da Maestro aumenta\n[[YELLOW]]all'aumentare del livello di Tiro con l'Arco.\n[[YELLOW]]Con le impostazioni di default, il danno dei tiri con l'arco\n[[YELLOW]]aumenta del 10% ogni 50 livelli, fino a un massimo del 200%.
|
||||
Guides.Archery.Section.2=[[DARK_AQUA]]Come funziona Stordire?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di stordire gli altri giocatori quando\n[[YELLOW]]li colpisci. Quando Stordire si innesca costringe gli avversari\n[[YELLOW]]a guardare verso l'alto per una breve durata.\n[[YELLOW]]Un colpo di Stordire procura anche ulteriori 4 danni (2 cuori).
|
||||
Guides.Archery.Section.3=[[DARK_AQUA]]Come funziona Recupero Frecce?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di recuperare alcune\n[[YELLOW]]delle tue frecce quando uccidi un mob con l'arco.\n[[YELLOW]]Questa possibilit\u00E0 \u00E8 aumentata dal livello in Tiro con l'Arco.\n[[YELLOW]Di default, questa capacit\u00E0 aumenta di 0.1% per livello,\n[[YELLOW]]fino al 100% al livello 1000.
|
||||
##Axes
|
||||
Guides.Axes.Section.0=[[DARK_AQUA]]Riguardo Asce:\n[[YELLOW]]Con l'abilit\u00E0 Asce \u00E8 possibile utilizzare l'ascia per molto di\n[[YELLOW]]pi\u00F9 che solo deforestare! \u00E8 possibile incidere e sgretolare\n[[YELLOW]]mob e giocatori per guadagnare XP, colpire mob con l'effetto\n[[YELLOW]]di contraccolpo e infliggere danni critici MORTALI sui mob e\n[[YELLOW]]giocatori. La tua ascia diventa anche un biotrituratore\n[[YELLOW]]portatile, abbattendo l'armatura del nemico con facilit\u00E0 con\n[[YELLOW]]l'aumentare del livello.\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 devi colpire mob\n[[YELLOW]]o altri giocatori con la tua Ascia.
|
||||
Guides.Axes.Section.1=[[DARK_AQUA]]Come funziona Spacca Crani?\n[[YELLOW]]Questa capacit\u00E0 consente di fare un colpo EaA\n[[YELLOW]](Effetto ad Area). Questo EaA infligger\u00E0 la met\u00E0 del danno\n[[YELLOW]]fatto all'obbiettivo principale, quindi \u00E8 ottimo per sgombrare\n[[YELLOW]]grandi mucchi di mob.
|
||||
Guides.Axes.Section.2=[[DARK_AQUA]]Come funziona Colpi Critici?\n[[YELLOW]]Colpi Critici \u00E8 una capacit\u00E0 passiva che d\u00E0 ai giocatori\n[[YELLOW]]la possibilit\u00E0 di fare danno aggiuntivo.\n[[YELLOW]]Con le impostazioni predefinite, ogni 2 livelli in Asce aggiudica\n[[YELLOW]]lo 0.1% di possibilit\u00E0 di fare un Colpo Critico, causando 2 volte\n[[YELLOW]]il danno ai mob, o 1.5 volte il danno agli altri giocatori.
|
||||
Guides.Axes.Section.3=[[DARK_AQUA]]Come funziona Mestria con l'Ascia?\n[[YELLOW]]Maestria con l'Ascia \u00E8 una capacit\u00E0 passiva\n[[YELLOW]]che aggiunge danno ai tuoi colpi quando usi delle Asce.\n[[YELLOW]]Di default il bonus danno aumenta di 1 ogni 50 livelli,\n[[YELLOW]]fino a 4 danni extra al livello 200.
|
||||
Guides.Axes.Section.4=[[DARK_AQUA]]Come funziona Sfonda Armature?\n[[YELLOW]]Un attacco con abbastanza forza da frantumare un armatura!\n[[YELLOW]]Sfonda Armature ha una possibilit\u00E0 passiva di danneggiare\n[[YELLOW]]l'armatura dell'avversario. Il livello in Asce aumenta il danno.
|
||||
Guides.Axes.Section.5=[[DARK_AQUA]]Come funziona Impatto Maggiore?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di ottenere un maggiore impatto\n[[YELLOW]]colpendo i mob o i giocatori con un'ascia.\n[[YELLOW]]Di default la possibilit\u00E0 \u00E8 del 25%. Questa capacit\u00E0\n[[YELLOW]]ha un estremo effetto contraccolpo, simile all'incantesimo\n[[YELLOW]]Contraccolpo. Inoltre, infligge danno bonus al bersaglio.
|
||||
##Excavation
|
||||
Guides.Excavation.Section.0=[[DARK_AQUA]]Riguardo l'Escavazione:\n[[YELLOW]]L'Escavazione \u00E8 l'atto di scavare per trovare tesori.\n[[YELLOW]]Scavando la terra si trovano tesori.\n[[YELLOW]]Quanto pi\u00F9 si esegue questa operazione\n[[YELLOW]]pi\u00F9 tesori si possono trovare.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP devi scavare con una pala in mano.\n[[YELLOW]]Solo alcuni materiali possono essere scavati per tesori e XP.
|
||||
Guides.Excavation.Section.1=[[DARK_AQUA]]Materiali Compatibili:\n[[YELLOW]]Erba, Terra, Sabbia, Argilla, Ghiaia, Micelio,\n[[YELLOW]]Sabbia delle Anime, Neve
|
||||
Guides.Excavation.Section.2=[[DARK_AQUA]]Come usare Giga-Trivella Demolitrice:\n[[YELLOW]]Con una pala in mano tasto destro del mouse per preparare\n[[YELLOW]]lo strumento. Una volta in questo stato si dispone di circa\n[[YELLOW]]4 secondi per fare contatto con i materiali compatibili,\n[[YELLOW]]questo attiver\u00E0 Giga-Trivella Demolitrice.
|
||||
Guides.Excavation.Section.3=[[DARK_AQUA]]Cos'\u00E8 Giga-Trivella Demolitrice?\n[[YELLOW]]Giga-Trivella Demolitrice \u00E8 una capacit\u00E0 con raffreddamento\n[[YELLOW]]legata all'abilit\u00E0 Escavazione. Triplica la possibilit\u00E0\n[[YELLOW]]di trovare tesori e abilita la rottura istantanea\n[[YELLOW]]sui materiali di Escavazione.
|
||||
Guides.Excavation.Section.4=[[DARK_AQUA]]Come funziona Cacciatore di Tesori?\n[[YELLOW]]Ogni possibile tesoro per Escavazione ha il suo livello\n[[YELLOW]]di abilit\u00E0 richiesto per essere droppato, di conseguenza \u00E8\n[[YELLOW]]difficile dire quanto ti sta aiutando.\n[[YELLOW]]Basta tenere a mente che pi\u00F9 alta \u00E8 l'abilit\u00E0 di Escavazione,\n[[YELLOW]]pi\u00F9 tesori si possono trovare.\n[[YELLOW]]E anche tenere a mente che ogni tipo di materiale\n[[YELLOW]]di Escavazione compatibile ha la sua lista di tesori unici.\n[[YELLOW]]In altre parole si trovano diversi tesori nella Terra\n[[YELLOW]]da quelli che si troverebbero nella Ghiaia.
|
||||
Guides.Excavation.Section.5=[[DARK_AQUA]]Note sull'Escavazione:\n[[YELLOW]]I drop dell'Escavazione sono completamente personalizzabili\n[[YELLOW]]Quindi, i risultati variano da server a server.
|
||||
##Fishing
|
||||
Guides.Fishing.Section.0=[[DARK_AQUA]]Riguardo la Pesca:\n[[YELLOW]]Con l'abilit\u00E0 Pesca, pescare \u00E8 di nuovo emozionante!\n[[YELLOW]]Trovare tesori nascosti, e scrollare oggetti dai mob.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Catturare pesci.
|
||||
Guides.Fishing.Section.1=[[DARK_AQUA]]Come funziona Cacciatore di Tesori?\n[[YELLOW]]Questa capacit\u00E0 consente di trovare tesori pescando\n[[YELLOW]]con una piccola possibilit\u00E0 di oggetti incantati.\n[[YELLOW]]Ogni possibile tesoro di pesca ha una possibilit\u00E0\n[[YELLOW]]di uscire a ogni livello. Dipende per\u00F2 dalla\n[[YELLOW]]rarit\u00E0 dell'oggetto ogni quanto esce.\n[[YELLOW]]Pi\u00F9 \u00E8 alta la tua abilit\u00E0 di Pesca, maggiori\n[[YELLOW]]sono le possibilit\u00E0 di trovare tesori migliori.
|
||||
Guides.Fishing.Section.2=[[DARK_AQUA]]Come funziona Pesca sul Ghiaccio?\n[[YELLOW]]Questa capacit\u00E0 passiva permette di pescare nei laghi\n[[YELLOW]]ghiacciati! Lancia la tua canna da pesca e la capacit\u00E0\n[[YELLOW]]creer\u00E0 un piccolo buco nel ghiaccio dove pescare.
|
||||
Guides.Fishing.Section.3=[[DARK_AQUA]]Come funziona Pescatore Provetto?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la possibilit\u00E0 di far abboccare\n[[YELLOW]]mentre si pesca. Quando hai sbloccato questa capacit\u00E0,\n[[YELLOW]]pescare in barca o in un bioma oceano raddoppia\n[[YELLOW]]la possibilit\u00E0 di far abboccare.
|
||||
Guides.Fishing.Section.4=[[DARK_AQUA]]Come funziona Scuotere?\n[[YELLOW]]Questa capacit\u00E0 attiva consente di scrollare oggetti sciolti\n[[YELLOW]]dai mob agganciandoli con una canna da pesca.\n[[YELLOW]]I mob dropperanno gli oggetti che normalmente droppano\n[[YELLOW]]alla morte. \u00C8 anche possibile acquisire le teste dei mob,\n[[YELLOW]]che sono normalmente inottenibili in modalit\u00E0 sopravvivenza.
|
||||
Guides.Fishing.Section.5=[[DARK_AQUA]]Come funziona Dieta del Pescatore?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la fame ripristinata \n[[YELLOW]]mangiando pesce.
|
||||
Guides.Fishing.Section.6=[[DARK_AQUA]]Note sulla Pesca:\n[[YELLOW]]I drop di pesca sono completamente personalizzabili,\n[[YELLOW]]quindi variano da server a server.
|
||||
##Herbalism
|
||||
Guides.Herbalism.Section.0=[[DARK_AQUA]]Riguardo l'Erboristeria:\n[[YELLOW]]L'Erboristeria riguarda il raccogliere le erbe e le piante.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Raccogliendo piante ed erbe.
|
||||
Guides.Herbalism.Section.1=[[DARK_AQUA]]Blocchi Compatibili\n[[YELLOW]]Grano, Patate, Carote, Meloni, \n[[YELLOW]]Zucchine, Canne da Zucchero, Fave di Cacao, Fiori, Cactus,\n[[YELLOW]]Funghi, Verruche del Nether, Ninfee, e Rampicanti.
|
||||
Guides.Herbalism.Section.2=[[DARK_AQUA]]Come funziona Terra Verde?\n[[YELLOW]]Terra Verde \u00E8 una capacit\u00E0 attiva, puoi fare tasto destro\n[[YELLOW]]mentre tieni in mano una zappa per attivare Terra Verde.\n[[YELLOW]]Terra Verde concede una possibilit\u00E0 di ottenere drop 3x\n[[YELLOW]]dalle piante raccolte. D\u00E0 anche ai giocatori la capacit\u00E0\n[[YELLOW]]di diffondere la vita nei blocchi e trasformarli utilizzando\n[[YELLOW]]semi dal tuo inventario.
|
||||
Guides.Herbalism.Section.3=[[DARK_AQUA]]Come funziona Pollice Verde (Colture)?\n[[YELLOW]]Questa abilit\u00E0 passiva ripianta le colture quando\n[[YELLOW]]vengono raccolte.\n[[YELLOW]]Questa possibilit\u00E0 dipende dal tuo livello in Erboristeria.
|
||||
Guides.Herbalism.Section.4=[[DARK_AQUA]]Come funziona Pollice Verde (Pietre/Mattoni di Pietra/Terra)?\n[[YELLOW]]Questa capacit\u00E0 attiva consente di trasformare i blocchi nelle\n[[YELLOW]]controparti "piante correlate". Puoi farlo con click destro\n[[YELLOW]]su un blocco, con in mano dei semi. Consumer\u00E0 1 seme.
|
||||
Guides.Herbalism.Section.5=[[DARK_AQUA]]Come funziona Dieta del Contadino?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la fame ripristinata \n[[YELLOW]]mangiando Pane, Biscotti, Meloni, Zuppe di Funghi, Carote,\n[[YELLOW]]e Patate.
|
||||
Guides.Herbalism.Section.6=[[DARK_AQUA]]Come funziona Fortuna Hylian?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 una possibilit\u00E0 di trovare\n[[YELLOW]]oggetti rari quando certi blocchi sono rotti con una spada.
|
||||
Guides.Herbalism.Section.7=[[DARK_AQUA]]Come funziona il Doppio Drop?\n[[YELLOW]]Questa abilit\u00E0 passiva d\u00E0 ai giocatori pi\u00F9 resa\n[[YELLOW]]dai loro raccolti.
|
||||
##Mining
|
||||
Guides.Mining.Section.0=[[DARK_AQUA]]Riguardo l'Estrazione:\n[[YELLOW]]L'Estrazione consiste nell'estrarre pietra e minerali.\n[[YELLOW]]Fornisce bonus alla quantit\u00E0 di materiali droppati minando.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0, devi minare con un piccone.\n[[YELLOW]]Solo alcuni blocchi assegnano XP.
|
||||
Guides.Mining.Section.1=[[DARK_AQUA]]Materiali compatibili:\n[[YELLOW]]Pietra, Carbone Grezzo, Ferro Grezzo, Oro Grezzo, Diamante Grezzo, Pietrarossa Grezza,\n[[YELLOW]]Lapislazzuli Grezzo, Ossidiana, Pietra Muschiosa, Pietra dell'End,\n[[YELLOW]]Luminite e Netherrack.
|
||||
Guides.Mining.Section.2=[[DARK_AQUA]]Come usare il Super Demolitore:\n[[YELLOW]]Con un piccone in mano, tasto destro del mouse\n[[YELLOW]]per preparare lo strumento.\n[[YELLOW]]Una volta in questo stato si dispone di 4 secondi\n[[YELLOW]]per entrare in contatto con i materiali compatibili,\n[[YELLOW]]che attiveranno il Super Demolitore.
|
||||
Guides.Mining.Section.3=[[DARK_AQUA]]Cos'\u00E8 il Super Demolitore?\n[[YELLOW]]Il Super Demolitore \u00E8 una capacit\u00E0 a tempo legata all'abilit\u00E0\n[[YELLOW]]Estrazione. Triplica la possibilit\u00E0 di drop di oggetti extra e\n[[YELLOW]]abilita la rottura istantanea dei materiali estratti.
|
||||
Guides.Mining.Section.4=[[DARK_AQUA]]Come usare l'Estrazione Esplosiva:\n[[YELLOW]]Con un detonatore in mano, un acciarino di default,\n[[YELLOW]]accovacciati e fai click destro su TNT a distanza. Questo causer\u00E0\n[[YELLOW]]l'esplosione istantanea della TNT.
|
||||
Guides.Mining.Section.5=[[DARK_AQUA]]Come funziona Estrazione Esplosiva?\n[[YELLOW]]Estrazione Esplosiva \u00E8 una capacit\u00E0 legata all'abilit\u00E0\n[[YELLOW]]Estrazione. Da bonus minando con la TNT e consente di\n[[YELLOW]]detonare da lontano la TNT. Ci sono tre parti di Estrazione\n[[YELLOW]]Esplosiva. La prima parte \u00E8 Bombe Pi\u00F9 Grandi, che aumenta il\n[[YELLOW]]raggio d'esplosione. La seconda parte \u00E8 Esperto di Demolizioni,\n[[YELLOW]]che riduce il danno dalle esplosioni di TNT. La terza parte\n[[YELLOW]]aumenta semplicemente la quantit\u00E0 di minerali droppati dalla \n[[YELLOW]]TNT e riduce i detriti droppati.
|
||||
##Repair
|
||||
Guides.Repair.Section.0=[[DARK_AQUA]]Riguardo la Riparazione:\n[[YELLOW]]La Riparazione consente di utilizzare un blocco di ferro\n[[YELLOW]]per riparare armature e strumenti.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Riparando strumenti e armature con l'incudine mcMMO.\n[[YELLOW]]Questa \u00E8 di default un blocco di ferro e non deve essere\n[[YELLOW]]confusa con l'incudine di Minecraft Vanilla.
|
||||
Guides.Repair.Section.1=[[DARK_AQUA]]Come posso usare Riparazione?\n[[YELLOW]]Piazza un'incudine mcMMO e fai click destro per riparare \n[[YELLOW]]l'oggetto in mano. Questo consuma 1 oggetto per ogni uso.
|
||||
Guides.Repair.Section.2=[[DARK_AQUA]]Come funziona Maestria nella Riparazione?\n[[YELLOW]]Maestria nella Riparazione aumenta la quantit\u00E0 di riparazione.\n[[YELLOW]]La riparazione extra dipende dal tuo livello di Riparazione.
|
||||
Guides.Repair.Section.3=[[DARK_AQUA]]Come funziona Super Riparazione?\n[[YELLOW]]Super Riparazione \u00E8 una capacit\u00E0 passiva. Riparando un oggetto,\n[[YELLOW]]concede ai giocatori una possibilit\u00E0 di riparare un oggetto con\n[[YELLOW]]doppia efficacia.
|
||||
Guides.Repair.Section.4=[[DARK_AQUA]]Come funziona Forgiatura Arcana?\n[[YELLOW]]Questa capacit\u00E0 passiva consente di riparare oggetti con\n[[YELLOW]]una certa possibilit\u00E0 di mantenere i suoi incantesimi. Gli\n[[YELLOW]]incantesimi possono essere mantenuti ai loro livelli,\n[[YELLOW]]degradati a livelli pi\u00F9 bassi, o persi del tutto.
|
||||
##Salvage
|
||||
Guides.Salvage.Section.0=[[DARK_AQUA]]Riguardo la Rottamazione:\n[[YELLOW]]La Rottamazione consente di usare un blocco d'oro\n[[YELLOW]]per rottamare armature e strumenti.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Rottamazione \u00E8 un'abilit\u00E0 figlia di Riparazione\n[[YELLOW]]e Pesca, il livello di abilit\u00E0 \u00E8 basato sui livelli\n[[YELLOW]]di Pesca e Riparazione.
|
||||
Guides.Salvage.Section.1=[[DARK_AQUA]]Come posso usare la Rottamazione?\n[[YELLOW]]Piazza un'incudine di Rottamazione mcMMO e facci click\n[[YELLOW]]destro per rottamare l'oggetto che hai in mano. Esso si\n[[YELLOW]]romper\u00E0 e restituir\u00E0 i materiali usati per costruirlo.\n\n[[YELLOW]]Per esempio, rottamando un piccone di ferro dar\u00E0 lingotti\n[[YELLOW]]di ferro.
|
||||
Guides.Salvage.Section.2=[[DARK_AQUA]]Come funziona la Rottamazione Avanzata?\n[[YELLOW]]Quando sbloccata, questa capacit\u00E0 consente di rottamare\n[[YELLOW]]oggetti danneggiati. La percentuale di resa aumenta con\n[[YELLOW]]il salire di livello. Una resa maggiore significa che si possono\n[[YELLOW]]ottenere pi\u00F9 materiali indietro. Con la Rottamazione\n[[YELLOW]]Avanzata si otterr\u00E0 sempre 1 materiale indietro, a meno che\n[[YELLOW]]non sia troppo danneggiato. Quindi non ci si deve preoccupare\n[[YELLOW]]di distruggere oggetti senza ottenere nulla in cambio.
|
||||
Guides.Salvage.Section.3=[[DARK_AQUA]]Per illustrare come funziona, ecco un esempio:\n[[YELLOW]]Diciamo che rottamiamo un piccone d'oro danneggiato per il 20%,\n[[YELLOW]]ci\u00F2 significa che l'importo massimo che potrebbe ottenere solo 2\n[[YELLOW]](Perch\u00E9 il piccone \u00E8 fatto con 3 lingotti - ciascuno del valore di\n[[YELLOW]]33,33% durabilit\u00E0) che \u00E8 uguale a 66%. Se la percentuale di\n[[YELLOW]]resa \u00E8 sotto il 66% non si \u00E8 in grado di ottenere 2 lingotti.\n[[YELLOW]]Se \u00E8 al di sopra di questo valore si \u00E8 in grado di ottenere lo\n[[YELLOW]]"intero importo", il che significa che si otterranno 2 lingotti.
|
||||
Guides.Salvage.Section.4=[[DARK_AQUA]]Come funziona la Rottamazione Arcana?\n[[YELLOW]]Questa capacit\u00E0 consente di ottenere libri incantati\n[[YELLOW]]durante la rottamazione di oggetti incantati. A seconda del\n[[YELLOW]]livello la possibilit\u00E0 di estrarre con successo\n[[YELLOW]]un incantesimo totale o parziale varia.\n\n[[YELLOW]]Quando un incantesimo \u00E8 parzialmente estratto, il libro\n[[YELLOW]]incantato avr\u00E0 un livello inferiore.
|
||||
##Smelting
|
||||
Guides.Smelting.Section.0=Prossimamente...
|
||||
##Swords
|
||||
Guides.Swords.Section.0=[[DARK_AQUA]]Riguardo Spade:\n[[YELLOW]]Questa abilit\u00E0 d\u00E0 bonus di combattimento a chi\n[[YELLOW]]combatte con una spada.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Il guadagno degli XP \u00E8 basato sul danno inflitto\n[[YELLOW]]ai mob o ad altri giocatori con una spada.
|
||||
Guides.Swords.Section.1=[[DARK_AQUA]]Come funziona Colpi Seghettati?\n[[YELLOW]]Colpi Seghettati \u00E8 una capacit\u00E0 attiva, puoi attivarla facendo\n[[YELLOW]]click destro con una spada. Questa capacit\u00E0 permette di fare\n[[YELLOW]]un colpo EaA (Effetto ad Area). Questo EaA far\u00E0 il 25% in pi\u00F9\n[[YELLOW]]di danni e infligger\u00E0 un effetto di sanguinamento che dura 5 tick.
|
||||
Guides.Swords.Section.2=[[DARK_AQUA]]Come funziona Contrattacco?\n[[YELLOW]]Contrattacco \u00E8 una capacit\u00E0 attiva. Quando si ricevono\n[[YELLOW]]colpi dai mob, hai una possibilit\u00E0 di riflettere il 50% \n[[YELLOW]]del danno preso.
|
||||
Guides.Swords.Section.3=[[DARK_AQUA]]Come funziona Emorragia?\n[[YELLOW]]Emorragia causa ai nemici danno ogni due secondi. Il \n[[YELLOW]]bersaglio sanguina fino allo svanire dell'effetto,\n[[YELLOW]]o alla morte, quello che viene prima.\n[[YELLOW]]La durata dell'Emorragia \u00E8 aumentata dall'abilit\u00E0 Spade.
|
||||
##Taming
|
||||
Guides.Taming.Section.0=[[DARK_AQUA]]Riguardo l'Addomesticamento:\n[[YELLOW]]L'Addomesticamento dar\u00E0 ai giocatori vari bonus di combattimento\n[[YELLOW]]quando si usano lupi addomesticati.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0, devi addomesticare\n[[YELLOW]]lupi/ocelot o entrare in combattimento con i tuoi lupi.
|
||||
Guides.Taming.Section.1=[[DARK_AQUA]]Come funziona Richiamo della Natura?\n[[YELLOW]]Richiamo della Natura \u00E8 una capacit\u00E0 attiva che consente\n[[YELLOW]]di evocare un lupo o un ocelot al proprio fianco. Puoi\n[[YELLOW]]farlo facendo click sinistro con in mano ossa o pesce.
|
||||
Guides.Taming.Section.2=[[DARK_AQUA]]Come funziona Conoscenza delle Bestie?\n[[YELLOW]]Conoscenza delle Bestie consente ai giocatori di ispezionare\n[[YELLOW]]gli animali da compagnia e controllare lo stato di lupi\n[[YELLOW]]e ocelot. Click-sinistro su un lupo o un ocelot\n[[YELLOW]]per usare Conoscenza delle Bestie.
|
||||
Guides.Taming.Section.3=[[DARK_AQUA]]Come funziona Sbranare?\n[[YELLOW]]Sbranare \u00E8 una capacit\u00E0 passiva che ha una possibilit\u00E0\n[[YELLOW]]di infliggere un effetto sanguinamento ai bersagli dei lupi.
|
||||
Guides.Taming.Section.4=[[DARK_AQUA]]Come funziona Artigli Affilati?\n[[YELLOW]]Artigli Affilati offre un bonus di danni al danno inflitto\n[[YELLOW]]dai lupi. Il bonus danni dipende dal livello di Addomesticamento.
|
||||
Guides.Taming.Section.5=[[DARK_AQUA]]Come funziona Sicurezza Ambientale?\n[[YELLOW]]Questa capacit\u00E0 passiva consente ai lupi di teletrasportarsi\n[[YELLOW]]da te quando si trovano vicino ai pericoli come Cactus/Lava.\n[[YELLOW]]D\u00E0 anche ai lupi l'immunit\u00E0 alle cadute.
|
||||
Guides.Taming.Section.6=[[DARK_AQUA]]Come funziona Pelliccia Folta?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno\n[[YELLOW]]e rende i lupi resistenti al fuoco.
|
||||
Guides.Taming.Section.7=[[DARK_AQUA]]Come funziona A Prova d'Urto?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno fatto ai lupi\n[[YELLOW]]dalle esplosioni.
|
||||
Guides.Taming.Section.8=[[DARK_AQUA]]Come funziona il Servizio Fast Food?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 ai lupi la possibilit\u00E0 di guarire\n[[YELLOW]]ogni volta che fanno un attacco.
|
||||
##Unarmed
|
||||
Guides.Unarmed.Section.0=[[DARK_AQUA]]Riguardo la Lotta:\n[[YELLOW]]La Lotta dar\u00E0 ai giocatori vari bonus di combattimento\n[[YELLOW]]quando si usano i pugni come arma.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si ottengono in base alla quantit\u00E0 di danno\n[[YELLOW]]inflitto ai mob o agli altri giocatori senza armi.
|
||||
Guides.Unarmed.Section.1=[[DARK_AQUA]]Come funziona Furore?\n[[YELLOW]]Furore \u00E8 una capacit\u00E0 attiva che si attiva con il click\n[[YELLOW]]destro. In modalit\u00E0 Furore, Fai il 50% di danni\n[[YELLOW]]in pi\u00F9 e puoi rompere istantaneamente i materiali\n[[YELLOW]]deboli, come Terra ed Erba.
|
||||
Guides.Unarmed.Section.2=[[DARK_AQUA]]Come funziona Braccio di Ferro?\n[[YELLOW]]Braccio di Ferro aumenta il danno quando si colpiscono\n[[YELLOW]]mob o giocatori con i pugni.
|
||||
Guides.Unarmed.Section.3=[[DARK_AQUA]]Come funziona Deviazione Frecce?\n[[YELLOW]]Deviare Frecce \u00E8 una capacit\u00E0 passiva che d\u00E0 la\n[[YELLOW]]possibilit\u00E0 di deviare frecce tirate da Scheletri o altri\n[[YELLOW]]giocatori. La freccia cadr\u00E0 a terra innocuamente.
|
||||
Guides.Unarmed.Section.4=[[DARK_AQUA]]Come funziona Presa di Ferro?\n[[YELLOW]]Presa di Ferro \u00E8 una capacit\u00E0 passiva che disarma.\n[[YELLOW]]Come sale il livello di lotta, aumenta la possibilit\u00E0\n[[YELLOW]]di prevenire un disarmo.
|
||||
Guides.Unarmed.Section.5=[[DARK_AQUA]]Come funziona Disarmo?\n[[YELLOW]]Questa capacit\u00E0 passiva permette ai giocatori di\n[[YELLOW]]disarmare gli altri giocatori, facendo cadere\n[[YELLOW]]a terra l'oggetto in mano del bersaglio.
|
||||
##Woodcutting
|
||||
Guides.Woodcutting.Section.0=[[DARK_AQUA]]Riguardo Taglialegna:\n[[YELLOW]]Taglialegna sta tutto nell'abbattere alberi.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si guadagnano ogni volta che si rompono ceppi di legno.
|
||||
Guides.Woodcutting.Section.1=[[DARK_AQUA]]Come funziona Abbattitore d'Alberi?\n[[YELLOW]]Abbattitore d'Alberi \u00E8 una capacit\u00E0 attiva, puoi fare\n[[YELLOW]]click destro con in mano un'Ascia. Questo causer\u00E0\n[[YELLOW]]la rottura istantanea dell'albero, droppando tutto\n[[YELLOW]]il suo legno contemporaneamente.
|
||||
Guides.Woodcutting.Section.2=[[DARK_AQUA]]Come funziona Soffia Foglie?\n[[YELLOW]]Soffia Foglie \u00E8 una capacit\u00E0 passiva che causer\u00E0 la\n[[YELLOW]]rottura istantanea dei blocchi di foglie colpiti con un ascia.\n[[YELLOW]]Di default, questa capacit\u00E0 si sblocca al livello 100.
|
||||
Guides.Woodcutting.Section.3=[[DARK_AQUA]]Come funziona Doppi Drop?\n[[YELLOW]]Questa \u00E8 una capacit\u00E0 passiva che permette di ottenere\n[[YELLOW]]un blocco extra per ogni ceppo di legno che si taglia.
|
||||
#INSPECT
|
||||
Inspect.Offline=Non hai il permesso di esaminare giocatori disconnessi!
|
||||
Inspect.OfflineStats=Statistiche mcMMO del Giocatore Disconnesso [[YELLOW]]{0}
|
||||
Inspect.Stats=[[GREEN]]Statistiche mcMMO di [[YELLOW]]{0}
|
||||
Inspect.TooFar=Sei troppo lontano da quel giocatore per esaminarlo!
|
||||
#ITEMS
|
||||
Item.ChimaeraWing.Fail=**ALA CHIMERICA FALLITA!**
|
||||
Item.ChimaeraWing.Pass=**ALA CHIMERICA**
|
||||
Item.ChimaeraWing.Name=Ala Chimerica
|
||||
Item.ChimaeraWing.Lore=[[GRAY]]Ti teletrasporta al tuo letto.
|
||||
Item.Generic.Wait=Devi aspettare prima di poterlo usare di nuovo! [[YELLOW]]({0}s)
|
||||
Item.Injured.Wait=Sei stato ferito di recente e devi aspettare per usarlo. [[YELLOW]]({0}s)
|
||||
Item.FluxPickaxe.Name=Piccone Cuocente
|
||||
Item.FluxPickaxe.Lore.1=[[GRAY]]Ha la possibilit\u00E0 di fusione immediata dei minerali.
|
||||
Item.FluxPickaxe.Lore.2=[[GRAY]]Richiede livello di Fusione {0}+
|
||||
#TELEPORTATION
|
||||
Teleport.Commencing=[[GRAY]]Il teletrasporto avr\u00E0 inizio fra [[GOLD]]({0}) [[GRAY]]secondi, resta fermo per favore...
|
||||
Teleport.Cancelled=[[DARK_RED]]Teletrasporto annullato!
|
||||
#SKILLS
|
||||
Skills.Child=[[GOLD]](ABILIT\u00C0 FIGLIA)
|
||||
Skills.Disarmed=[[DARK_RED]]Sei stato disarmato!
|
||||
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
|
||||
Skills.NeedMore=[[DARK_RED]]Hai bisogno di pi\u00F9 [[GRAY]]{0}
|
||||
Skills.Parents=ABILIT\u00C0 MADRI
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.ChildStats={0}[[GREEN]]{1}
|
||||
Skills.TooTired=Sei troppo stanco per usare ancora questa capacit\u00E0. [[YELLOW]]({0}s)
|
||||
Skills.Cancelled={0} annullata!
|
||||
Skills.ConfirmOrCancel=[[GREEN]]Clicca ancora col destro per confermare [[GOLD]]{0}[[GREEN]]. Clicca col sinistro per annullare.
|
||||
#STATISTICS
|
||||
Stats.Header.Combat=[[GOLD]]-=ABILIT\u00C0 DI COMBATTIMENTO=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=ABILIT\u00C0 DI RACCOLTA=-
|
||||
Stats.Header.Misc=[[GOLD]]-=ABILIT\u00C0 VARIE=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] Statistiche
|
||||
#PERKS
|
||||
Perks.XP.Name=Esperienza
|
||||
Perks.XP.Desc=Ricevi XP incrementati in determinate abilit\u00E0.
|
||||
Perks.Lucky.Name=Fortuna
|
||||
Perks.Lucky.Desc=Aumenta del 33.3% le probabilit\u00E0 di attivarsi delle abilit\u00E0 e capacit\u00E0 di {0}.
|
||||
Perks.Lucky.Desc.Login=Aumenta del 33.3% le probabilit\u00E0 di attivarsi di certe abilit\u00E0 e capacit\u00E0.
|
||||
Perks.Lucky.Bonus=[[GOLD]] ({0} con il Vantaggio Fortuna)
|
||||
Perks.Cooldowns.Name=Recupero Rapido
|
||||
Perks.Cooldowns.Desc=Riduce la durata della ricarica di {0}.
|
||||
Perks.ActivationTime.Name=Resistenza
|
||||
Perks.ActivationTime.Desc=Incrementa il tempo di attivazione della capacit\u00E0 di {0} secondi.
|
||||
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s con il Vantaggio Resistenza)
|
||||
#HARDCORE
|
||||
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Modalit\u00E0 Hardcore {0} disattivata per {1}.
|
||||
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Modalit\u00E0 Hardcore {0} attivata per {1}.
|
||||
Hardcore.DeathStatLoss.Name=Penalit\u00E0 alle Abilit\u00E0 per Morte
|
||||
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Hai perso [[BLUE]]{0}[[DARK_RED]] livelli dalla morte.
|
||||
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] La percentuale di perdita delle statistiche \u00E8 stata portata a {0}.
|
||||
Hardcore.Vampirism.Name=Vampirismo
|
||||
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] era troppo inesperto per concedere alcuna conoscenza.
|
||||
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Hai rubato [[BLUE]]{0}[[DARK_AQUA]] livelli da [[YELLOW]]{1}.
|
||||
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] non \u00E8 riuscito a rubarti ci\u00F2 che conosci!
|
||||
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] ti ha rubato [[BLUE]]{1}[[DARK_RED]] livelli!
|
||||
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] La percentuale di perdita \u00E8 cambiata a {0}.
|
||||
#MOTD
|
||||
MOTD.Donate=[[DARK_AQUA]]Info Donazioni:
|
||||
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Modalit\u00E0 hardcore abilitata: [[DARK_RED]]{0}
|
||||
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Penalit\u00E0 alle Abilit\u00E0 causa Morte: [[DARK_RED]]{0}%
|
||||
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Salasso di Statistiche da Vampirismo: [[DARK_RED]]{0}%
|
||||
MOTD.PerksPrefix=[Vantaggi mcMMO]
|
||||
MOTD.Version=[[GOLD]][mcMMO] versione [[DARK_AQUA]]{0}
|
||||
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Sito di mcMMO
|
||||
#SMELTING
|
||||
Smelting.Ability.FluxMining=Possibilit\u00E0 di Estrazione Cuocente: [[YELLOW]]{0}
|
||||
Smelting.Ability.FuelEfficiency=Moltiplicatore di Efficienza Combustibile: [[YELLOW]]{0}x
|
||||
Smelting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (INCREMENTO XP VANILLA)
|
||||
Smelting.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ESTRAZIONE CUOCENTE)
|
||||
Smelting.Ability.SecondSmelt=Possibilit\u00E0 di Seconda Fusione: [[YELLOW]]{0}
|
||||
Smelting.Ability.VanillaXPBoost=Moltiplicatore XP Vanilla: [[YELLOW]]{0}x
|
||||
Smelting.SubSkill.FuelEfficiency.Name=Efficienza Combustibile
|
||||
Smelting.SubSkill.FuelEfficiency.Description=Aumenta il tempo di combustione del carburante usato nelle fornaci
|
||||
Smelting.SubSkill.SecondSmelt.Name=Seconda Fusione
|
||||
Smelting.SubSkill.SecondSmelt.Description=Raddoppia le risorse guadagnate con la fusione
|
||||
Smelting.Effect.4=Incremento XP Vanilla
|
||||
Smelting.Effect.5=Aumenta i normali XP ottenuti fondendo
|
||||
Smelting.SubSkill.FluxMining.Name=Estrazione Cuocente
|
||||
Smelting.SubSkill.FluxMining.Description=Probabilit\u00E0 che i minerali siano fusi istantaneamente mentre li si estrae
|
||||
Smelting.Listener=Fusione:
|
||||
Smelting.SkillName=FUSIONE
|
||||
#COMMAND DESCRIPTIONS
|
||||
Commands.Description.addlevels=Aggiungi XP di mcMMO a un utente
|
||||
Commands.Description.adminchat=Attiva o disattiva la chat amministratori di mcMMO o invia messaggi in chat amministratori
|
||||
Commands.Description.addxp=Aggiunge XP mcMMO a un utente
|
||||
Commands.Description.hardcore=Modifica la percentuale hardcore di mcMMO o attiva/disattiva la modalit\u00E0 hardcore
|
||||
Commands.Description.inspect=Visualizza dettagliate informazioni mcMMO su un altro giocatore
|
||||
Commands.Description.mcability=Attiva o disattiva il fatto che le capacit\u00E0 mcMMO vengano preparate con un clic destro.
|
||||
Commands.Description.mccooldown=Vedi tutto sulle ricariche delle abilit\u00E0 mcMMO
|
||||
Commands.Description.mcgod=Attiva o Disattiva la modalit\u00E0 dio mcMMO
|
||||
Commands.Description.mchud=Cambia il tuo stile di HUD di mcMMO
|
||||
Commands.Description.mcmmo=Mostra una breve descrizione di mcMMO
|
||||
Commands.Description.mcnotify=Attiva o disattiva la visualizzazione delle notifiche delle capacit\u00E0 di mcMMO in chat
|
||||
Commands.Description.mcpurge=Elimina dal database mcMMO gli utenti senza livelli mcMMO e quelli che non si sono connessi negli ultimi {0} mesi.
|
||||
Commands.Description.mcrank=Mostra la graduatoria mcMMO di un giocatore
|
||||
Commands.Description.mcrefresh=Rigenera tutte le ricariche di mcMMO
|
||||
Commands.Description.mcremove=Rimuovi un utente dal database mcMMO
|
||||
Commands.Description.mcscoreboard=Gestisci la tua Scoreboard mcMMO
|
||||
Commands.Description.mcstats=Mostra i tuoi livelli e XP mcMMO
|
||||
Commands.Description.mctop=Mostra le classifiche mcMMO
|
||||
Commands.Description.mmoedit=Modifica i livelli mcMMO di un utente
|
||||
Commands.Description.mmoupdate=Migra un database mcMMO da un database vecchio a quello attuale
|
||||
Commands.Description.mcconvert=Converte tipi di database oppure tipi di formule esperienza
|
||||
Commands.Description.mmoshowdb=Mostra il nome dell'attuale tipo di database (per uso successivo con /mmoupdate)
|
||||
Commands.Description.party=Controlla varie impostazioni del gruppo mcMMO
|
||||
Commands.Description.partychat=Attiva o disattiva la chat del gruppo mcMMO o invia un messaggio in chat gruppo
|
||||
Commands.Description.ptp=Teletrasportati da un membro del gruppo mcMMO
|
||||
Commands.Description.Skill=Visualizza informazioni dettagliate sull'abilit\u00E0 mcMMO {0}
|
||||
Commands.Description.skillreset=Azzera i livelli mcMMO di un utente
|
||||
Commands.Description.vampirism=Modify the mcMMO vampirism percentage or toggle vampirism mode on/off
|
||||
Commands.Description.xplock=Blocca la tua barra XP di mcMMO su una specifica abilit\u00E0 di mcMMO
|
||||
Commands.Description.xprate=Modifica il tasso XP di mcMMO o d\u00E0 inizio a un evento XP mcMMO.
|
||||
#UPDATE CHECKER
|
||||
UpdateChecker.Outdated=Stai usando una versione non aggiornata di mcMMO!
|
||||
UpdateChecker.NewAvailable=\u00C8 disponibile una nuova versione su BukkitDev.
|
||||
#SCOREBOARD HEADERS
|
||||
Scoreboard.Header.PlayerStats=Statistiche mcMMO
|
||||
Scoreboard.Header.PlayerCooldowns=Ricariche mcMMO
|
||||
Scoreboard.Header.PlayerRank=Graduatorie McMMO
|
||||
Scoreboard.Header.PlayerInspect=Statistiche mcMMO: {0}
|
||||
Scoreboard.Header.PowerLevel=Livello di Potere
|
||||
Scoreboard.Misc.PowerLevel=[[GOLD]]Livello di Potere
|
||||
Scoreboard.Misc.Level=[[DARK_AQUA]]Livello
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]XP attuali
|
||||
Scoreboard.Misc.RemainingXP=XP restanti
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Ricarica
|
||||
Scoreboard.Misc.Overall=[[GOLD]]Complessivo
|
||||
Scoreboard.Misc.Ability=Capacit\u00E0
|
||||
#DATABASE RECOVERY
|
||||
Profile.Loading.Success=[[GREEN]]Il tuo profilo mcMMO \u00E8 stato caricato.
|
||||
Profile.Loading.Failure=mcMMO non pu\u00F2 ancora caricare i tuoi dati. Si consiglia di [[AQUA]]contattare il proprietario del server.\n[[YELLOW]]Puoi ancora giocare sul server, ma non avrai [[BOLD]]livelli mcMMO[[YELLOW]] e gli XP che otterrai [[BOLD]]non verranno salvati[[YELLOW]].
|
||||
Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO non \u00E8 stato in grado di caricare i dati del giocatore [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Si prega di controllare la configurazione del database.
|
||||
Binary file not shown.
@@ -1,197 +0,0 @@
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Esquivou**
|
||||
Acrobatics.SubSkill.Roll.Name=Rolar
|
||||
Acrobatics.SubSkill.Dodge.Name=Esquivou
|
||||
Acrobatics.Listener=Acrobacias:
|
||||
Acrobatics.Roll.Text=**Rolou**
|
||||
Acrobatics.SkillName=Acrobacia
|
||||
Acrobatics.Skillup=Habilidade Acrobacia aumentada em {0}. Total ({1})
|
||||
Archery.SubSkill.SkillShot.Name=Tiro Habilidoso
|
||||
Archery.SubSkill.SkillShot.Description=Aumenta o dano feito com arcos
|
||||
Archery.SubSkill.ArrowRetrieval.Description=Chance de recuperar flechas dos corpos
|
||||
Archery.Listener=Arqueiro
|
||||
Archery.SkillName=ARQUEIRO
|
||||
Archery.Skillup=Habilidade Arqueiro aumentada em {0}. Total ({1})
|
||||
Axes.Ability.Bonus.0=Machado
|
||||
Axes.Ability.Lower=[[GRAY]]**VOCE ABAIXA SEU MACHADO**
|
||||
Axes.Ability.Ready=[[GREEN]]**VOCE PREPARA SEU MACHADO**
|
||||
Axes.Combat.GI.Struck=**GOLPEADO POR UM GRANDE IMPACTO**
|
||||
Axes.SubSkill.CriticalStrikes.Description=Dano Duplo
|
||||
Axes.SubSkill.AxeMastery.Description=Adiciona dano extra
|
||||
Axes.Listener=Machados:
|
||||
Axes.SkillName=Machado
|
||||
Axes.Skills.SS.On=[[GREEN]]**Racha Cranio ATIVADO**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]Sua [[YELLOW]] Racha Cranio [[GREEN]] habilidade esta pronta.
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Racha Cranios!
|
||||
Axes.Skillup=Habilidade em Machado aumentada em {0}. Total ({1})
|
||||
Excavation.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PA**
|
||||
Excavation.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PA**
|
||||
Excavation.SubSkill.TreasureHunter.Description=Habilidade de cavar tesouros
|
||||
Excavation.Listener=Escavacao:
|
||||
Excavation.SkillName=Escava\u00e7\u00e3o
|
||||
Excavation.Skillup=Habilidade de Escavacao aumentada em {0}. Total ({1})
|
||||
Fishing.Listener=Pescaria:
|
||||
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
|
||||
Fishing.SkillName=PESCARIA
|
||||
Fishing.Skillup=Habilidade em Pescaria aumentada em {0}. Total ({1})
|
||||
Herbalism.Ability.GTh=[[GREEN]]**DEDAO VERDE**
|
||||
Herbalism.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ENXADA**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ENXADA**
|
||||
Herbalism.Listener=Herbalismo
|
||||
Herbalism.SkillName=HERBALISMO
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]Sua [[YELLOW]]pronta sua habilidade de [[GREEN]]Terra Verde
|
||||
Herbalism.Skills.GTe.Other.Off=Terra Verde[[GREEN]] acabou para o [[YELLOW]]{0}
|
||||
Herbalism.Skillup=Habilidade em Herbalismo aumentada em {0}. Total ({1})
|
||||
Mining.Ability.Length=Super Partir Duracao: [[YELLOW]]{0}s
|
||||
Mining.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PICARETA**
|
||||
Mining.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PICARETA**
|
||||
Mining.Listener=Mineracao:
|
||||
Mining.SkillName=MINERAR
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A tua [[YELLOW]]habilidade Super Partir [[GREEN]]esta pronta!
|
||||
Mining.Skillup=Habilidade Minerar aumentada em {0}. Total ({1})
|
||||
Mining.Blast.Boom=[[GRAY]]**BOOM**
|
||||
Mining.Blast.Refresh=[[GREEN]]A tua [[YELLOW]]habilidade de explosao [[GREEN]]esta pronta!
|
||||
Repair.SubSkill.Repair.Name=Reparar
|
||||
Repair.SubSkill.SuperRepair.Name=Super Reparo
|
||||
Repair.SubSkill.DiamondRepair.Name=Reparar Diamante ({0}+ SKILL)
|
||||
Repair.SubSkill.DiamondRepair.Description=Reparar ferramentas e armadura de Diamante
|
||||
Repair.SubSkill.ArcaneForging.Description=Reparar itens magicos
|
||||
Repair.Listener=Reparar:
|
||||
Repair.SkillName=REPARAR
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Voce nao tem nivel suficiente pra reparar Diamante.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Voc\u00ea n\u00e3o tem nivel suficiente pra reparar Ouro.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Voce nao tem nivel suficiente pra reparar Pedra.
|
||||
Repair.Skills.FeltEasy=[[GRAY]]Isso pareceu facil.
|
||||
Repair.Skillup=Habilidade de Reparacao aumentada em {0}. Total ({1})
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]AF Percentagem de Sucesso: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Fail=Poder misterioso saiu permanentemente do item.
|
||||
Repair.Arcane.Lost=Voce nao foi habilidoso o suficiente para manter os encantamentos.
|
||||
Swords.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ESPADA**
|
||||
Swords.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ESPADA**
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]O sangramento[[GREEN]]parou[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**INIMIGO A SANGRAR**
|
||||
Swords.Combat.Countered=[[GREEN]]**CONTRA-ATACADO**
|
||||
Swords.SubSkill.CounterAttack.Name=Contra-ataque
|
||||
Swords.SubSkill.Bleed.Name=Sangrou
|
||||
Swords.Listener=Espadas:
|
||||
Swords.SkillName=Espada
|
||||
Swords.Skills.SS.On=[[GREEN]]**ATAQUE DE SERRA ACTIVADO**
|
||||
Swords.Skills.SS.Other.Off=Ataque de cerra[[GREEN]] acabou para [[YELLOW]]{0}
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]] quebra rapida!
|
||||
Swords.Skillup=Habilidade com Espadas aumentada em {0}. Total ({1})
|
||||
Taming.Ability.Bonus.1=Lobos evitam o perigo
|
||||
Taming.Ability.Bonus.6=Garras Afiadas
|
||||
Taming.SubSkill.ShockProof.Description=Reducao de dano explosivo
|
||||
Taming.SubSkill.CallOfTheWild.Name=Chamado da Selva
|
||||
Taming.SubSkill.CallOfTheWild.Description=Invoca um animal ao seu lado
|
||||
Taming.SubSkill.FastFoodService.Description=Chance dos lobos se curarem ao atacarem
|
||||
Taming.SubSkill.SharpenedClaws.Name=Garras Afiadas
|
||||
Taming.SubSkill.SharpenedClaws.Description=Dano Bonus
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]O seu lobo correu de volta ate voce...
|
||||
Taming.Listener=Domar
|
||||
Taming.SkillName=DOMAR
|
||||
Taming.Skillup=Habilidade de Domesticar aumentada em {0}. Total ({1})
|
||||
Unarmed.Listener=Desarmado:
|
||||
Unarmed.SkillName=DESARMAR
|
||||
Unarmed.Skills.Berserk.Off=**Berserk acabou**
|
||||
Unarmed.Skills.Berserk.Other.Off=Quebra rapida[[GREEN]] acabou para [[YELLOW]]{0}
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Berserk!
|
||||
Woodcutting.Ability.0=Soprador de Folhas
|
||||
Woodcutting.Ability.1=Soprar Folhas
|
||||
Woodcutting.SubSkill.TreeFeller.Description=Faz arvores explodirem.
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=Drops duplos
|
||||
Woodcutting.Listener=Lenhador
|
||||
Woodcutting.SkillName=Lenhador
|
||||
Woodcutting.Skills.TreeFeller.Other.Off=Corta Arvores[[GREEN]] acabou para o [[YELLOW]]{0}
|
||||
Woodcutting.Skills.TreeFeller.Splinter=SEU MACHADO SE QUEBROU EM DEZENAS DE PEDACOS!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Essa arvore e muito grande!
|
||||
Woodcutting.Skillup=Habilidade como Lenhador aumentada em {0}. Total ({1})
|
||||
Ability.Generic.Template={0}:[[YELLOW]]{1}
|
||||
Combat.ArrowDeflect=[[WHITE]]*DESVIOU A FLECHA*
|
||||
Combat.BeastLore=[[GREEN]]*CONHECIMENTO DE ANIMAIS*
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]Vida ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Dono ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]*MORDIDA*
|
||||
Combat.StruckByGore=*ATINGIDO POR MORDIDA*
|
||||
Combat.TargetDazed=Alvo foi [[DARK_RED]]Atordoado
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Visao turva. Sente Tonturas.
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]Voce ganhou {0} leveis em todas suas skills!
|
||||
Commands.addlevels.AwardAll.2=Todas suas skills foram alteradas para {0}.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]Voce ganhou {0} leveis em {1}!
|
||||
Commands.addlevels.AwardSkill.2={0} foi modificado para {1}.
|
||||
Commands.addxp.AwardAll=[[GREEN]]Voce ganhou {0} experiencias em todas skills!
|
||||
Commands.addxp.AwardSkill=[[GREEN]]Voce ganhou {0} experiencias em {1}!
|
||||
Commands.AdminChat.Off=Chat Admin [[RED]]Desligado
|
||||
Commands.AdminChat.On=Chat de Admin [[GREEN]]Ligado
|
||||
Commands.AdminToggle=- Liga o Admin chat
|
||||
Commands.Disabled=Este comando esta desabilitado.
|
||||
Commands.DoesNotExist=Player nao existe na database!
|
||||
Commands.GodMode.Disabled=mcMMO Modo God desabilitado
|
||||
Commands.GodMode.Enabled=mcMMO Godmode Ligado
|
||||
Commands.Invite.Accepted=[[GREEN]]Convite aceito. Voce se juntou ao grupo {0}
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - Modifica alvo
|
||||
Commands.ModDescription=- Leia a descricao breve do mod
|
||||
Commands.NoConsole=Esse comando nao suporta uso no console
|
||||
Commands.Party.Accept=- Aceitar convite de grupo
|
||||
Commands.Party.Chat.Off=Chat de grupo [[RED]]Desligado
|
||||
Commands.Party.Commands=[[GREEN]]--COMANDOS DE GRUPO--
|
||||
Commands.Party.Invite.0=ALERTA: [[GREEN]]Voce recebeu um convite para o grupo {0} de {1}
|
||||
Commands.Party.Kick=Voce foi kickado do grupo {0}!
|
||||
Commands.Party.Leave=Voce saiu do grupo
|
||||
Commands.Party.None=Voce nao esta em um grupo.
|
||||
Commands.Party.Quit=- Deixe seu grupo atual
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Nivel de Poder [[YELLOW]]Podium--
|
||||
Commands.PowerLevel=[[DARK_RED]]N\u00cdVEL DE PODER: [[GREEN]]{0}
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard sumiu.
|
||||
Commands.Scoreboard.NoBoard=The mcMMO scoreboard nao esta ativo.
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]O mcMMO scoreboard vai estar visivel ate voce usar [[GREEN]]/mcscoreboard clear[[DARK_AQUA]].
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]O mcMMO scoreboard vai sumir em [[GOLD]]{0}[[DARK_AQUA]] segundos.
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Ajuda para [[RED]]/mcscoreboard[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - oculta o McMMO scoreboard
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mantem o McMMO scoreboard visivel
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - oculta o McMMO scoreboard depois de [[LIGHT_PURPLE]]n[[WHITE]] segundos
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]Dica: Use [[RED]]/mcscoreboard keep[[GOLD]] enquanto ele estiver visivel para fazer com que ele fique sempre visivel .
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]Dica: Use [[RED]]/mcscoreboard clear[[GOLD]] para ocultar o McMMO scoreboard.
|
||||
Commands.Stats.Self=SEUS STATS
|
||||
mcMMO.NoPermission=[[DARK_RED]]Permissoes insuficientes.
|
||||
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
|
||||
Party.InvalidName=[[DARK_RED]]Isto nao e um nome valido.
|
||||
Party.Locked=Equipe esta bloqueada, soh o lider pode convidar.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} nao est\u00e1 na sua equipe
|
||||
Party.Password.Set=[[GREEN]]Senha da equipe: {0}
|
||||
Party.Player.Invalid=Isto nao e um jogador valido.
|
||||
Party.Teleport.Dead=Voce nao pode teleportar para um jogador morto.
|
||||
Party.Teleport.Player=[[GREEN]]Voce teleportou para {0}.
|
||||
Party.Teleport.Target=[[GREEN]]{0} teleportou-se para voce.
|
||||
Party.Unlocked=[[GRAY]]Equipe foi Destrancada
|
||||
Commands.XPGain.Acrobatics=CAINDO
|
||||
Commands.XPGain.Archery=Atacando Monstros
|
||||
Commands.XPGain.Axes=Atacando Monstros
|
||||
Commands.XPGain.Excavation=Cavando e achando tesouros
|
||||
Commands.XPGain.Herbalism=Colhendo Ervas
|
||||
Commands.XPGain.Mining=Minerar Pedra & Min\u00e9rio
|
||||
Commands.XPGain.Swords=Atacando Monstros
|
||||
Commands.XPGain.Taming=Domesticar animais, ou combater com os seus lobos
|
||||
Commands.XPGain=[[DARK_GRAY]]XP ADQUIRIDO: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]Sua barra de XP BAR est\u00e1 travada em {0}!
|
||||
Commands.xplock.unlocked=[[GOLD]]Sua barra de XP foi [[GREEN]]DESTRAVADA[[GOLD]]!
|
||||
Commands.xprate.over=Evento de XP Rate acabou!!
|
||||
XPRate.Event=[[GOLD]]mcMMO esta em um evento de XP aumentada! O aumento de XP e {0}x!
|
||||
Effects.Effects=EFEITOS
|
||||
Inspect.OfflineStats=Estatisticas do mcMMO para o player offline [[YELLOW]]{0}
|
||||
Inspect.Stats=[[GREEN]]Estatisticas do mcMMO para [[YELLOW]]{0}
|
||||
Inspect.TooFar=Voce esta muito longe para inspecionar este Player!
|
||||
Item.ChimaeraWing.Fail=**ASAS DE QUIMERA FALHARAM!**
|
||||
Item.ChimaeraWing.Pass=**ASAS DE QUIMERA**
|
||||
Item.Injured.Wait=Voce foi ferido recentemente e deve esperar para usar isto. [[YELLOW]]({0}s)
|
||||
Skills.Disarmed=[[DARK_RED]]Voc\u00ea foi Desarmado!
|
||||
Skills.NeedMore=[[DARK_RED]]Voc\u00ea precisa de mais
|
||||
Skills.TooTired=Voc\u00ea est\u00e1 cansado pra usar essa habilidade.
|
||||
Skills.Cancelled={0} cancelado!
|
||||
Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=SKILLS DE RECOLHA=-
|
||||
Stats.Header.Misc=[[GOLD]]-=OUTRAS SKILLS=-
|
||||
Scoreboard.Header.PlayerCooldowns=mcMMO Restantes
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]XP Atual
|
||||
Scoreboard.Misc.RemainingXP=XP Restante
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Faltando
|
||||
Scoreboard.Misc.Overall=[[GOLD]]Geral
|
||||
@@ -1,799 +0,0 @@
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**\u95ea\u907f**
|
||||
Acrobatics.DodgeChance=\u95ea\u907f\u51e0\u7387: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.Name=\u7ffb\u6eda
|
||||
Acrobatics.SubSkill.Roll.Description=\u51cf\u5c11\u6216\u8005\u53d6\u6d88\u6389\u843d\u4f24\u5bb3
|
||||
Acrobatics.SubSkill.GracefulRoll.Name=\u4f18\u96c5\u7684\u7ffb\u6eda
|
||||
Acrobatics.SubSkill.GracefulRoll.Description=\u4e24\u500d\u7684\u7ffb\u6eda\u6548\u679c
|
||||
Acrobatics.SubSkill.Dodge.Name=\u95ea\u907f
|
||||
Acrobatics.SubSkill.Dodge.Description=\u51cf\u5c11\u4e00\u534a\u7684\u4f24\u5bb3
|
||||
Acrobatics.Listener=\u6742\u6280(Acrobatics):
|
||||
Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0}
|
||||
Acrobatics.Roll.Text=**\u7ffb\u6eda**
|
||||
Acrobatics.SkillName=\u6742\u6280
|
||||
Acrobatics.Skillup=\u6742\u6280\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
|
||||
Alchemy.SubSkill.Catalysis.Name=\u50ac\u5316
|
||||
Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u836f\u6c34\u917f\u9020\u901f\u5ea6
|
||||
Alchemy.SubSkill.Concoctions.Name=\u6df7\u5408
|
||||
Alchemy.SubSkill.Concoctions.Description=\u917f\u9020\u5e26\u6709\u591a\u91cd\u539f\u6599\u7684\u836f\u6c34
|
||||
Alchemy.Listener=\u70bc\u91d1(Alchemy):
|
||||
Alchemy.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u50ac\u5316\uff09
|
||||
Alchemy.Catalysis.Speed=\u917f\u9020\u901f\u5ea6: [[YELLOW]]{0}
|
||||
Alchemy.Concoctions.Rank=\u6df7\u5408\u7b49\u7ea7: [[YELLOW]]{0}/{1}
|
||||
Alchemy.Concoctions.Ingredients=\u914d\u65b9 [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
|
||||
Alchemy.SkillName=\u70bc\u91d1
|
||||
Alchemy.Skillup=\u70bc\u91d1\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
|
||||
Archery.Combat.DazeChance=\u51fb\u6655\u51e0\u7387: [[YELLOW]]{0}
|
||||
Archery.Combat.RetrieveChance=\u56de\u6536\u7bad\u77e2\u7684\u51e0\u7387: [[YELLOW]]{0}
|
||||
Archery.Combat.SkillshotBonus=\u6280\u5de7\u5c04\u51fb\u5956\u52b1\u4f24\u5bb3: [[YELLOW]]{0}
|
||||
Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u51fb
|
||||
Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u4f24\u5bb3
|
||||
Archery.SubSkill.Daze.Name=\u51fb\u6655 (\u9650\u73a9\u5bb6\u4e4b\u95f4)
|
||||
Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u654c\u4eba\u5e76\u9020\u6210 {0} \u4f24\u5bb3
|
||||
Archery.SubSkill.ArrowRetrieval.Name=\u56de\u6536\u5f13\u7bad
|
||||
Archery.SubSkill.ArrowRetrieval.Description=\u6709\u51e0\u7387\u4ece\u5c38\u4f53\u4e0a\u56de\u6536\u7bad\u77e2
|
||||
Archery.Listener=\u7bad\u672f(Archery):
|
||||
Archery.SkillName=\u7bad\u672f
|
||||
Archery.Skillup=\u7bad\u672f\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
|
||||
Axes.Ability.Bonus.0=\u65a7\u5934\u7cbe\u901a
|
||||
Axes.Ability.Bonus.1=\u5956\u52b1 {0} \u4f24\u5bb3
|
||||
Axes.Ability.Bonus.2=\u51b2\u51fb
|
||||
Axes.Ability.Bonus.3=\u5bf9\u6709\u62a4\u7532\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3
|
||||
Axes.Ability.Bonus.4=\u5f3a\u70c8\u51b2\u51fb
|
||||
Axes.Ability.Bonus.5=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3
|
||||
Axes.Ability.Lower=[[GRAY]]**\u4f60\u6536\u8d77\u4e86\u4f60\u7684\u65a7\u5934**
|
||||
Axes.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u65a7\u5934**
|
||||
Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u66b4\u51fb!
|
||||
Axes.Combat.CritChance=\u81f4\u547d\u4e00\u51fb: [[YELLOW]]{0}%
|
||||
Axes.Combat.CriticalHit=\u66b4\u51fb!
|
||||
Axes.Combat.GI.Proc=[[GREEN]]**\u5de8\u529b\u6253\u51fb**
|
||||
Axes.Combat.GI.Struck=**\u88ab\u5f3a\u70c8\u51b2\u51fb\u51fb\u4e2d**
|
||||
Axes.Combat.SS.Struck=[[DARK_RED]]\u88ab\u65a9\u9996\u8005\u6280\u80fd\u653b\u51fb!
|
||||
Axes.Combat.SS.Length=\u65a9\u9996\u8005\u6280\u80fd\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Axes.SubSkill.SkullSplitter.Name=\u65a9\u9996\u8005 (\u4e3b\u52a8\u6280\u80fd)
|
||||
Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u8303\u56f4\u4f24\u5bb3
|
||||
Axes.SubSkill.CriticalStrikes.Name=\u81f4\u547d\u4e00\u51fb
|
||||
Axes.SubSkill.CriticalStrikes.Description=\u53cc\u500d\u4f24\u5bb3
|
||||
Axes.SubSkill.AxeMastery.Name=\u65a7\u5934\u7cbe\u901a
|
||||
Axes.SubSkill.AxeMastery.Description=\u589e\u52a0\u989d\u5916\u4f24\u5bb3
|
||||
Axes.SubSkill.ArmorImpact.Name=\u51b2\u51fb
|
||||
Axes.SubSkill.ArmorImpact.Description=\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532
|
||||
Axes.SubSkill.GreaterImpact.Name=\u5f3a\u70c8\u51b2\u51fb
|
||||
Axes.SubSkill.GreaterImpact.Description=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u9020\u6210\u989d\u5916\u4f24\u5bb3
|
||||
Axes.Listener=\u65a7\u6280(Axes):
|
||||
Axes.SkillName=\u65a7\u6280
|
||||
Axes.Skills.SS.Off=**\u65a9\u9996\u8005\u6280\u80fd\u5df2\u7ed3\u675f**
|
||||
Axes.Skills.SS.On=[[GREEN]]**\u65a9\u9996\u8005\u6280\u80fd\u542f\u52a8**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u65a9\u9996\u8005 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\uff01\uff01\uff01
|
||||
Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u4f7f\u7528\u4e86 [[RED]]\u65a9\u9996\u8005!
|
||||
Axes.Skillup=\u65a7\u5934\u6280\u80fd\u589e\u52a0\u4e86 {0}. \u603b\u5171 ({1})
|
||||
Excavation.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50**
|
||||
Excavation.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u94f2\u5b50**
|
||||
Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u94bb\u5934 (\u4e3b\u52a8\u6280\u80fd)
|
||||
Excavation.SubSkill.GigaDrillBreaker.Description=3x \u6389\u843d\u7387, 3x \u7ecf\u9a8c\u503c, +\u901f\u5ea6
|
||||
Excavation.SubSkill.TreasureHunter.Name=\u5b9d\u7269\u730e\u4eba
|
||||
Excavation.SubSkill.TreasureHunter.Description=\u6316\u51fa\u5b9d\u85cf\u7684\u80fd\u529b
|
||||
Excavation.Effect.Length=\u66b4\u8d70\u94bb\u5934\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Excavation.Listener=\u6316\u6398(Excavation):
|
||||
Excavation.SkillName=\u6316\u6398
|
||||
Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u94bb\u5934\u5df2\u7ecf\u7ed3\u675f\u4e86**
|
||||
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u66b4\u8d70\u94bb\u5934\u6fc0\u6d3b**
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u66b4\u8d70\u94bb\u5934 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934[[GREEN]] \u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0}
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u66b4\u8d70\u94bb\u5934!
|
||||
Excavation.Skillup=\u6316\u6398\u6280\u80fd\u63d0\u5347 {0}. \u603b\u5171 ({1})
|
||||
Fishing.Ability.Chance=\u6495\u54ac\u51e0\u7387: [[YELLOW]]{0}
|
||||
Fishing.Ability.Info=\u9b54\u6cd5\u730e\u4eba: [[GRAY]] ** \u968f\u7740\u5b9d\u85cf\u730e\u4eba\u7b49\u7ea7\u63d0\u9ad8 **
|
||||
Fishing.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u6447\uff09
|
||||
Fishing.Ability.Locked.1={0}+ \u7ea7\u540e\u89e3\u9501 (\u51b0\u9493)
|
||||
Fishing.Ability.Locked.2=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd (\u9493\u9c7c\u5927\u5e08)
|
||||
Fishing.Ability.Rank=\u5b9d\u7269\u730e\u4eba\u7b49\u7ea7: [[YELLOW]]{0}/5
|
||||
Fishing.Ability.TH.DropRate=\u6389\u5b9d\u7387: [[DARK_RED]]\u9677\u9631: [[YELLOW]]{0} [[GRAY]]\u5e38\u89c1: [[YELLOW]]{1} [[GREEN]]\u7f55\u89c1: [[YELLOW]]{2}\n[[BLUE]]\u7a00\u6709: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u53f2\u8bd7: [[YELLOW]]{4} [[GOLD]]\u4f20\u8bf4: [[YELLOW]]{5} [[AQUA]]\u521b\u7eaa\u5f55: [[YELLOW]]{6}
|
||||
Fishing.Ability.TH.MagicRate=\u9b54\u6cd5\u730e\u4eba\u51e0\u7387: [[YELLOW]]{0}
|
||||
Fishing.Ability.Shake=\u9c7c\u94a9\u7a83\u53d6\u51e0\u7387: [[YELLOW]]{0}
|
||||
Fishing.Ability.IceFishing=\u51b0\u9493: \u5728\u51b0\u4e0a\u9493\u9c7c
|
||||
Fishing.Ability.FD=\u6e14\u6c11\u7684\u98df\u8c31: [[YELLOW]]\u6392\u540d {0}
|
||||
Fishing.SubSkill.TreasureHunter.Name=\u5b9d\u7269\u730e\u4eba (\u88ab\u52a8\u6280\u80fd)
|
||||
Fishing.SubSkill.TreasureHunter.Description=\u9493\u5230\u6742\u7269
|
||||
Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u730e\u4eba
|
||||
Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1
|
||||
Fishing.SubSkill.Shake.Name=\u6643\u52a8\u602a\u7269 (\u5bf9\u602a\u7269\u4f7f\u7528)
|
||||
Fishing.SubSkill.Shake.Description=\u7528\u9c7c\u7aff\u628a\u602a\u7269\u8eab\u4e0a\u7684\u4e1c\u897f\u6447\u4e0b\u6765
|
||||
Fishing.SubSkill.FishermansDiet.Name=\u6e14\u592b\u98df\u8c31
|
||||
Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9c7c\u7c7b\u98df\u7269\u6062\u590d\u7684\u9971\u98df\u5ea6
|
||||
Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08
|
||||
Fishing.SubSkill.MasterAngler.Description=\u63d0\u9ad8\u9493\u9c7c\u54ac\u94a9\u51e0\u7387
|
||||
Fishing.SubSkill.IceFishing.Name=\u51b0\u9493
|
||||
Fishing.SubSkill.IceFishing.Description=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c
|
||||
Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u5956\u52b1
|
||||
Fishing.Listener=\u9493\u9c7c(Fishing):
|
||||
Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8...
|
||||
Fishing.Ability.TH.Boom=[[GRAY]]\u7e41\u8363\u65f6\u671f!!!
|
||||
Fishing.Ability.TH.Poison=[[GRAY]]\u4ec0\u4e48\u4e1c\u897f,\u95fb\u8d77\u6765\u597d\u81ed\u554a...
|
||||
Fishing.SkillName=\u9493\u9c7c
|
||||
Fishing.Skillup=\u9493\u9c7c\u6280\u80fd\u63d0\u5347\u4e86 {0}. \u603b\u5171 ({1})
|
||||
Herbalism.Ability.DoubleDropChance=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
|
||||
Herbalism.Ability.FD=\u519c\u592b\u98df\u8c31: [[YELLOW]]\u6392\u540d {0}
|
||||
Herbalism.Ability.GTe.Length=\u571f\u795e\u5e87\u4f51\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u7684\u79cd\u5b50\u8fdb\u884c\u7eff\u5316
|
||||
Herbalism.Ability.GTh.Chance=\u7eff\u5316\u51e0\u7387: [[YELLOW]]{0}
|
||||
Herbalism.Ability.GTh.Fail=**\u7eff\u5316\u5931\u8d25**
|
||||
Herbalism.Ability.GTh.Stage=\u7eff\u5316:[[YELLOW]]\u519c\u4f5c\u7269\u751f\u957f\u671f{0}
|
||||
Herbalism.Ability.GTh=[[GREEN]]**\u7eff\u5316**
|
||||
Herbalism.Ability.HylianLuck=\u6d77\u62c9\u5c14\u7684\u795d\u798f\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
|
||||
Herbalism.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**\u4f60\u6311\u8d77\u4e86\u4f60\u7684\u9504\u5934**
|
||||
Herbalism.Ability.ShroomThumb.Chance=\u83cc\u4e1d\u5316\u51e0\u7387: [[YELLOW]]{0}
|
||||
Herbalism.Ability.ShroomThumb.Fail=**\u83cc\u4e1d\u5316\u5931\u8d25**
|
||||
Herbalism.SubSkill.GreenTerra.Name=\u571f\u795e\u5e87\u4f51 (\u4e3b\u52a8\u6280\u80fd)
|
||||
Herbalism.SubSkill.GreenTerra.Description=\u64ad\u6492\u5973\u795e\u7684\u6069\u60e0, \u83b7\u5f973\u500d\u6389\u7387
|
||||
Herbalism.SubSkill.GreenThumb.Name=\u7eff\u5316 (\u5c0f\u9ea6)
|
||||
Herbalism.SubSkill.GreenThumb.Description=\u6536\u83b7\u7684\u65f6\u5019\u81ea\u52a8\u79cd\u690d\u5c0f\u9ea6
|
||||
Herbalism.Effect.4=\u7eff\u5316 (\u65b9\u5757)
|
||||
Herbalism.SubSkill.GreenThumb.Description.2=\u788e\u77f3/\u77f3\u5757 -> \u7528\u79cd\u5b50\u4f7f\u5b83\u4eec\u53d8\u6210\u9752\u82d4\u77f3,\u6216\u8005\u8ba9\u8349\u751f\u957f
|
||||
Herbalism.SubSkill.FarmersDiet.Name=\u519c\u592b\u98df\u8c31
|
||||
Herbalism.SubSkill.FarmersDiet.Description=\u98df\u7528\u519c\u4ea7\u54c1\u65f6\u989d\u5916\u56de\u590d\u9965\u997f\u5ea6
|
||||
Herbalism.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d (\u6240\u6709\u7684\u690d\u7269)
|
||||
Herbalism.SubSkill.DoubleDrops.Description=\u53cc\u500d\u7269\u54c1
|
||||
Herbalism.SubSkill.HylianLuck.Name=\u6d77\u62c9\u5c14\u7684\u795d\u798f
|
||||
Herbalism.SubSkill.HylianLuck.Description=\u7ed9\u4e88\u5c0f\u51e0\u7387\u627e\u5230\u7a00\u6709\u7269\u54c1\u7684\u80fd\u529b
|
||||
Herbalism.SubSkill.ShroomThumb.Name=\u83cc\u4e1d\u5316
|
||||
Herbalism.SubSkill.ShroomThumb.Description=\u5411\u6ce5\u571f&\u8349\u5730\u6563\u64ad\u83cc\u4e1d
|
||||
Herbalism.HylianLuck=[[GREEN]]\u613f\u6d77\u62c9\u5c14\u7684\u795d\u798f\u4e0e\u4f60\u540c\u5728!
|
||||
Herbalism.Listener=\u8349\u836f\u5b66(Herbalism):
|
||||
Herbalism.SkillName=\u8349\u836f\u5b66
|
||||
Herbalism.Skills.GTe.Off=**\u571f\u795e\u5e87\u4f51\u6280\u80fd\u5df2\u7ed3\u675f**
|
||||
Herbalism.Skills.GTe.On=[[GREEN]]**\u6fc0\u6d3b\u571f\u795e\u5e87\u4f51\u6280\u80fd**
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u571f\u795e\u5e87\u4f51 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
|
||||
Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u571f\u795e\u5e87\u4f51!
|
||||
Herbalism.Skillup=\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7\u4e0a\u5347 {0}. \u73b0\u5728\u662f ({1})
|
||||
Mining.Ability.Length=\u8d85\u7ea7\u788e\u77f3\u673a\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Mining.Ability.Locked.0=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u5f00\u91c7)
|
||||
Mining.Ability.Locked.1=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u5927\u53f7\u70b8\u5f39)
|
||||
Mining.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u4e13\u5bb6)
|
||||
Mining.Ability.Lower=[[GRAY]]**\u4f60\u6536\u8d77\u4e86\u4f60\u7684\u9550\u5b50**
|
||||
Mining.Ability.Ready=[[GREEN]]**\u4f60\u62ff\u8d77\u4e86\u4f60\u7684\u77ff\u9504**
|
||||
Mining.SubSkill.SuperBreaker.Name=\u8d85\u7ea7\u788e\u77f3\u673a (\u4e3b\u52a8\u6280\u80fd)
|
||||
Mining.SubSkill.SuperBreaker.Description=\u901f\u5ea6+, 3\u500d\u6389\u843d\u7387
|
||||
Mining.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d
|
||||
Mining.SubSkill.DoubleDrops.Description=\u53cc\u500d\u7269\u54c1
|
||||
Mining.SubSkill.BlastMining.Name=\u7206\u7834\u5f00\u91c7
|
||||
Mining.SubSkill.BlastMining.Description=\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u4f1a\u83b7\u5f97\u989d\u5916\u5956\u52b1
|
||||
Mining.SubSkill.BiggerBombs.Name=\u5927\u53f7\u70b8\u5f39
|
||||
Mining.SubSkill.BiggerBombs.Description=\u589e\u52a0TNT\u7206\u70b8\u8303\u56f4
|
||||
Mining.SubSkill.DemolitionsExpertise.Name=\u7206\u7834\u4e13\u5bb6
|
||||
Mining.SubSkill.DemolitionsExpertise.Description=\u51cf\u5c11\u6765\u81eaTNT\u7684\u4f24\u5bb3
|
||||
Mining.Effect.Decrease=\u7206\u7834\u4e13\u5bb6\u4f24\u5bb3\u51cf\u5c11: [[YELLOW]]{0}
|
||||
Mining.Effect.DropChance=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
|
||||
Mining.Listener=\u6316\u77ff(Mining):
|
||||
Mining.SkillName=\u6316\u77ff
|
||||
Mining.Skills.SuperBreaker.Off=**\u8d85\u7ea7\u788e\u77f3\u673a\u5df2\u7ed3\u675f**
|
||||
Mining.Skills.SuperBreaker.On=[[GREEN]]**\u8d85\u7ea7\u788e\u77f3\u673a\u5df2\u6fc0\u6d3b**
|
||||
Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u8d85\u7ea7\u788e\u77f3\u673a!
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u4f60\u7684[[YELLOW]] \u8d85\u7ea7\u788e\u77f3\u673a [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
|
||||
Mining.Skillup=\u6316\u77ff\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
|
||||
Mining.Blast.Boom=[[GRAY]]**\u5623**
|
||||
Mining.Blast.Effect=+{0} \u77ff\u7269\u91cf, -{1} \u788e\u7247\u91cf, {2}x \u6389\u843d
|
||||
Mining.Blast.Radius.Increase=\u7206\u70b8\u534a\u5f84\u63d0\u5347: [[YELLOW]]+{0}
|
||||
Mining.Blast.Rank=\u7206\u7834\u5f00\u91c7: [[YELLOW]] \u6392\u540d {0}/8 [[GRAY]]({1})
|
||||
Mining.Blast.Other.On=Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u7206\u7834\u5f00\u91c7!
|
||||
Mining.Blast.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u7206\u7834\u5f00\u91c7 [[GREEN]]\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!
|
||||
Repair.SubSkill.Repair.Name=\u4fee\u7406
|
||||
Repair.SubSkill.Repair.Description=\u4fee\u7406\u5de5\u5177\u548c\u88c5\u5907
|
||||
Repair.SubSkill.GoldRepair.Name=\u4fee\u7406\u9ec4\u91d1 ({0}+ SKILL)
|
||||
Repair.SubSkill.GoldRepair.Description=\u4fee\u7406\u9ec4\u91d1\u5de5\u5177\u548c\u88c5\u5907
|
||||
Repair.SubSkill.IronRepair.Name=\u4fee\u7406\u94c1\u8d28\u7269\u54c1 ({0}+ SKILL)
|
||||
Repair.SubSkill.IronRepair.Description=\u4fee\u7406\u94c1\u8d28\u5de5\u5177\u548c\u62a4\u7532
|
||||
Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u5934\u7269\u54c1 ({0}+ SKILL)
|
||||
Repair.SubSkill.StoneRepair.Description=\u4fee\u7406\u77f3\u5934\u5de5\u5177
|
||||
Repair.SubSkill.RepairMastery.Name=\u4fee\u7406\u7cbe\u901a
|
||||
Repair.SubSkill.RepairMastery.Description=\u5df2\u589e\u52a0\u4fee\u7406\u6570\u91cf
|
||||
Repair.SubSkill.SuperRepair.Name=\u8d85\u7ea7\u4fee\u7406
|
||||
Repair.SubSkill.SuperRepair.Description=\u53cc\u500d\u6548\u679c
|
||||
Repair.SubSkill.DiamondRepair.Name=\u94bb\u77f3\u4fee\u7406 ({0}+ SKILL)
|
||||
Repair.SubSkill.DiamondRepair.Description=\u4fee\u7406\u94bb\u77f3\u5de5\u5177\u548c\u88c5\u5907
|
||||
Repair.SubSkill.ArcaneForging.Name=\u79d8\u6cd5\u953b\u9020
|
||||
Repair.SubSkill.ArcaneForging.Description=\u4fee\u7406\u9644\u9b54\u7269\u54c1
|
||||
Repair.Error=[[DARK_RED]]mcMMO \u5728\u5c1d\u8bd5\u4fee\u7406\u6b64\u7269\u54c1\u65f6\u53d1\u751f\u4e86\u9519\u8bef!
|
||||
Repair.Listener.Anvil=[[DARK_RED]]\u4f60\u653e\u7f6e\u7684\u94c1\u65b9\u5757\u53ef\u4ee5\u7528\u6765\u4fee\u7406\u5de5\u5177\u548c\u9632\u5177.
|
||||
Repair.Listener=\u4fee\u7406\uff1a
|
||||
Repair.SkillName=\u4fee\u7406
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u94bb\u77f3\u88c5\u5907.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88c5\u5907.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u590d\u94c1\u8d28\u88c5\u5907.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u590d\u77f3\u5934\u88c5\u5907
|
||||
Repair.Skills.Adept=\u4f60\u5fc5\u987b\u8fbe\u5230\u7b49\u7ea7 [[YELLOW]]{0}[[RED]] \u624d\u80fd\u4fee\u7406 [[YELLOW]]{1}
|
||||
Repair.Skills.FeltEasy=[[GRAY]]\u90a3\u770b\u8d77\u6765\u5f88\u7b80\u5355.
|
||||
Repair.Skills.FullDurability=[[GRAY]]\u4f60\u7684\u88c5\u5907\u5df2\u7ecf\u6ee1\u8010\u4e45\u5ea6\u4e86
|
||||
Repair.Skills.Mastery=\u4fee\u7406\u7cbe\u901a: [[YELLOW]]\u989d\u5916\u56de\u590d {0} \u8010\u4e45\u5ea6
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]\u4f60\u65e0\u6cd5\u4fee\u7406\u5df2\u53e0\u52a0\u7684\u7269\u54c1.
|
||||
Repair.Skills.Super.Chance=\u8d85\u7ea7\u4fee\u7406\u51e0\u7387: [[YELLOW]]{0}
|
||||
Repair.Skillup=\u4fee\u7406\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u5171 ({1})
|
||||
Repair.Pretty.Name=\u4fee\u7406
|
||||
Repair.Arcane.Chance.Downgrade=[[GRAY]]\u9644\u9b54\u964d\u7ea7\u51e0\u7387: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]\u795e\u79d8\u953b\u9020\u6210\u529f\u7387: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Downgrade=\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u7b49\u7ea7\u5df2\u4e0b\u964d.
|
||||
Repair.Arcane.Fail=\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u5df2\u6d88\u5931.
|
||||
Repair.Arcane.Lost=\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fdd\u7559\u9644\u9b54\u5c5e\u6027.
|
||||
Repair.Arcane.Perfect=[[GREEN]]\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54.
|
||||
Repair.Arcane.Rank=\u79d8\u6cd5\u953b\u9020: [[YELLOW]]\u7b49\u7ea7 {0}/4
|
||||
Salvage.Pretty.Name=\u5206\u89e3
|
||||
Salvage.SubSkill.AdvancedSalvage.Name=\u8fdb\u9636\u5206\u89e3
|
||||
Salvage.SubSkill.AdvancedSalvage.Description=\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1
|
||||
Salvage.SubSkill.ArcaneSalvaging.Name=\u795e\u79d8\u5206\u89e3
|
||||
Salvage.SubSkill.ArcaneSalvaging.Description=\u4ece\u7269\u54c1\u4e2d\u62c6\u89e3\u51fa\u9644\u9b54
|
||||
Salvage.Ability.Locked.0=\u80fd\u529b\u9501\u5b9a\u76f4\u81f3 {0}+ \u6280\u80fd\u7b49\u7ea7 (\u8fdb\u9636\u5206\u89e3)
|
||||
Salvage.Ability.Bonus.0=\u8fdb\u9636\u5206\u89e3
|
||||
Salvage.Ability.Bonus.1=\u6700\u5927\u9650\u5ea6\u56de\u6536 {0} \u635f\u574f\u7684\u7269\u54c1
|
||||
Salvage.Arcane.Rank=\u795e\u79d8\u5206\u89e3: [[YELLOW]]\u7b49\u7ea7 {0}/{1}
|
||||
Salvage.Arcane.ExtractFull=[[GRAY]]\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387
|
||||
Salvage.Arcane.ExtractPartial=[[GRAY]]\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387
|
||||
Salvage.Skills.Success=[[GREEN]]\u7269\u54c1\u5df2\u5206\u89e3\uff01
|
||||
Salvage.Skills.Adept.Damaged=[[DARK_RED]]\u60a8\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1\u3002
|
||||
Salvage.Skills.Adept.Level=\u60a8\u5fc5\u987b\u8fbe\u5230 [[YELLOW]]{0}[[RED]] \u7ea7\u624d\u80fd\u5206\u89e3 [[YELLOW]]{1}
|
||||
Salvage.Skills.TooDamaged=[[DARK_RED]]\u8be5\u7269\u54c1\u635f\u574f\u8fc7\u4e8e\u4e25\u91cd\uff0c\u65e0\u6cd5\u5206\u89e3\u3002
|
||||
Salvage.Skills.ArcaneFailed=\u60a8\u65e0\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u77e5\u8bc6\u3002
|
||||
Salvage.Skills.ArcanePartial=\u60a8\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u90e8\u5206\u77e5\u8bc6\u3002
|
||||
Salvage.Skills.ArcaneSuccess=[[GREEN]]\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8bc6\uff01
|
||||
Salvage.Listener.Anvil=[[DARK_RED]]\u60a8\u5df2\u7ecf\u653e\u7f6e\u4e86\u4e00\u4e2a\u5206\u89e3\u7827\uff0c\u4f7f\u7528\u5b83\u6765\u5206\u89e3\u5de5\u5177\u548c\u62a4\u7532\u3002
|
||||
Salvage.Listener=\u5206\u89e3:
|
||||
Salvage.SkillName=\u5206\u89e3
|
||||
Anvil.Unbreakable=\u8be5\u7269\u54c1\u662f\u65e0\u6cd5\u7834\u574f\u7684\uff01
|
||||
Swords.Ability.Lower=[[GRAY]]**\u4f60\u6536\u597d\u4e86\u4f60\u7684\u5251**
|
||||
Swords.Ability.Ready=[[GREEN]]**\u4f60\u628a\u5251\u7d27\u63e1\u5728\u4e86\u624b\u4e2d**
|
||||
Swords.Combat.Bleed.Chance=\u653e\u8840\u51e0\u7387: [[YELLOW]]{0}
|
||||
Swords.Combat.Bleed.Length=\u6d41\u8840\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0} ticks
|
||||
Swords.Combat.Bleed.Note=[[GRAY]]\u6ce8\u610f: [[YELLOW]]\u6bcf\u4e24\u79d2\u51cf\u4e00\u6ef4\u8840
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] \u4f60\u6b63\u5728\u6d41\u8840!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]\u653e\u8840 [[GREEN]]\u5df2\u505c\u6b62[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**\u654c\u4eba\u6b63\u5728\u4e0d\u65ad\u6d41\u8840**
|
||||
Swords.Combat.Counter.Chance=\u53cd\u51fb\u51e0\u7387: [[YELLOW]]{0}
|
||||
Swords.Combat.Counter.Hit=[[DARK_RED]]\u4f60\u53cd\u51fb\u4e86\u5bf9\u624b!
|
||||
Swords.Combat.Countered=[[GREEN]]**\u53cd\u51fb\u4e86\u654c\u4eba**
|
||||
Swords.Combat.SS.Struck=[[DARK_RED]]\u53d1\u52a8\u5229\u5203\u7a81\u523a!
|
||||
Swords.SubSkill.CounterAttack.Name=\u53cd\u51fb
|
||||
Swords.SubSkill.CounterAttack.Description=\u683c\u6863\u65f6\u53cd\u5f39{0}\u4f24\u5bb3\u503c
|
||||
Swords.SubSkill.SerratedStrikes.Name=\u5229\u5203\u7a81\u523a (\u4e3b\u52a8\u6280\u80fd)
|
||||
Swords.SubSkill.SerratedStrikes.Description={0} \u653b\u51fb\u8303\u56f4, \u653e\u8840\u8303\u56f4
|
||||
Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6d41\u8840\u4f24\u5bb3\u589e\u52a0
|
||||
Swords.Effect.5={0} \u6b21 \u6d41\u8840
|
||||
Swords.SubSkill.Bleed.Name=\u653e\u8840
|
||||
Swords.SubSkill.Bleed.Description=\u4ea7\u751f\u653e\u8840\u4f24\u5bb3
|
||||
Swords.Listener=\u5251\u672f(Swords):
|
||||
Swords.SkillName=\u5251\u672f
|
||||
Swords.Skills.SS.Off=**\u5229\u5203\u7a81\u523a\u5df2\u7ecf\u7ed3\u675f\u4e86**
|
||||
Swords.Skills.SS.On=[[GREEN]]**\u5229\u5203\u7a81\u523a\u542f\u52a8**
|
||||
Swords.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u5229\u5203\u7a81\u523a [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
|
||||
Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u5229\u5203\u7a81\u523a!
|
||||
Swords.Skillup=\u5251\u672f\u6280\u80fd\u7b49\u7ea7\u4e0a\u5347 {0}. \u73b0\u5728\u662f ({1})
|
||||
Swords.SS.Length=\u952f\u9f7f\u5229\u5203\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Taming.Ability.Bonus.0=\u73af\u5883\u611f\u77e5
|
||||
Taming.Ability.Bonus.1=\u72fc\u4f1a\u907f\u514d\u5371\u9669
|
||||
Taming.Ability.Bonus.2=\u539a\u5b9e\u7684\u76ae\u6bdb
|
||||
Taming.Ability.Bonus.3=1/{0} \u4f24\u5bb3, \u706b\u7130\u62b5\u6297
|
||||
Taming.Ability.Bonus.4=\u51b2\u51fb\u62b5\u6297
|
||||
Taming.Ability.Bonus.5=\u7206\u70b8\u9020\u6210 1/{0} \u666e\u901a\u4f24\u5bb3
|
||||
Taming.Ability.Bonus.6=\u5229\u722a
|
||||
Taming.Ability.Bonus.7=+{0} \u4f24\u5bb3
|
||||
Taming.Ability.Bonus.8=\u5feb\u9910\u670d\u52a1
|
||||
Taming.Ability.Bonus.9={0} \u7684\u51e0\u7387\u653b\u51fb\u65f6\u56de\u8840
|
||||
Taming.Ability.Bonus.10=\u72ac\u795e\u7684\u5e87\u62a4
|
||||
Taming.Ability.Bonus.11=\u53d7\u5230\u9b54\u6cd5\u6216\u4e2d\u6bd2\u4f24\u5bb3\u65f6\u6062\u590d\u751f\u547d\u503c
|
||||
Taming.Ability.Locked.0={0}+ \u7ea7\u540e\u89e3\u9501 (\u73af\u5883\u611f\u77e5)
|
||||
Taming.Ability.Locked.1=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u539a\u5b9e\u7684\u76ae\u6bdb)
|
||||
Taming.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u51b2\u51fb\u62b5\u6297)
|
||||
Taming.Ability.Locked.3=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u5229\u722a)
|
||||
Taming.Ability.Locked.4={0}+ \u7ea7\u540e\u89e3\u9501 (FAST FOOD SERVICE)
|
||||
Taming.Ability.Locked.5={0}+ \u7ea7\u540e\u89e3\u9501 (\u72ac\u795e\u7684\u5e87\u62a4)
|
||||
Taming.Combat.Chance.Gore=\u55dc\u8840\u51e0\u7387: [[YELLOW]]{0}
|
||||
Taming.SubSkill.BeastLore.Name=\u9a6f\u517d\u77e5\u8bc6
|
||||
Taming.SubSkill.BeastLore.Description=\u7528\u9aa8\u5934\u53f3\u952e\u5355\u51fb\u72fc\u6216\u8005\u8c79\u732b\u4ee5\u68c0\u67e5\u5b83\u4eec\u7684\u72b6\u51b5
|
||||
Taming.SubSkill.ShockProof.Name=\u51b2\u51fb\u62b5\u6297
|
||||
Taming.SubSkill.ShockProof.Description=\u7206\u70b8\u4f24\u5bb3\u51cf\u5c11
|
||||
Taming.SubSkill.CallOfTheWild.Name=\u91ce\u6027\u547c\u5524
|
||||
Taming.SubSkill.CallOfTheWild.Description=\u4e3a\u4f60\u53ec\u5524\u4e00\u53ea\u5ba0\u7269
|
||||
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]\u53ec\u5524 (\u8c79\u732b): \u624b\u91cc\u62ff\u7740 {0} \u6761\u9c7c,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
|
||||
Taming.Effect.15=[[GRAY]]\u53ec\u5524 (\u72fc): \u624b\u91cc\u62ff\u7740 {0} \u6839\u9aa8\u5934,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
|
||||
Taming.SubSkill.Gore.Name0=[[GRAY]]\u53ec\u5524 (\u9a6c): \u624b\u91cc\u62ff\u7740 {0} \u4e2a\u82f9\u679c,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
|
||||
Taming.SubSkill.FastFoodService.Name=\u5feb\u9910\u670d\u52a1
|
||||
Taming.SubSkill.FastFoodService.Description=\u4e00\u5b9a\u51e0\u7387\u4f7f\u72fc\u5728\u653b\u51fb\u65f6\u56de\u590d\u81ea\u8eab\u8840\u91cf
|
||||
Taming.SubSkill.HolyHound.Name=\u72ac\u795e\u7684\u5e87\u62a4
|
||||
Taming.SubSkill.HolyHound.Description=\u5df2\u88ab\u9b54\u6cd5 & \u4e2d\u6bd2\u6548\u679c\u6cbb\u6108
|
||||
Taming.SubSkill.Gore.Name=\u55dc\u8840
|
||||
Taming.SubSkill.Gore.Description=\u81f4\u547d\u653b\u51fb\u4f1a\u7ed9\u76ee\u6807\u653e\u8840
|
||||
Taming.SubSkill.SharpenedClaws.Name=\u5229\u722a
|
||||
Taming.SubSkill.SharpenedClaws.Description=\u4f24\u5bb3\u5956\u52b1
|
||||
Taming.SubSkill.EnvironmentallyAware.Name=\u73af\u5883\u611f\u77e5
|
||||
Taming.SubSkill.EnvironmentallyAware.Description=\u4ed9\u4eba\u638c/\u5ca9\u6d46 \u6050\u60e7\u75c7, \u514d\u75ab\u6389\u843d\u4f24\u5bb3
|
||||
Taming.SubSkill.ThickFur.Name=\u539a\u5b9e\u7684\u76ae\u6bdb
|
||||
Taming.SubSkill.ThickFur.Description=\u524a\u51cf\u53d7\u5230\u7684\u4f24\u5bb3, \u706b\u7130\u62b5\u6297
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]\u4f60\u7684\u72fc\u98de\u901f\u5730\u8dd1\u56de\u4e86\u4f60\u8eab\u8fb9...
|
||||
Taming.Listener=\u9a6f\u517d(Taming):
|
||||
Taming.SkillName=\u9a6f\u517d
|
||||
Taming.Skillup=\u9a6f\u517d\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u5171 ({1})
|
||||
Taming.Summon.Complete=[[GREEN]]\u53ec\u5524\u5b8c\u6bd5
|
||||
Taming.Summon.Fail.Ocelot=\u4f60\u4e0d\u80fd\u53ec\u5524\u8c79\u732b\u56e0\u4e3a\u4f60\u53ec\u5524\u4e86\u592a\u591a\u4e86.
|
||||
Taming.Summon.Fail.Wolf=\u4f60\u8eab\u8fb9\u5df2\u7ecf\u62e5\u6709\u8db3\u591f\u591a\u7684\u72fc,\u65e0\u6cd5\u53ec\u5524\u66f4\u591a.
|
||||
Taming.Summon.Fail.Horse=\u4f60\u8eab\u8fb9\u5df2\u7ecf\u62e5\u6709\u8db3\u591f\u591a\u7684\u9a6c\u4e86,\u65e0\u6cd5\u53ec\u5524.
|
||||
Taming.Summon.Name.Format={0}\u7684 {1}
|
||||
Unarmed.Ability.Berserk.Length=\u72c2\u66b4\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
|
||||
Unarmed.Ability.Bonus.0=\u94c1\u8155\u6a21\u5f0f
|
||||
Unarmed.Ability.Bonus.1=\u589e\u52a0{0}\u70b9\u4f24\u5bb3
|
||||
Unarmed.Ability.Chance.ArrowDeflect=\u7bad\u77e2\u504f\u5411\u51e0\u7387: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.Disarm=\u7f34\u68b0\u51e0\u7387: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.IronGrip=\u8d85\u5f3a\u63e1\u529b\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
|
||||
Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5bf9\u624b\u6709\u8d85\u5f3a\u63e1\u529b!
|
||||
Unarmed.Ability.IronGrip.Defender=[[GREEN]]\u4f60\u7684\u8d85\u5f3a\u63e1\u529b\u62b5\u6321\u4f4f\u4e86\u5bf9\u65b9\u7684\u7f34\u68b0\u653b\u51fb!
|
||||
Unarmed.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u62f3\u5934**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u62f3\u5934**
|
||||
Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 (\u4e3b\u52a8\u6280\u80fd)
|
||||
Unarmed.SubSkill.Berserk.Description=+50% \u4f24\u5bb3, \u80fd\u7834\u574f\u786c\u5ea6\u4f4e\u7684\u65b9\u5757
|
||||
Unarmed.SubSkill.Disarm.Name=\u7f34\u68b0 (\u4ec5\u9650\u73a9\u5bb6)
|
||||
Unarmed.SubSkill.Disarm.Description=\u4f7f\u654c\u4eba\u624b\u4e2d\u6b66\u5668\u6389\u843d
|
||||
Unarmed.SubSkill.IronArmStyle.Name=\u94c1\u8155\u6a21\u5f0f
|
||||
Unarmed.SubSkill.IronArmStyle.Description=\u4f7f\u4f60\u7684\u62a4\u7532\u968f\u65f6\u95f4\u589e\u52a0\u800c\u589e\u5f3a
|
||||
Unarmed.SubSkill.ArrowDeflect.Name=\u7bad\u77e2\u504f\u5411
|
||||
Unarmed.SubSkill.ArrowDeflect.Description=\u8ba9\u7bad\u77e2\u504f\u5411
|
||||
Unarmed.SubSkill.IronGrip.Name=\u8d85\u5f3a\u63e1\u529b
|
||||
Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u88ab\u7f34\u68b0
|
||||
Unarmed.Listener=\u683c\u6597(Unarmed):
|
||||
Unarmed.SkillName=\u683c\u6597
|
||||
Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u6280\u80fd\u5df2\u7ed3\u675f**
|
||||
Unarmed.Skills.Berserk.On=[[GREEN]]**\u72c2\u66b4\u6fc0\u6d3b**
|
||||
Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u72c2\u66b4!
|
||||
Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u72c2\u66b4 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
|
||||
Unarmed.Skillup=\u683c\u6597\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
|
||||
Woodcutting.Ability.0=\u79cb\u98ce\u626b\u843d\u53f6
|
||||
Woodcutting.Ability.1=\u626b\u9664\u6811\u53f6
|
||||
Woodcutting.Ability.Chance.DDrop=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
|
||||
Woodcutting.Ability.Length=\u6811\u6728\u780d\u4f10\u8005\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}\u79d2
|
||||
Woodcutting.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd (\u5439\u53f6\u673a)
|
||||
Woodcutting.SubSkill.TreeFeller.Name=\u7cbe\u9510\u4f10\u6728\u5de5(\u6280\u80fd)
|
||||
Woodcutting.SubSkill.TreeFeller.Description=\u7206\u53d1\u5f0f\u7684\u780d\u6811
|
||||
Woodcutting.SubSkill.LeafBlower.Name=\u4e71\u780d\u65e0\u53cc
|
||||
Woodcutting.SubSkill.LeafBlower.Description=\u626b\u9664\u6811\u53f6
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=\u53cc\u500d\u6389\u843d
|
||||
Woodcutting.SubSkill.HarvestLumber.Description=\u53cc\u500d\u6389\u843d\u7269\u54c1
|
||||
Woodcutting.Listener=\u4f10\u6728(Woodcutting):
|
||||
Woodcutting.SkillName=\u4f10\u6728
|
||||
Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u6280\u80fd\u5df2\u7ed3\u675f**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u4f10\u6728\u6280\u80fd\u6fc0\u6d3b**
|
||||
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u4f10\u6728 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01
|
||||
Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u4f10\u6728\u6280\u80fd!
|
||||
Woodcutting.Skills.TreeFeller.Splinter=\u4f60\u7684\u65a7\u5934\u53d8\u6210\u4e86\u4e00\u5806\u788e\u7247\uff01
|
||||
Woodcutting.Skills.TreeFeller.Threshold=\u90a3\u68f5\u6811\u592a\u5927\u4e86!
|
||||
Woodcutting.Skillup=\u4f10\u6728\u6280\u80fd\u63d0\u5347 {0}. \u603b\u5171 ({1})
|
||||
Ability.Generic.Refresh=[[GREEN]]**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!**
|
||||
Ability.Generic.Template.Lock=[[GRAY]]{0}
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
Combat.ArrowDeflect=[[WHITE]]**\u7bad\u77e2\u504f\u5411**
|
||||
Combat.BeastLore=[[GREEN]]**\u9a6f\u517d\u77e5\u8bc6**
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]\u751f\u547d\u503c ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]\u62e5\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]**\u76ee\u6807\u88ab\u653e\u8840**
|
||||
Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86**
|
||||
Combat.TargetDazed=\u76ee\u6807\u88ab [[DARK_RED]]\u88ab\u51fb\u6655
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]\u5934\u6655\u76ee\u7729
|
||||
mcMMO.Description=[[DARK_AQUA]]\u5173\u4e8e [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO \u662f\u4e00\u4e2a [[RED]]\u5f00\u6e90[[GOLD]] RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,[[GOLD]]by [[BLUE]]com.gmail.nossr50[[GOLD]]. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,[[DARK_AQUA]]\u63d0\u793a:,[[GOLD]] - [[GREEN]]\u4f7f\u7528 [[RED]]/mcmmo help[[GREEN]] \u67e5\u770b\u6307\u4ee4,[[GOLD]] - [[GREEN]]\u8f93\u5165 [[RED]]/\u6280\u80fd\u540d[[GREEN]] \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,[[DARK_AQUA]]\u5f00\u53d1\u8005:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](\u521b\u59cb\u4eba),[[GOLD]] - [[GREEN]]GJ [[BLUE]](\u9879\u76ee\u7ec4\u957f),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](\u5f00\u53d1\u8005),[[DARK_AQUA]]\u6709\u7528\u7684\u94fe\u63a5:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] \u62a5\u544aBUG,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,[[YELLOW]]\u53c2\u4e0e\u8fc7\u7ffb\u8bd1\u4e0e\u6da6\u8272\u7684\u4eba[[DARK_AQUA]]:,[[GREEN]]hzk11o11k11o wolski Chikaze(Cirno) 664365842 zesty HDfunctions CNAmira,[[DARK_AQUA]]\u4fee\u6b63\u8865\u6f0f\u5de5\u4f5c\u8fd8\u5728\u7ee7\u7eed...
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]\u4f60\u7684\u6240\u6709\u7b49\u7ea7\u88ab\u5956\u52b1\u4e0a\u5347\u4e86 {0} \u7ea7!
|
||||
Commands.addlevels.AwardAll.2=\u6240\u6709\u6280\u80fd\u7b49\u7ea7\u5df2\u88ab\u8bbe\u7f6e\u4e3a {0}.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]\u4f60\u5728 {1} \u91cc\u5347\u4e86 {0} \u7ea7!
|
||||
Commands.addlevels.AwardSkill.2={0} \u56e0\u4e3a {1} \u800c\u88ab\u4fee\u6539.
|
||||
Commands.addxp.AwardAll=[[GREEN]]\u4f60\u7684\u6240\u6709\u6280\u80fd\u83b7\u5f97 {0} \u70b9\u7ecf\u9a8c!
|
||||
Commands.addxp.AwardSkill=[[GREEN]]\u4f60\u5728 {1} \u88ab\u5956\u52b1\u4e86 {0} \u70b9\u7ecf\u9a8c!
|
||||
Commands.Ability.Off=\u6280\u80fd\u4f7f\u7528 [[GREEN]]\u5173\u95ed
|
||||
Commands.Ability.On=\u6280\u80fd\u4f7f\u7528 [[GREEN]]\u5f00\u542f
|
||||
Commands.Ability.Toggle=\u6280\u80fd\u4f7f\u7528\u5df2\u5207\u6362\u4e3a [[YELLOW]]{0}
|
||||
Commands.AdminChat.Off=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f [[RED]]\u5173\u95ed
|
||||
Commands.AdminChat.On=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f [[GREEN]]\u5f00\u542f
|
||||
Commands.AdminToggle=- \u5207\u6362\u7ba1\u7406\u5458\u804a\u5929
|
||||
Commands.Chat.Console=*\u63a7\u5236\u53f0*
|
||||
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO \u80fd\u529b\u51b7\u5374[[GOLD]] =--
|
||||
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - \u5269\u4f59 [[GOLD]]{1} \u79d2
|
||||
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\u5df2\u5c31\u7eea\uff01
|
||||
Commands.Database.Cooldown=\u518d\u6b21\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u8fd8\u9700\u8981\u7b49\u5f851\u79d2.
|
||||
Commands.Disabled=\u8fd9\u4e2a\u6307\u4ee4\u88ab\u7981\u7528\u4e86.
|
||||
Commands.DoesNotExist=\u8be5\u540d\u73a9\u5bb6\u4e0d\u5b58\u5728\u4e8e\u6570\u636e\u5e93\u4e2d\uff01
|
||||
Commands.GodMode.Disabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u5173\u95ed
|
||||
Commands.GodMode.Enabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u5f00\u542f
|
||||
Commands.GodMode.Forbidden=[mcMMO] \u4e0a\u5e1d\u6a21\u5f0f\u4e0d\u5141\u8bb8\u5728\u8fd9\u4e2a\u4e16\u754c\u5f00\u542f (\u8be6\u60c5\u8bf7\u770b\u6743\u9650\u914d\u7f6e)
|
||||
Commands.GodMode.Toggle=\u4e0a\u5e1d\u6a21\u5f0f\u5df2\u5207\u6362\u4e3a [[YELLOW]]{0}
|
||||
Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a [[RED]]\u5fc3\u5f62[[WHITE]].
|
||||
Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a [[RED]]\u65b9\u5f62[[WHITE]].
|
||||
Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u6761\u663e\u793a\u5df2\u88ab [[GRAY]]\u7981\u7528[[WHITE]].
|
||||
Commands.Healthbars.Invalid=\u65e0\u6548\u7684\u8840\u6761\u7c7b\u578b!
|
||||
Commands.Inspect=<player> [[RED]]-\u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]\u63a5\u53d7\u9080\u8bf7,\u4f60\u6210\u4e3a\u4e86\u961f\u4f0d {0} \u4e2d\u7684\u4e00\u5458.
|
||||
Commands.Invite.Success=[[GREEN]]\u9080\u8bf7\u53d1\u9001\u6210\u529f.
|
||||
Commands.Leaderboards=<skill> <page> [[RED]]- \u6392\u884c\u699c
|
||||
Commands.mcc.Header=---[][[YELLOW]]mcMMO \u6307\u4ee4[[RED]][]---
|
||||
Commands.mcgod=- \u5207\u6362\u4e0a\u5e1d\u6a21\u5f0f
|
||||
Commands.mchud.Invalid=\u90a3\u5e76\u4e0d\u662f\u53ef\u7528\u7684HUD\u7c7b\u578b.
|
||||
Commands.mcpurge.Success=[[GREEN]]\u6570\u636e\u5df2\u91cd\u7f6e!
|
||||
Commands.mcrank.Heading=[[GOLD]]-=\u4e2a\u4eba\u6392\u540d=-
|
||||
Commands.mcrank.Overall=\u7efc\u5408[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{0}
|
||||
Commands.mcrank.Player=\u76ee\u6807: [[WHITE]]{0}
|
||||
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{1}
|
||||
Commands.mcrank.Unranked=[[WHITE]]\u65e0\u6392\u540d
|
||||
Commands.mcrefresh.Success={0} \u7684\u51b7\u5374\u65f6\u95f4\u5df2\u5237\u65b0
|
||||
Commands.mcremove.Success=[[GREEN]]{0} \u5df2\u4ece\u6570\u636e\u5e93\u4e2d\u6210\u529f\u79fb\u9664!
|
||||
Commands.mctop.Tip=[[GOLD]]\u63d0\u793a: \u4f7f\u7528 [[RED]]/mcrank[[GOLD]] \u6765\u67e5\u770b\u4f60\u6240\u6709\u7684\u4e2a\u4eba\u6392\u540d!
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u7f16\u8f91\u76ee\u6807
|
||||
Commands.mmoedit.AllSkills.1=[[GREEN]]\u4f60\u7684\u6240\u6709\u6280\u80fd\u7b49\u7ea7\u8bbe\u7f6e\u4e3a {0}!
|
||||
Commands.mmoedit.Modified.1=[[GREEN]]\u4f60\u7684\u7b49\u7ea7 {0} \u88ab\u8bbe\u7f6e\u4e3a {1}!
|
||||
Commands.mmoedit.Modified.2={0} \u5df2\u66f4\u6539\u4e3a {1}.
|
||||
Commands.mcconvert.Database.Same=\u4f60\u5df2\u7ecf\u5728\u4f7f\u7528 {0} \u6570\u636e\u5e93!
|
||||
Commands.mcconvert.Database.InvalidType={0} \u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6570\u636e\u5e93\u7c7b\u578b.
|
||||
Commands.mcconvert.Database.Start=[[GRAY]]\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u81f3{1}...
|
||||
Commands.mcconvert.Database.Finish=[[GRAY]]\u6570\u636e\u5e93\u8fc1\u79fb\u5b8c\u6210; {1}\u6570\u636e\u5e93\u73b0\u5728\u62e5\u6709{0}\u6570\u636e\u5e93\u7684\u6240\u6709\u6570\u636e.
|
||||
Commands.mmoshowdb=\u5f53\u524d\u4f7f\u7528\u7684\u6570\u636e\u5e93\u4e3a [[GREEN]]{0}
|
||||
Commands.mcconvert.Experience.Invalid=\u9519\u8bef\u7684\u516c\u5f0f\u7c7b\u578b! \u6709\u6548\u7c7b\u578b\u4e3a: [[GREEN]]\u7ebf\u6027 [[RED]]\u548c [[GREEN]]\u6307\u6570.
|
||||
Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528\u516c\u5f0f{0}
|
||||
Commands.mcconvert.Experience.Start=[[GRAY]]\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u5230{1}\u66f2\u7ebf
|
||||
Commands.mcconvert.Experience.Finish=[[GRAY]]\u516c\u5f0f\u8f6c\u6362\u5b8c\u6210; \u73b0\u5728\u4f7f\u7528 {0} \u7ecf\u9a8c\u66f2\u7ebf.
|
||||
Commands.ModDescription=- \u8bf7\u9605\u8bfb\u7b80\u8981\u63d2\u4ef6\u63cf\u8ff0
|
||||
Commands.NoConsole=\u8fd9\u4e2a\u6307\u4ee4\u4e0d\u652f\u6301\u5728\u63a7\u5236\u53f0\u4f7f\u7528.
|
||||
Commands.Notifications.Off=\u6280\u80fd\u63d0\u793a [[RED]]\u5173\u95ed
|
||||
Commands.Notifications.On=\u6280\u80fd\u63d0\u793a [[GREEN]]\u5f00\u542f
|
||||
Commands.Offline=\u8fd9\u4e2a\u6307\u4ee4\u5bf9\u79bb\u7ebf\u73a9\u5bb6\u65e0\u6548
|
||||
Commands.NotLoaded=\u73a9\u5bb6\u8d44\u6599\u5c1a\u672a\u52a0\u8f7d\u3002
|
||||
Commands.Other=[[GREEN]]--\u5176\u4ed6\u547d\u4ee4--
|
||||
Commands.Party.Header=-----[][[GREEN]]\u961f\u4f0d[[RED]][]-----
|
||||
Commands.Party.Features.Header=-----[][[GREEN]]\u529f\u80fd[[RED]][]-----
|
||||
Commands.Party.Status=[[DARK_GRAY]]\u540d\u5b57: [[WHITE]]{0} {1} [[DARK_GRAY]]\u7b49\u7ea7: [[DARK_AQUA]]{2}
|
||||
Commands.Party.Status.Alliance=[[DARK_GRAY]]\u540c\u76df: [[WHITE]]{0}
|
||||
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]\u5df2\u89e3\u9501\u529f\u80fd: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.ShareMode=[[DARK_GRAY]]\u5171\u4eab\u6a21\u5f0f:
|
||||
Commands.Party.ItemShare=[[GRAY]]\u7269\u54c1 [[DARK_AQUA]]({0})
|
||||
Commands.Party.ExpShare=[[GRAY]]\u7ecf\u9a8c [[DARK_AQUA]]({0})
|
||||
Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u7269\u54c1\u5206\u914d: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.MembersNear=[[DARK_GRAY]]\u4f60\u9644\u8fd1 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
|
||||
Commands.Party.Accept=- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7
|
||||
Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 [[RED]]\u5173\u95ed
|
||||
Commands.Party.Chat.On=\u56e2\u961f\u804a\u5929 [[GREEN]]\u5f00\u542f
|
||||
Commands.Party.Commands=[[GREEN]]--\u7ec4\u961f\u547d\u4ee4--
|
||||
Commands.Party.Invite.0=\u6ce8\u610f: [[GREEN]]\u4f60\u6536\u5230\u4e86\u4e00\u4e2a\u7ec4\u961f\u9080\u8bf7 {0} \u6765\u81ea {1}
|
||||
Commands.Party.Invite.1=\u8f93\u5165 [[GREEN]]/party accept[[YELLOW]] \u6765\u63a5\u53d7\u9080\u8bf7
|
||||
Commands.Party.Invite=- \u53d1\u9001\u7ec4\u961f\u9080\u8bf7
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]\u5df2\u63a5\u53d7\u7ec4\u961f\u9080\u8bf7\u3002\u60a8\u5df2\u7ecf\u52a0\u5165\u961f\u4f0d {0}
|
||||
Commands.Party.Join=[[GRAY]]\u52a0\u5165\u7684\u961f\u4f0d: {0}
|
||||
Commands.Party.Create=[[GRAY]]\u5df2\u521b\u5efa\u961f\u4f0d: {0}
|
||||
Commands.Party.Rename=[[GRAY]]\u961f\u4f0d\u540d\u53d8\u66f4\u4e3a: [[WHITE]]{0}
|
||||
Commands.Party.SetSharing=[[GRAY]]\u961f\u4f0d {0} \u5171\u4eab\u8bbe\u7f6e\u4e3a: [[DARK_AQUA]]{1}
|
||||
Commands.Party.ToggleShareCategory=[[GRAY]]\u961f\u4f0d\u7269\u54c1\u5206\u914d\u7531 [[GOLD]]{0} [[GRAY]] \u53d8\u4e3a [[DARK_AQUA]]{1}
|
||||
Commands.Party.AlreadyExists=[[DARK_RED]]\u961f\u4f0d {0} \u5df2\u5b58\u5728!
|
||||
Commands.Party.Kick=\u4f60\u5df2\u88ab {0} \u8e22\u51fa!
|
||||
Commands.Party.Leave=\u4f60\u79bb\u5f00\u4e86\u8fd9\u652f\u961f\u4f0d
|
||||
Commands.Party.Members.Header=-----[][[GREEN]]\u6210\u5458[[RED]][]-----
|
||||
Commands.Party.None=\u4f60\u4e0d\u5728\u961f\u4f0d\u4e2d.
|
||||
Commands.Party.Quit=- \u79bb\u5f00\u4f60\u73b0\u6709\u7684\u961f\u4f0d
|
||||
Commands.Party.Teleport=<player> [[RED]]- \u4f20\u9001\u5230\u961f\u4f0d\u6210\u5458
|
||||
Commands.Party.Toggle=- \u5207\u6362\u961f\u4f0d\u804a\u5929
|
||||
Commands.Party1=- \u521b\u5efa\u4e00\u4e2a\u65b0\u961f\u4f0d
|
||||
Commands.Party2=- \u52a0\u5165\u4e00\u4e2a\u73a9\u5bb6\u7684\u961f\u4f0d
|
||||
Commands.Party.Alliance.Header=-----[][[GREEN]]\u961f\u4f0d\u540c\u76df[[RED]][]-----
|
||||
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u540c\u76df\u6709: [[WHITE]]{1}
|
||||
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]\u540c\u76df\u6210\u5458[[RED]][]-----
|
||||
Commands.Party.Alliance.Invite.0=\u8b66\u544a: [[GREEN]]\u60a8\u4ece {1} \u6536\u5230\u961f\u4f0d\u540c\u76df\u9080\u8bf7\u6765 {0}
|
||||
Commands.Party.Alliance.Invite.1=\u8f93\u5165 [[GREEN]]/party alliance accept[[YELLOW]] \u6765\u63a5\u53d7\u9080\u8bf7
|
||||
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]\u5df2\u63a5\u53d7\u540c\u76df\u9080\u8bf7\u3002
|
||||
Commands.Party.Alliance.None=\u60a8\u6ca1\u6709\u540c\u76df\u3002
|
||||
Commands.Party.Alliance.AlreadyAllies=\u60a8\u7684\u961f\u4f0d\u5df2\u7ecf\u6709\u4e00\u4e2a\u540c\u76df\u3002\u4f7f\u7528 [[DARK_AQUA]]/party alliance disband [[RED]]\u6765\u89e3\u6563
|
||||
Commands.Party.Alliance.Help.0=\u8fd9\u4e2a\u961f\u4f0d\u6ca1\u6709\u7ec4\u6210\u540c\u76df\uff0c\u4f7f\u7528 [[DARK_AQUA]]/party alliance invite <player>[[RED]] \u9080\u8bf7
|
||||
Commands.Party.Alliance.Help.1=\u5b83\u7684\u961f\u957f\u6765\u7ed3\u76df\u3002
|
||||
Commands.ptp.Enabled=\u961f\u4f0d\u4f20\u9001 [[GREEN]]\u542f\u7528
|
||||
Commands.ptp.Disabled=\u961f\u4f0d\u4f20\u9001 [[RED]]\u7981\u7528
|
||||
Commands.ptp.NoRequests=\u5f53\u524d\u6ca1\u6709\u4f20\u9001\u8bf7\u6c42
|
||||
Commands.ptp.NoWorldPermissions=[mcMMO] \u4f60\u6ca1\u6709\u6743\u9650\u4f20\u9001\u5230\u4e16\u754c {0}.
|
||||
Commands.ptp.Request1={0} [[GREEN]]\u5df2\u7ecf\u5411\u4f60\u53d1\u51fa\u8bf7\u6c42\u4f20\u9001
|
||||
Commands.ptp.Request2=[[GREEN]]\u540c\u610f\u4f20\u9001\u8f93\u5165 [[YELLOW]]/ptp accept. [[GREEN]]\u8bf7\u6c42\u5c06\u5728 [[RED]]{0} [[GREEN]] \u79d2\u540e\u5931\u6548
|
||||
Commands.ptp.AcceptAny.Enabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 [[GREEN]]\u542f\u7528
|
||||
Commands.ptp.AcceptAny.Disabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 [[RED]]\u7981\u7528
|
||||
Commands.ptp.RequestExpired=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u5df2\u5931\u6548!
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] \u6218\u6597\u529b [[YELLOW]]\u6392\u884c\u699c--
|
||||
Commands.PowerLevel.Capped=[[DARK_RED]]\u6218\u6597\u529b: [[GREEN]]{0} [[DARK_RED]]\u6700\u9ad8\u7b49\u7ea7: [[YELLOW]]{1}
|
||||
Commands.PowerLevel=[[DARK_RED]]\u6218\u6597\u529b: [[GREEN]]{0}
|
||||
Commands.Reset.All=[[GREEN]]\u4f60\u7684\u6280\u672f\u6c34\u5e73\u5df2\u590d\u4f4d\u6210\u529f.
|
||||
Commands.Reset.Single=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e.
|
||||
Commands.Reset=\u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5df2\u6e05\u7a7a\u3002
|
||||
Commands.Scoreboard.NoBoard=mcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b\u3002
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]\u3002
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5c06\u5728 [[GOLD]]{0}[[DARK_AQUA]] \u79d2\u540e\u6e05\u7a7a\u3002
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[RED]]/mcscoreboard [[GREEN]]\u5e2e\u52a9[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - \u6e05\u7a7a mcMMO \u8bb0\u5206\u677f
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - \u4fdd\u6301 mcMMO \u8bb0\u5206\u677f\u60ac\u505c
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - [[LIGHT_PURPLE]]n[[WHITE]] \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 [[RED]]/mcscoreboard keep[[GOLD]] \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]\u63d0\u793a: \u4f7f\u7528 [[RED]]/mcscoreboard clear[[GOLD]] \u6765\u5173\u95ed\u8ba1\u5206\u677f\u3002
|
||||
Commands.Skill.Invalid=\u8fd9\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6280\u80fd\u540d\u5b57!
|
||||
Commands.Skill.ChildSkill=\u5b50\u6280\u80fd\u5bf9\u8be5\u547d\u4ee4\u65e0\u6548\uff01
|
||||
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \u6392\u884c\u699c--
|
||||
Commands.SkillInfo=- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f
|
||||
Commands.Stats.Self=\u4f60\u7684\u4fe1\u606f
|
||||
Commands.Stats=- \u67e5\u770b\u4f60\u7684mcMMO\u7edf\u8ba1\u4fe1\u606f
|
||||
Commands.ToggleAbility=- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f
|
||||
Commands.Usage.0=\u6b63\u786e\u7684\u7528\u6cd5 /{0}
|
||||
Commands.Usage.1=\u6b63\u786e\u7684\u7528\u6cd5\u5e94\u4e3a /{0} {1}
|
||||
Commands.Usage.2=\u6b63\u786e\u7684\u7528\u6cd5 /{0} {1} {2}
|
||||
Commands.Usage.3=\u6b63\u786e\u7684\u7528\u6cd5 /{0} {1} {2} {3}
|
||||
Commands.Usage.FullClassName=\u6570\u636e\u7c7b\u578b
|
||||
Commands.Usage.Level=\u7b49\u7ea7
|
||||
Commands.Usage.Message=\u6d88\u606f
|
||||
Commands.Usage.Page=\u9875
|
||||
Commands.Usage.PartyName=\u540d\u79f0
|
||||
Commands.Usage.Password=\u5bc6\u7801
|
||||
Commands.Usage.Player=\u73a9\u5bb6
|
||||
Commands.Usage.Rate=\u6bd4\u7387
|
||||
Commands.Usage.Skill=\u6280\u80fd
|
||||
Commands.Usage.XP=\u7ecf\u9a8c\u503c
|
||||
mcMMO.NoInvites=\u4f60\u73b0\u5728\u6ca1\u6709\u6536\u5230\u4efb\u4f55\u9080\u8bf7
|
||||
mcMMO.NoPermission=[[DARK_RED]]\u6743\u9650\u4e0d\u8db3.
|
||||
mcMMO.NoSkillNote=[[DARK_GRAY]]\u5982\u679c\u4f60\u6ca1\u6709\u67d0\u4e2a\u6280\u80fd\u7684\u4f7f\u7528\u6743\u9650\u90a3\u4e48\u4ed6\u5c06\u4e0d\u4f1a\u5728\u8fd9\u91cc\u663e\u793a.
|
||||
Party.Forbidden=[mcMMO] \u961f\u4f0d\u529f\u80fd\u4e0d\u5141\u8bb8\u5728\u8fd9\u4e2a\u4e16\u754c\u5f00\u542f (\u8be6\u60c5\u8bf7\u770b\u6743\u9650\u914d\u7f6e)
|
||||
Party.Help.0=\u6b63\u786e\u7684\u7528\u6cd5 [[DARK_AQUA]]{0} <player> [password].
|
||||
Party.Help.1=\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0} <name> [password].
|
||||
Party.Help.2=\u67e5\u9605 [[DARK_AQUA]]{0} [[RED]]\u83b7\u53d6\u66f4\u591a\u4fe1\u606f
|
||||
Party.Help.3=\u4f7f\u7528 [[DARK_AQUA]]{0} <player> [password] [[RED]]\u52a0\u5165\u6216 [[DARK_AQUA]]{1} [[RED]]\u9000\u51fa
|
||||
Party.Help.4=\u9501\u5b9a\u6216\u89e3\u9501\u4f60\u7684\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0}
|
||||
Party.Help.5=\u8bbe\u7f6e\u961f\u4f0d\u5bc6\u7801, \u4f7f\u7528 [[DARK_AQUA]]{0} <password>
|
||||
Party.Help.6=\u4ece\u4f60\u7684\u961f\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6, \u4f7f\u7528 [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.7=\u79fb\u4ea4\u961f\u957f, \u4f7f\u7528 [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.8=\u89e3\u6563\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0}
|
||||
Party.Help.9=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u6765\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7269\u54c1
|
||||
Party.Help.10=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u5f00\u542f\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7ecf\u9a8c
|
||||
Party.InformedOnJoin={0} [[GREEN]]\u5df2\u7ecf\u52a0\u5165\u4f60\u7684\u961f\u4f0d
|
||||
Party.InformedOnQuit={0} [[GREEN]]\u79bb\u5f00\u4e86\u961f\u4f0d
|
||||
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u5df2\u8bbe\u7f6e\u961f\u4f0d\u540d\u4e3a [[WHITE]]{1}
|
||||
Party.InvalidName=[[DARK_RED]]\u90a3\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u961f\u4f0d\u540d\u5b57.
|
||||
Party.Invite.Self=\u4f60\u4e0d\u80fd\u9080\u8bf7\u81ea\u5df1!
|
||||
Party.IsLocked=\u8fd9\u4e2a\u961f\u4f0d\u5df2\u7ecf\u9501\u5b9a!
|
||||
Party.IsntLocked=\u8fd9\u4e2a\u961f\u4f0d\u5e76\u6ca1\u6709\u9501\u5b9a!
|
||||
Party.Locked=\u961f\u4f0d\u88ab\u9501\u5b9a, \u53ea\u6709\u961f\u957f\u53ef\u4ee5\u9080\u8bf7.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} \u4f60\u4e0d\u5728\u4f60\u7684\u56e2\u961f
|
||||
Party.NotOwner=[[DARK_RED]]\u4f60\u4e0d\u662f\u961f\u957f
|
||||
Party.Target.NotOwner=[[DARK_RED]]{0} \u4e0d\u662f\u961f\u957f\u3002
|
||||
Party.Owner.New=[[GREEN]]{0} \u73b0\u5728\u662f\u65b0\u7684\u6d3e\u7cfb\u9886\u961f.
|
||||
Party.Owner.NotLeader=[[DARK_RED]]\u4f60\u5df2\u7ecf\u4e0d\u518d\u662f\u6d3e\u7cfb\u5185\u7684\u9886\u961f.
|
||||
Party.Owner.Player=[[GREEN]]\u4f60\u73b0\u5728\u4e0d\u662f\u961f\u957f\u4e86
|
||||
Party.Password.None=\u52a0\u5165\u8fd9\u4e2a\u961f\u4f0d\u9700\u8981\u5bc6\u7801. \u8bf7\u63d0\u4f9b\u5bc6\u7801\u518d\u52a0\u5165
|
||||
Party.Password.Incorrect=\u961f\u4f0d\u5bc6\u7801\u9519\u8bef
|
||||
Party.Password.Set=[[GREEN]]\u961f\u4f0d\u5bc6\u7801\u8bbe\u7f6e\u4e3a {0}
|
||||
Party.Password.Removed=[[GREEN]]\u961f\u4f0d\u5bc6\u7801\u5df2\u88ab\u6e05\u9664
|
||||
Party.Player.Invalid=\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6
|
||||
Party.NotOnline=[[DARK_RED]]{0} \u4e0d\u5728\u7ebf!
|
||||
Party.Player.InSameParty={0} \u5df2\u7ecf\u5728\u961f\u4f0d\u4e2d!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} \u4e0d\u5728\u961f\u4f0d\u91cc
|
||||
Party.Specify=\u4f60\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u961f\u4f0d
|
||||
Party.Teleport.Dead=\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9
|
||||
Party.Teleport.Hurt=\u4f60\u53d7\u5230\u4f24\u5bb3, \u81f3\u5c11 {0} \u79d2\u5185\u4e0d\u80fd\u4f20\u9001
|
||||
Party.Teleport.Player=[[GREEN]]\u4f60\u5df2\u7ecf\u4f20\u9001\u5230 {0}.
|
||||
Party.Teleport.Self=\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u91cc!
|
||||
Party.Teleport.Target=[[GREEN]]{0} \u5df2\u7ecf\u4f20\u9001\u5230\u4f60\u8eab\u8fb9.
|
||||
Party.Teleport.Disabled={0} \u4e0d\u5141\u8bb8\u961f\u4f0d\u4f20\u9001
|
||||
Party.Rename.Same=\u8fd9\u5df2\u7ecf\u662f\u4f60\u7684\u961f\u4f0d\u540d\u5b57\u4e86!
|
||||
Party.Join.Self=\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1!
|
||||
Party.Unlocked=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u9501
|
||||
Party.Disband=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u6563
|
||||
Party.Alliance.Formed=[[GRAY]]\u60a8\u7684\u961f\u4f0d\u5f53\u524d\u4e0e [[GREEN]]{0} [[GRAY]]\u7ed3\u76df
|
||||
Party.Alliance.Disband=[[GRAY]]\u60a8\u7684\u961f\u4f0d\u4e0d\u518d\u4e0e [[RED]]{0} [[GRAY]]\u7ed3\u76df
|
||||
Party.Status.Locked=[[DARK_RED]](\u4ec5\u9080\u8bf7)
|
||||
Party.Status.Unlocked=[[DARK_GREEN]](\u5f00\u542f)
|
||||
Party.LevelUp=\u961f\u4f0d\u7b49\u7ea7\u63d0\u5347 {0} \u7ea7. \u603b\u8ba1 ({1})
|
||||
Party.Feature.Chat=\u961f\u4f0d\u804a\u5929
|
||||
Party.Feature.Teleport=\u961f\u4f0d\u4f20\u9001
|
||||
Party.Feature.Alliance=\u540c\u76df
|
||||
Party.Feature.ItemShare=\u7269\u54c1\u5171\u4eab
|
||||
Party.Feature.XpShare=\u7ecf\u9a8c\u5171\u4eab
|
||||
Party.Feature.Locked.Chat=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ \u7ea7(\u961f\u4f0d\u804a\u5929)
|
||||
Party.Feature.Locked.Teleport=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u961f\u4f0d\u4f20\u9001)
|
||||
Party.Feature.Locked.Alliance=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u540c\u76df)
|
||||
Party.Feature.Locked.ItemShare=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u7269\u54c1\u5171\u4eab)
|
||||
Party.Feature.Locked.XpShare=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u7ecf\u9a8c\u5171\u4eab)
|
||||
Party.Feature.Disabled.1=\u961f\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9501\u3002
|
||||
Party.Feature.Disabled.2=\u961f\u4f0d\u4f20\u9001\u5c1a\u672a\u89e3\u9501\u3002
|
||||
Party.Feature.Disabled.3=\u961f\u4f0d\u540c\u76df\u5c1a\u672a\u89e3\u9501\u3002
|
||||
Party.Feature.Disabled.4=\u961f\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002
|
||||
Party.Feature.Disabled.5=\u961f\u4f0d\u7ecf\u9a8c\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002
|
||||
Party.ShareType.Xp=\u7ecf\u9a8c
|
||||
Party.ShareType.Item=\u7269\u54c1
|
||||
Party.ShareMode.None=\u65e0
|
||||
Party.ShareMode.Equal=\u5747\u5206
|
||||
Party.ShareMode.Random=\u968f\u673a
|
||||
Party.ItemShare.Category.Loot=\u63a0\u593a
|
||||
Party.ItemShare.Category.Mining=\u6316\u77ff
|
||||
Party.ItemShare.Category.Herbalism=\u8349\u836f\u5b66
|
||||
Party.ItemShare.Category.Woodcutting=\u4f10\u6728
|
||||
Party.ItemShare.Category.Misc=\u6742\u9879
|
||||
Commands.XPGain.Acrobatics=\u6389\u843d
|
||||
Commands.XPGain.Alchemy=\u917f\u9020\u836f\u6c34
|
||||
Commands.XPGain.Archery=\u7a7a\u624b\u653b\u51fb\u602a\u7269
|
||||
Commands.XPGain.Axes=\u653b\u51fb\u602a\u7269
|
||||
Commands.XPGain.Child=\u4ece\u4e3b\u6280\u80fd\u83b7\u53d6\u7b49\u7ea7
|
||||
Commands.XPGain.Excavation=\u6316\u5230\u5b9d\u7269
|
||||
Commands.XPGain.Fishing=\u9493\u9c7c (\u53bb\u60f3\u60f3\u5427\uff01)
|
||||
Commands.XPGain.Herbalism=\u6536\u83b7\u4f5c\u7269
|
||||
Commands.XPGain.Mining=\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269
|
||||
Commands.XPGain.Repair=\u4fee\u7406
|
||||
Commands.XPGain.Swords=\u653b\u51fb\u602a\u7269
|
||||
Commands.XPGain.Taming=\u9a6f\u517d, \u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6218\u6597
|
||||
Commands.XPGain.Unarmed=\u653b\u51fb\u602a\u7269
|
||||
Commands.XPGain.Woodcutting=\u6b63\u5728\u780d\u5012\u6811\u6728
|
||||
Commands.XPGain=[[DARK_GRAY]]\u83b7\u5f97\u7ecf\u9a8c: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]\u4f60\u7684\u7ecf\u9a8c\u6761\u9501\u5b9a\u5728 {0}!
|
||||
Commands.xplock.unlocked=[[GOLD]]\u4f60\u7684\u7ecf\u9a8c\u6761\u73b0\u5728 [[GREEN]]\u89e3\u9664\u9501\u5b9a\u4e86[[GOLD]]!
|
||||
Commands.xprate.modified=\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0}
|
||||
Commands.xprate.over=mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!!
|
||||
Commands.xprate.proper.0=\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate <integer> <true/false>
|
||||
Commands.xprate.proper.1=\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset
|
||||
Commands.xprate.proper.2=\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u4e8b\u4ef6
|
||||
Commands.xprate.started.0=[[GOLD]] mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u5df2\u5f00\u59cb!
|
||||
Commands.xprate.started.1=[[GOLD]]mcMMO \u7ecf\u9a8c\u83b7\u53d6\u7387\u73b0\u5728\u4e3a {0}x!
|
||||
XPRate.Event=[[GOLD]]mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d
|
||||
Effects.Effects=\u6548\u679c
|
||||
Effects.Child=[[DARK_GRAY]]\u7b49\u7ea7: [[GREEN]]{0}
|
||||
Effects.Level=[[DARK_GRAY]]\u7b49\u7ea7: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
|
||||
Effects.Parent=[[GOLD]]{0} -
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
Guides.Available=[[GRAY]]{0} \u7684\u5411\u5bfc - \u8f93\u5165/{1} ? [\u9875\u6570]
|
||||
Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u5411\u5bfc[[GOLD]]=-
|
||||
Guides.Page.Invalid=\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u9875\u6570!
|
||||
Guides.Page.OutOfRange=\u90a3\u9875\u4e0d\u5b58\u5728, \u603b\u5171\u53ea\u6709 {0} \u9875
|
||||
Guides.Usage=\u7528\u6cd5 /{0} ? [\u9875\u6570]
|
||||
Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u6742\u6280:\n[[YELLOW]]\u6742\u6280\u662f mcMMO \u4e2d\u4f18\u96c5\u79fb\u52a8\u7684\u827a\u672f\u3002\n[[YELLOW]]\u5b83\u63d0\u4f9b\u4e86\u6218\u6597\u52a0\u6210\u548c\u73af\u5883\u4f24\u5bb3\u52a0\u6210\u3002\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u83b7\u53d6:\n[[YELLOW]]\u901a\u8fc7\u5728\u6218\u6597\u4e2d\u95ea\u907f\u6216\u8005\u4ece\u9ad8\u5904\n[[YELLOW]]\u8dcc\u843d\u65f6\u53d7\u4f24\u5e76\u5e78\u5b58\u6765\u83b7\u5f97\u7ecf\u9a8c\u3002
|
||||
Guides.Acrobatics.Section.1=[[DARK_AQUA]]\u7ffb\u6eda\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u5f53\u60a8\u53d7\u5230\u8dcc\u843d\u4f24\u5bb3\u65f6\u60a8\u6709\u88ab\u52a8\u673a\u4f1a\u6765\u514d\u53d7\u4f24\u5bb3\u3002\n[[YELLOW]]\u60a8\u53ef\u4ee5\u5728\u8dcc\u843d\u4e2d\u6309\u4f4f\u6f5c\u884c\u952e\u6765\u63d0\u5347\u89e6\u53d1\u51e0\u7387\u3002\n[[YELLOW]]\u8fd9\u5c06\u89e6\u53d1\u4e00\u4e2a\u4f18\u96c5\u5730\u7ffb\u6eda\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6eda\u3002\n[[YELLOW]]\u4f18\u96c5\u5730\u7ffb\u6eda\u7c7b\u4f3c\u666e\u901a\u7684\u7ffb\u6eda\u4f46\u662f\u5b83\u6709\u53cc\u500d\u51e0\u7387\n[[YELLOW]]\u53d1\u751f\uff0c\u5e76\u4e14\u80fd\u591f\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6eda\u66f4\u9ad8\u7684\u4f24\u5bb3\u51cf\u514d\u3002\n[[YELLOW]]\u7ffb\u6eda\u51e0\u7387\u53d6\u51b3\u4e8e\u60a8\u7684\u6280\u80fd\u7b49\u7ea7
|
||||
Guides.Acrobatics.Section.2=[[DARK_AQUA]]\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\n[[YELLOW]]\u95ea\u907f\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4ed6\u5728\u4f60\u88ab\u653b\u51fb\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u88ab\u6fc0\u53d1\n[[YELLOW]]\u8fd9\u4e2a\u51e0\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u6709\u5173
|
||||
Guides.Alchemy.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u70bc\u91d1:\n[[YELLOW]]\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n[[YELLOW]]\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n[[YELLOW]]\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u83b7\u53d6\uff1a\n[[YELLOW]]\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002
|
||||
Guides.Alchemy.Section.1=[[DARK_AQUA]]\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n[[YELLOW]]\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n[[YELLOW]]\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002
|
||||
Guides.Alchemy.Section.2=[[DARK_AQUA]]\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u8ba2\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n[[YELLOW]]\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n[[YELLOW]]\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002
|
||||
Guides.Alchemy.Section.3=[[DARK_AQUA]]\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n[[YELLOW]]\u70c8\u7130\u7c89, \u53d1\u9175\u86db\u773c, \u6076\u9b42\u4e4b\u6cea, \u7ea2\u77f3,\n[[YELLOW]]\u8424\u77f3\u7c89, \u7cd6, \u95ea\u70c1\u7684\u897f\u74dc, \u91d1\u80e1\u841d\u535c,\n[[YELLOW]]\u5ca9\u6d46\u818f, \u5730\u72f1\u75a3, \u8718\u86db\u773c, \u706b\u836f, \u7761\u83b2,\n[[YELLOW]]\u6cb3\u8c5a\n[[YELLOW]](\u7eaf\u51c0\u836f\u6c34)
|
||||
Guides.Alchemy.Section.4=[[DARK_AQUA]]\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n[[YELLOW]]\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n[[YELLOW]]\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n[[YELLOW]]\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n[[YELLOW]]\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34)
|
||||
Guides.Alchemy.Section.5=[[DARK_AQUA]]\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n[[YELLOW]]\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n[[YELLOW]]\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n[[YELLOW]]\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n[[YELLOW]]\u58a8\u56ca (\u5931\u660e\u836f\u6c34)
|
||||
Guides.Alchemy.Section.6=[[DARK_AQUA]]\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n[[YELLOW]]\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n[[YELLOW]]\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n[[YELLOW]]\u666e\u901a\u91d1\u82f9\u679c (\u6297\u6027\u63d0\u5347\u836f\u6c34)
|
||||
Guides.Axes.Section.0=[[DARK_AQUA]]\u5173\u4e8e \u65a7\u6280:\n[[YELLOW]]\u6709\u4e86\u65a7\u5934\u6280\u80fd,\u65a7\u5b50\u4e0d\u518d\u53ea\u662f\u780d\u6811\u800c\u5df2.\n[[YELLOW]]\u4f60\u8fd8\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u6765\u8d5a\u53d6\u7ecf\u9a8c.\n[[YELLOW]]\u6253\u51fb\u751f\u7269\u65f6\u9644\u52a0\u51fb\u9000\u6548\u679c.\n[[YELLOW]]\u8fd8\u4f1a\u5bf9\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u4f24\u5bb3.\n[[YELLOW]]\u4f60\u7684\u65a7\u5b50\u4f1a\u50cf\u4f10\u6728\u673a\u4e00\u6837.\n[[YELLOW]]\u8f7b\u677e\u524a\u6389\u654c\u4eba\u7684\u62a4\u7532.\n[[YELLOW]]\u6548\u679c\u968f\u7740\u6280\u80fd\u7b49\u7ea7\u63d0\u9ad8.\n[[DARK_AQUA]]\u7ecf\u9a8c\u7684\u83b7\u53d6:\n[[YELLOW]]\u624b\u6301\u65a7\u5b50\u653b\u51fb\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6.
|
||||
Guides.Axes.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u65a9\u9996\u8005?\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u4f1a\u9020\u6210\u8303\u56f4\u6253\u51fb\u4f24\u5bb3\n[[YELLOW]]\u4f24\u5bb3\u7b49\u4e8e\u5bf9\u4e3b\u8981\u653b\u51fb\u76ee\u6807\u9020\u6210\u4f24\u5bb3\u768450%\n[[YELLOW]]\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269
|
||||
Guides.Axes.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u81f4\u547d\u4e00\u51fb?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4e00\u5b9a\u51e0\u7387\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3\n[[YELLOW]]\u9ed8\u8ba4\u6bcf2\u7ea7\u589e\u52a0 0.1%\n[[YELLOW]]\u5bf9\u751f\u7269\u9020\u62102\u500d\u4f24\u5bb3\n[[YELLOW]]\u5bf9\u73a9\u5bb6\u9020\u62101.5\u500d\u4f24\u5bb3
|
||||
Guides.Axes.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u65a7\u7cbe\u901a?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u9644\u52a0\u989d\u5916\u4f24\u5bb3\n[[YELLOW]]\u9ed8\u8ba4\u6bcf50\u7ea7\u989d\u5916\u63d0\u9ad81\u70b9\u4f24\u5bb3\n[[YELLOW]]4\u70b9\u989d\u5916\u4f24\u5bb3\u5c01\u9876
|
||||
Guides.Axes.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5f3a\u529b\u51b2\u51fb?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u4e00\u5b9a\u51e0\u7387\u7ed9\u654c\u4eba\u5e26\u6765\u5de8\u5927\u7684\u51b2\u51fb\u529b\n[[YELLOW]]\u9ed8\u8ba4\u51e0\u7387\u4e3a 25%\n[[YELLOW]]\u6548\u679c\u76f8\u5f53\u4e8e \u51fb\u9000 II \u7684\u9644\u9b54\u6548\u679c\n[[YELLOW]]\u6b64\u5916\u8fd8\u4f1a\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3
|
||||
Guides.Mining.Section.0=[[DARK_AQUA]]\u5173\u4e8e \u6316\u77ff:\n[[YELLOW]]\u5728\u6316\u77ff\u7684\u65f6\u5019,\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u63d0\u5347:\n[[YELLOW]]\u4f60\u5fc5\u987b\u4f7f\u7528\u9550\u5b50\u6316\u6389\u6709\u6548\u7684\u65b9\u5757\u624d\u80fd\u589e\u52a0\u672c\u6280\u80fd\u7684\u7ecf\u9a8c.
|
||||
Guides.Mining.Section.1=[[DARK_AQUA]]\u517c\u5bb9\u6750\u6599:\n[[YELLOW]]\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n[[YELLOW]]\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n[[YELLOW]]\u8424\u77f3,\u5730\u72f1\u5ca9.
|
||||
Guides.Mining.Section.2=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n[[YELLOW]]\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n[[YELLOW]]\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n[[YELLOW]]\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b.
|
||||
Guides.Mining.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n[[YELLOW]]\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n[[YELLOW]]\u5e76\u4e14\u5728\u6280\u80fd\u65f6\u95f4\u5185\u77ac\u95f4\u7834\u574f\u77f3\u5934\u548c\u77ff\u77f3
|
||||
Guides.Mining.Section.4=[[DARK_AQUA]\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n[[YELLOW]]\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n[[YELLOW]]\u5728\u4e00\u5b9a\u8ddd\u79bb\u5185\u53f3\u952e\u70b9\u51fbTNT,\u8fd9\u5c06\u4f1a\u4f7f\u5f97TNT\u5728\u77ac\u95f4\u5185\u7206\u70b8.
|
||||
Guides.Mining.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n[[YELLOW]]\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n[[YELLOW]]\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n[[YELLOW]]\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n[[YELLOW]]\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n[[YELLOW]]\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n[[YELLOW]]\u7206\u7834\u5f00\u91c7:\u4f7f\u4f60\u70b9\u71c3\u7684TNT\u70b8\u4e0b\u8303\u56f4\u5185\u4e00\u5b9a\u6570\u91cf\u7684\u77ff\u77f3
|
||||
Guides.Repair.Section.1=[[DARK_AQUA]]\u6211\u600e\u4e48\u624d\u80fd\u4fee\u7406?\n[[YELLOW]]\u653e\u7f6e\u4e00\u4e2a mcMMO \u7684\u94c1\u7827\u5e76\u4e14\u70b9\u51fb\u53f3\u952e\u6765\u4fee\u7406.\n[[YELLOW]]\u4f60\u76ee\u524d\u62ff\u5728\u624b\u4e0a\u7684\u7269\u54c1,\u6bcf\u70b9\u51fb\u4e00\u6b21\u6d88\u8017\u4e00\u4e2a\u7269\u54c1.
|
||||
Guides.Repair.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u8d85\u7ea7\u4fee\u7406?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u5f53\u73a9\u5bb6\u8fdb\u884c\u4fee\u7406\u65f6\u4f1a\u6062\u590d\u53cc\u500d\u7684\u8010\u4e45
|
||||
Guides.Swords.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u5251\u672f:\n[[YELLOW]]\u5251\u672f\u8ba9\u73a9\u5bb6\u5728\u4f7f\u7528\u5251\u6218\u6597\u65f6\u83b7\u5f97\u989d\u5916\u52a0\u6210\u6548\u679c.\n\n[[DARK_AQUA]]\u5982\u4f55\u83b7\u53d6\u7ecf\u9a8c:\n[[YELLOW]]\u8981\u83b7\u53d6\u7ecf\u9a8c\u4f60\u5fc5\u987b\u7528\u5251\u653b\u51fb\u654c\u4eba.
|
||||
Guides.Swords.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5229\u5203\u7a81\u523a?\n[[YELLOW]]\u5229\u5203\u7a81\u523a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd.\n[[YELLOW]]\u4f60\u53ef\u4ee5\u5c06\u62ff\u5728\u624b\u4e0a\u7684\u5251\u6309\u4e0b\u53f3\u952e\u6765\u542f\u52a8\u5b83.\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u5c06\u9020\u621025%\u7684\u989d\u5916\u8303\u56f4\u4f24\u5bb3\n[[YELLOW]]\u5e76\u4e14\u9644\u5e26\u81f3\u5c115\u4e2aticks\u7684\u653e\u8840\u6548\u679c
|
||||
Guides.Swords.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u53cd\u51fb?\n[[YELLOW]]\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5f53\u683c\u6863\u602a\u7269\u6240\u9020\u6210\u7684\u4f24\u5bb3\u65f6\n[[YELLOW]]\u4f60\u6709\u673a\u4f1a\u53cd\u5c0450%\u6240\u53d7\u5230\u7684\u4f24\u5bb3
|
||||
Guides.Swords.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u653e\u8840?\n[[YELLOW]]\u653e\u8840\u5c06\u9020\u6210\u654c\u4eba\u6bcf\u4e24\u79d2\u949f\u53d7\u5230\u4f24\u5bb3\n[[YELLOW]]\u76ee\u6807\u4e0d\u505c\u7684\u6d41\u8840\u76f4\u5230\u6548\u679c\u7ed3\u675f\u6216\u662f\u6b7b\u4ea1\n[[YELLOW]]\u653e\u8840\u7684\u65f6\u95f4\u968f\u7740\u4f60\u7684\u5251\u672f\u7684\u63d0\u5347\u800c\u589e\u52a0
|
||||
Guides.Smelting.Section.0=\u5373\u5c06\u5230\u6765...
|
||||
Guides.Taming.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u5524?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5b83\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc,\u8c79\u732b\u6216\u8005\u9a6c\u5230\u4f60\u8eab\u8fb9\n[[YELLOW]]\u624b\u6301\u9aa8\u5934,\u751f\u9c7c\u6216\u82f9\u679c\u6765\u8fdb\u884c\u53ec\u5524
|
||||
Guides.Taming.Section.8=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u653b\u51fb\u65f6\u6062\u590d\u72fc\u7684\u751f\u547d\u503c
|
||||
Inspect.Offline=\u4f60\u6ca1\u6709\u67e5\u8be2\u4e0d\u5728\u7ebf\u73a9\u5bb6\u4fe1\u606f\u7684\u6743\u9650!
|
||||
Inspect.OfflineStats=\u4e0d\u5728\u7ebf\u73a9\u5bb6\u7684mcmmo\u7edf\u8ba1\u4fe1\u606f [[YELLOW]]{0}
|
||||
Inspect.Stats={0} [[GREEN]]\u7684 mcMMO \u7edf\u8ba1\u4fe1\u606f
|
||||
Inspect.TooFar=\u4f60\u65e0\u6cd5\u68c0\u67e5\u90a3\u4e2a\u73a9\u5bb6\u56e0\u4e3a\u4f60\u4eec\u8ddd\u79bb\u592a\u8fdc\u4e86!
|
||||
Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u5931\u8d25\u4e86!**
|
||||
Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc**
|
||||
Item.ChimaeraWing.Name=\u5947\u7f8e\u62c9\u4e4b\u7ffc
|
||||
Item.ChimaeraWing.Lore=[[GRAY]]\u4f20\u9001\u81f3\u4f60\u7684\u5e8a.
|
||||
Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u518d\u6b21\u4f7f\u7528! [[YELLOW]]({0}s)
|
||||
Item.Injured.Wait=\u4f60\u6700\u8fd1\u53d7\u4f24\u4e86\u6240\u4ee5\u4f60\u5fc5\u987b\u7b49\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u4f7f\u7528\u8fd9\u4e2a. [[YELLOW]]({0}s)
|
||||
Item.FluxPickaxe.Name=\u707c\u70ed\u4e4b\u9550
|
||||
Item.FluxPickaxe.Lore.1=[[GRAY]]\u6709\u51e0\u7387\u77ac\u95f4\u7194\u70bc\u77ff\u7269\u3002
|
||||
Item.FluxPickaxe.Lore.2=[[GRAY]]\u9700\u8981\u7194\u70bc\u7b49\u7ea7 {0}+
|
||||
Teleport.Commencing=[[GRAY]]\u4f20\u9001\u5c06\u5728 [[GOLD]]({0}) [[GRAY]] \u79d2\u540e\u8fdb\u884c, \u8bf7\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52a8...
|
||||
Teleport.Cancelled=[[DARK_RED]]\u4f20\u9001\u5df2\u53d6\u6d88!
|
||||
Skills.Child=[[GOLD]](\u5206\u652f\u6280\u80fd)
|
||||
Skills.Disarmed=[[DARK_RED]]\u4f60\u88ab\u7f34\u68b0\u4e86!
|
||||
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
|
||||
Skills.NeedMore=[[DARK_RED]]\u4f60\u9700\u8981\u66f4\u591a\u7684 [[GRAY]]{0}
|
||||
Skills.Parents=\u4e3b\u6280\u80fd
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.ChildStats={0}[[GREEN]]{1}
|
||||
Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.[[YELLOW]]({0}s)
|
||||
Skills.Cancelled={0} \u5df2\u53d6\u6d88!
|
||||
Skills.ConfirmOrCancel=[[GREEN]]\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a [[GOLD]]{0}[[GREEN]]. \u5de6\u952e\u53d6\u6d88.
|
||||
Stats.Header.Combat=[[GOLD]]-=\u683c\u6597\u6280\u80fd=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=\u91c7\u96c6\u6280\u80fd=-
|
||||
Stats.Header.Misc=[[GOLD]]-=\u6742\u9879\u6280\u80fd=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] \u7edf\u8ba1\u4fe1\u606f
|
||||
Perks.XP.Name=\u7ecf\u9a8c
|
||||
Perks.XP.Desc=\u83b7\u5f97 {0}x \u7ecf\u9a8c.
|
||||
Perks.Lucky.Name=\u5e78\u8fd0
|
||||
Perks.Lucky.Desc=\u7ed9\u4e88 {0} \u6280\u80fd\u548c\u80fd\u529b33.3%\u7684\u66f4\u9ad8\u51e0\u7387\u89e6\u53d1
|
||||
Perks.Lucky.Desc.Login=\u7ed9\u4e88\u6280\u80fd\u548c\u80fd\u529b33.3%\u5f97\u66f4\u9ad8\u51e0\u7387\u89e6\u53d1
|
||||
Perks.Lucky.Bonus=[[GOLD]] ({0} \u7684\u597d\u8fd0\u52a0\u6210)
|
||||
Perks.Cooldowns.Name=\u5feb\u901f\u6062\u590d
|
||||
Perks.Cooldowns.Desc=\u51cf\u5c11\u51b7\u5374\u65f6\u95f4 {0}.
|
||||
Perks.ActivationTime.Name=\u8010\u529b
|
||||
Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b\u6fc0\u6d3b\u65f6\u95f4 {0} \u79d2.
|
||||
Perks.ActivationTime.Bonus=[[GOLD]] ({0} \u79d2\u989d\u5916\u6301\u7eed\u65f6\u95f4)
|
||||
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u5173\u95ed. {1}
|
||||
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u542f\u7528. {1}
|
||||
Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a
|
||||
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\u6b7b\u4ea1,\u4f60\u5931\u53bb\u4e86 [[BLUE]]{0}[[DARK_RED]].
|
||||
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \u72b6\u6001\u9057\u5931\u7387\u53d8\u66f4\u4e3a {0}.
|
||||
Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f
|
||||
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u592a\u4e0d\u719f\u7ec3\u6388\u4e88\u4f60\u83b7\u5f97\u4efb\u4f55\u7684\u77e5\u8bc6.
|
||||
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u4f60\u4ece[[YELLOW]]{1}[[DARK_AQUA]]\u90a3\u5077\u53d6\u4e86[[BLUE]]{0}[[DARK_AQUA]]\u4e2a\u7b49\u7ea7.
|
||||
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u65e0\u6cd5\u4ece\u4f60\u8fd9\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8bc6!
|
||||
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]]\u4ece\u4f60\u8fd9\u5077\u53d6\u4e86[[BLUE]]{1}[[DARK_RED]]\u4e2a\u7b49\u7ea7!
|
||||
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u72b6\u6001\u5438\u6536\u7387\u53d8\u66f4\u4e3a {0}.
|
||||
MOTD.Donate=[[DARK_AQUA]]\u6350\u8d60\u4fe1\u606f:
|
||||
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u786c\u6838\u6a21\u5f0f\u5df2\u542f\u7528: [[DARK_RED]]{0}
|
||||
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a: [[DARK_RED]]{0}%
|
||||
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Vampirism\u7edf\u8ba1: [[DARK_RED]]{0}%
|
||||
MOTD.PerksPrefix=[mcMMO \u80fd\u529b]
|
||||
MOTD.Version=[[GOLD]][mcMMO] \u6b63\u5728\u8fd0\u884c\u7248\u672c [[DARK_AQUA]]{0}
|
||||
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u7f51\u5740
|
||||
Smelting.Ability.FluxMining=\u70bd\u70ed\u7684\u9550\u5b50\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
|
||||
Smelting.Ability.FuelEfficiency=\u71c3\u6599\u6548\u7387\u52a0\u500d: [[YELLOW]]{0}x
|
||||
Smelting.Ability.Locked.0={0}+ \u7ea7\u540e\u89e3\u9501 (\u66f4\u591a\u51b6\u70bc\u7ecf\u9a8c\u7403)
|
||||
Smelting.Ability.Locked.1={0}+ \u7ea7\u540e\u89e3\u9501 (FLUX MINING)
|
||||
Smelting.Ability.SecondSmelt=\u4e8c\u6b21\u7194\u70bc\u51e0\u7387: [[YELLOW]]{0}
|
||||
Smelting.Ability.VanillaXPBoost=\u7ecf\u9a8c\u52a0\u500d: [[YELLOW]]{0}x
|
||||
Smelting.SubSkill.FuelEfficiency.Name=\u71c3\u6599\u6548\u7387
|
||||
Smelting.SubSkill.FuelEfficiency.Description=\u7194\u70bc\u65f6\u63d0\u9ad8\u7194\u7089\u5185\u71c3\u6599\u7684\u71c3\u70e7\u65f6\u95f4
|
||||
Smelting.SubSkill.SecondSmelt.Name=\u4e8c\u6b21\u7194\u70bc
|
||||
Smelting.SubSkill.SecondSmelt.Description=\u901a\u8fc7\u51b6\u70bc\u83b7\u5f97\u53cc\u500d\u8d44\u6e90
|
||||
Smelting.Effect.4=\u66f4\u591a\u51b6\u70bc\u7ecf\u9a8c\u7403
|
||||
Smelting.Effect.5=\u63d0\u9ad8\u51b6\u70bc\u83b7\u53d6\u7684\u7ecf\u9a8c\u7403
|
||||
Smelting.SubSkill.FluxMining.Name=\u70bd\u70ed\u7684\u9550\u5b50
|
||||
Smelting.SubSkill.FluxMining.Description=\u6316\u77ff\u65f6\u4e00\u5b9a\u51e0\u7387\u4f7f\u77ff\u77f3\u7acb\u5373\u88ab\u7194\u70bc
|
||||
Smelting.Listener=\u51b6\u70bc:
|
||||
Smelting.SkillName=\u51b6\u70bc
|
||||
Commands.Description.addlevels=\u7ed9\u73a9\u5bb6\u589e\u52a0 mcMMO \u7b49\u7ea7
|
||||
Commands.Description.adminchat=\u5207\u6362 mcMMO \u7ba1\u7406\u5458\u804a\u5929\u6216\u53d1\u9001\u7ba1\u7406\u5458\u804a\u5929\u4fe1\u606f
|
||||
Commands.Description.addxp=\u7ed9\u73a9\u5bb6\u589e\u52a0 mcMMO \u7ecf\u9a8c
|
||||
Commands.Description.hardcore=\u4fee\u6539 mcMMO hardcore \u767e\u5206\u6bd4\u6216\u5207\u6362 hardcore \u6a21\u5f0f\u5f00/\u5173
|
||||
Commands.Description.inspect=\u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u7684 mcMMO \u4fe1\u606f
|
||||
Commands.Description.mcability=\u5207\u6362 mcMMO \u6280\u80fd\u80fd\u5426\u88ab\u53f3\u952e\u6fc0\u6d3b
|
||||
Commands.Description.mcgod=\u5207\u6362 mcMMO \u4e0a\u5e1d\u6a21\u5f0f
|
||||
Commands.Description.mchud=\u53d8\u66f4\u4f60\u7684 mcMMO HUD \u6837\u5f0f
|
||||
Commands.Description.mcmmo=\u663e\u793a mcMMO \u7684\u7b80\u5355\u63cf\u8ff0
|
||||
Commands.Description.mcnotify=\u5207\u6362 mcMMO \u6280\u80fd\u63d0\u793a\u5f00\u5173
|
||||
Commands.Description.mcpurge=\u6e05\u9664\u6ca1\u6709 mcMMO \u7b49\u7ea7\u7684\u73a9\u5bb6\u548c\u8d85\u8fc7 {0} \u4e2a\u6708\u6ca1\u6709\u767b\u5f55\u7684\u73a9\u5bb6\u7684 mcMMO \u6570\u636e
|
||||
Commands.Description.mcrank=\u663e\u793a\u73a9\u5bb6\u7684 mcMMO \u6392\u540d
|
||||
Commands.Description.mcrefresh=\u5237\u65b0\u6240\u6709\u7684 mcMMO \u51b7\u5374\u65f6\u95f4
|
||||
Commands.Description.mcremove=\u4ece mcMMO \u6570\u636e\u5e93\u4e2d\u79fb\u9664\u4e00\u4e2a\u73a9\u5bb6
|
||||
Commands.Description.mcstats=\u663e\u793a\u4f60\u7684 mcMMO \u7b49\u7ea7\u548c\u7ecf\u9a8c
|
||||
Commands.Description.mctop=\u663e\u793a mcMMO \u6392\u884c\u699c
|
||||
Commands.Description.mmoedit=\u7ed9\u73a9\u5bb6\u8bbe\u7f6e mcMMO \u7b49\u7ea7
|
||||
Commands.Description.mmoupdate=\u4ece\u4e00\u4e2a\u65e7\u7684 mcMMO \u6570\u636e\u5e93\u8fc1\u79fb\u5230\u5f53\u524d\u6570\u636e\u5e93\u5185
|
||||
Commands.Description.mcconvert=\u8f6c\u6362\u6570\u636e\u5e93\u7684\u7c7b\u578b\u6216\u7ecf\u9a8c\u503c\u516c\u5f0f\u7684\u7c7b\u578b
|
||||
Commands.Description.mmoshowdb=\u663e\u793a\u5f53\u524d\u6570\u636e\u5e93\u7c7b\u578b\u540d\u79f0 (\u8fc7\u540e\u66f4\u65b0\u4f7f\u7528 /mmoupdate)
|
||||
Commands.Description.party=\u63a7\u5236\u5404\u79cd mcMMO \u961f\u4f0d\u8bbe\u7f6e
|
||||
Commands.Description.partychat=\u5207\u6362 mcMMO \u961f\u4f0d\u804a\u5929\u6216\u53d1\u9001\u961f\u4f0d\u804a\u5929\u6d88\u606f
|
||||
Commands.Description.ptp=\u4f20\u9001\u81f3 mcMMO \u961f\u4f0d\u6210\u5458
|
||||
Commands.Description.Skill=\u663e\u793a {0} \u8be6\u7ec6\u7684mcMMO\u6280\u80fd\u4fe1\u606f
|
||||
Commands.Description.skillreset=\u91cd\u7f6e mcMMO \u7b49\u7ea7
|
||||
Commands.Description.vampirism=\u66f4\u6539 mcMMO \u69a8\u53d6\u767e\u5206\u6bd4 \u6216\u5207\u6362 vampirism \u6a21\u5f0f\u5f00/\u5173
|
||||
Commands.Description.xplock=\u9501\u5b9a\u6307\u5b9a mcMMO \u6280\u80fd\u7684\u7ecf\u9a8c\u6761
|
||||
Commands.Description.xprate=\u66f4\u6539 mcMMO \u7ecf\u9a8c\u500d\u7387\u6216\u5f00\u542f\u4e00\u4e2a mcMMO \u7ecf\u9a8c\u7ffb\u500d\u4e8b\u4ef6
|
||||
UpdateChecker.Outdated=\u4f60\u6b63\u4f7f\u7528\u7740\u4e00\u4e2a\u8fc7\u65f6\u7248\u672c\u7684 mcMMO !
|
||||
UpdateChecker.NewAvailable=\u53d1\u73b0 BukkitDev \u4e0a\u6709\u53ef\u7528\u65b0\u7248\u672c.
|
||||
Scoreboard.Header.PlayerStats=mcMMO \u7edf\u8ba1
|
||||
Scoreboard.Header.PlayerCooldowns=mcMMO \u51b7\u5374
|
||||
Scoreboard.Header.PlayerRank=mcMMO \u6392\u540d
|
||||
Scoreboard.Header.PlayerInspect=mcMMO \u7edf\u8ba1: {0}
|
||||
Scoreboard.Header.PowerLevel=\u6218\u6597\u529b
|
||||
Scoreboard.Misc.PowerLevel=[[GOLD]]\u6218\u6597\u529b
|
||||
Scoreboard.Misc.Level=[[DARK_AQUA]]\u7b49\u7ea7
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]\u5f53\u524d\u7ecf\u9a8c
|
||||
Scoreboard.Misc.RemainingXP=\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u51b7\u5374
|
||||
Scoreboard.Misc.Overall=[[GOLD]]\u603b\u4f53
|
||||
Scoreboard.Misc.Ability=\u80fd\u529b
|
||||
Recovery.Notice=\u6ce8\u610f: mcMMO[[DARK_RED]]\u65e0\u6cd5\u8f7d\u5165\u4f60\u7684\u6570\u636e.[[RED]] \u91cd\u8bd55\u6b21...
|
||||
Recovery.Success=[[GREEN]]\u6210\u529f!\u4f60\u7684mcMMO\u6570\u636e\u5df2\u8f7d\u5165.
|
||||
Recovery.Failure=mcMMO\u65e0\u6cd5\u8f7d\u5165\u4f60\u7684\u6570\u636e,\u4f60\u53ef\u80fd\u9700\u8981\u8054\u7cfb[[AQUA]]\u6e38\u620f\u7ba1\u7406\u5458\n[[YELLOW]]\u4f60\u53ef\u4ee5\u7ee7\u7eed\u6e38\u620f,\u4f46\u4f60[[BOLD]]\u65e0\u6cd5\u5f97\u5230mcMMO\u7b49\u7ea7[[YELLOW]]\u548c\u4efb\u4f55\u7ecf\u9a8c[[BOLD]]\u6240\u6709\u6570\u636e\u4e0d\u4f1a\u88ab\u4fdd\u5b58[[YELLOW]].
|
||||
Recovery.AdminFailureNotice=[[DARK_RED]][A][[RED]]mcMMO\u65e0\u6cd5\u8f7d\u5165\u73a9\u5bb6[[YELLOW]]{0}[[RED]]\u7684\u6570\u636e. [[LIGHT_PURPLE]]\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93\u6216\u8bbe\u7f6e.
|
||||
@@ -1,131 +0,0 @@
|
||||
#
|
||||
# Armor example configuration
|
||||
# Last updated on ${project.version}-b${BUILD_NUMBER}
|
||||
#
|
||||
# Any file named armor.*.yml in the mod folder will be loaded as a armor config
|
||||
# For every armor type there is a separate section.
|
||||
# The names of each subitem should be the exact material name.
|
||||
# The bare minimum of an Armor piece is that it has a Repair_Material
|
||||
#
|
||||
#
|
||||
# Repairable: Whether or not the item is repairable
|
||||
## This defaults to true
|
||||
#
|
||||
# Repair_Material: This is the material name of the item used to repair this armor.
|
||||
## This is required to be set if you want to be able to repair the item.
|
||||
#
|
||||
# Repair_Material_Data_Value: This is the metadata of the item used to repair this armor.
|
||||
## A value of -1 means to ignore all metadata when repairing.
|
||||
## This defaults to -1
|
||||
#
|
||||
# Repair_Material_Quantity: This is the minimum number of items needed to repair this item ignoring all other repair bonuses.
|
||||
## This is typically the number of the repair material needed to create a new item, for example for a sword it is 2, for an axe it is 3
|
||||
## This defaults to 9
|
||||
#
|
||||
# Repair_Material_Pretty_Name: The pretty name of the repair material.
|
||||
## Used in the feedback message when not enough repair materials are found.
|
||||
## This defaults to the Repair_Material converted to string.
|
||||
#
|
||||
# Repair_Material_Pretty_Name: The pretty name of the repair material.
|
||||
## Used in the feedback message when not enough repair materials are found.
|
||||
## This defaults to the Repair_Material converted to string.
|
||||
#
|
||||
# Repair_MinimumLevel: This is the minimum repair level needed to repair this item.
|
||||
## Valid values are => 0
|
||||
## This defaults to 0
|
||||
#
|
||||
# Repair_XpMultiplier: This is the amount to multiply the xp bonus by.
|
||||
## This defaults to 1
|
||||
#
|
||||
# Durability: This is the maximum durability of the armor.
|
||||
## Valid values are >= 1
|
||||
#
|
||||
###
|
||||
#
|
||||
# Settings for Boots
|
||||
###
|
||||
Boots:
|
||||
Boot_1:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
Boot_2:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
#
|
||||
# Settings for Chestplates
|
||||
###
|
||||
Chestplates:
|
||||
Chestplate_1:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
Chestplate_2:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
#
|
||||
# Settings for Helmets
|
||||
###
|
||||
Helmets:
|
||||
Helmet_1:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
Helmet_2:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
#
|
||||
# Settings for Leggings
|
||||
###
|
||||
Leggings:
|
||||
Legging_1:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
Legging_2:
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 999
|
||||
@@ -1,57 +0,0 @@
|
||||
#
|
||||
# Settings for Custom Excavation Blocks
|
||||
###
|
||||
Excavation:
|
||||
Block_1|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Block_2|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
|
||||
#
|
||||
# Settings for Custom Herbalism Blocks
|
||||
###
|
||||
Herbalism:
|
||||
Block_1|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Block_2|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
|
||||
#
|
||||
# Settings for Custom Mining Blocks
|
||||
###
|
||||
Mining:
|
||||
Block_1|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Is_Ore: true
|
||||
Smelting_XP_Gain: 9
|
||||
Block_2|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Is_Ore: true
|
||||
Smelting_XP_Gain: 9
|
||||
|
||||
#
|
||||
# Settings for Custom Woodcutting Blocks
|
||||
###
|
||||
Woodcutting:
|
||||
Block_1|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Is_Log: true
|
||||
Block_2|0:
|
||||
XP_Gain: 99
|
||||
Double_Drops_Enabled: true
|
||||
Is_Log: true
|
||||
|
||||
#
|
||||
# Settings for Custom Ability Blocks
|
||||
# (These blocks don't trigger abilities)
|
||||
###
|
||||
Ability_Blocks:
|
||||
Block_1|0:
|
||||
Block_2|0:
|
||||
@@ -1,42 +0,0 @@
|
||||
#
|
||||
# Settings for Custom Mobs
|
||||
#
|
||||
# Mob name should be the entity type of the mob - usually "ModName_EntityName"
|
||||
# Be sure to use the "_" character in place of any "." characters in the mob name.
|
||||
###
|
||||
Mob_1:
|
||||
Class: CLASS_NAME
|
||||
XP_Multiplier: 1.0
|
||||
Tameable: false
|
||||
Taming_XP: 250
|
||||
CanBeSummoned: false
|
||||
COTW_Material: MATERIAL_NAME
|
||||
COTW_Material_Data: 9
|
||||
COTW_Material_Amount: 99
|
||||
Mob_2:
|
||||
Class: CLASS_NAME
|
||||
XP_Multiplier: 1.0
|
||||
Tameable: false
|
||||
Taming_XP: 250
|
||||
CanBeSummoned: false
|
||||
COTW_Material: MATERIAL_NAME
|
||||
COTW_Material_Data: 9
|
||||
COTW_Material_Amount: 99
|
||||
Mob_3:
|
||||
Class: CLASS_NAME
|
||||
XP_Multiplier: 1.0
|
||||
Tameable: false
|
||||
Taming_XP: 250
|
||||
CanBeSummoned: false
|
||||
COTW_Material: MATERIAL_NAME
|
||||
COTW_Material_Data: 9
|
||||
COTW_Material_Amount: 99
|
||||
Mob_4:
|
||||
Class: CLASS_NAME
|
||||
XP_Multiplier: 1.0
|
||||
Tameable: false
|
||||
Taming_XP: 250
|
||||
CanBeSummoned: false
|
||||
COTW_Material: MATERIAL_NAME
|
||||
COTW_Material_Data: 9
|
||||
COTW_Material_Amount: 99
|
||||
@@ -1,220 +0,0 @@
|
||||
#
|
||||
# Tools example configuration
|
||||
# Last updated on ${project.version}-b${BUILD_NUMBER}
|
||||
#
|
||||
# Any file named tools.*.yml in the mod folder will be loaded as a tools config
|
||||
# For every tool type there is a separate section.
|
||||
# The names of each subitem should be the exact material name.
|
||||
# The bare minimum of a Tool is that it has a Repair_Material
|
||||
#
|
||||
#
|
||||
#
|
||||
# XP_Modifier: This is the xp modifier of the tool, xp is multiplied by this modifier.
|
||||
## Valid values are > 0
|
||||
## This defaults to 1.0.
|
||||
#
|
||||
# Tier: The tier of the tool
|
||||
## Used to determine the capabilities of AoE abilities with certain skills
|
||||
## Valid values range from 1 to 4
|
||||
## This defaults to 1
|
||||
#
|
||||
# Ability_Enabled: Whether or not abilities are enabled with this tool
|
||||
## This defaults to true
|
||||
#
|
||||
# Repairable: Whether or not the item is repairable
|
||||
## This defaults to true
|
||||
#
|
||||
# Repair_Material: This is the material name of the item used to repair this tool.
|
||||
## This is required to be set if you want to be able to repair the item.
|
||||
#
|
||||
# Repair_Material_Data_Value: This is the metadata of the item used to repair this tool.
|
||||
## A value of -1 means to ignore all metadata when repairing.
|
||||
## This defaults to -1
|
||||
#
|
||||
# Repair_Material_Quantity: This is the minimum number of items needed to repair this item ignoring all other repair bonuses.
|
||||
## This is typically the number of the repair material needed to create a new item, for example for a sword it is 2, for an axe it is 3
|
||||
## This defaults to 9
|
||||
#
|
||||
# Repair_Material_Pretty_Name: The pretty name of the repair material.
|
||||
## Used in the feedback message when not enough repair materials are found.
|
||||
## This defaults to the Repair_Material converted to string.
|
||||
#
|
||||
# Repair_MinimumLevel: This is the minimum repair level needed to repair this item.
|
||||
## Valid values are => 0
|
||||
## This defaults to 0
|
||||
#
|
||||
# Repair_XpMultiplier: This is the amount to multiply the xp bonus by.
|
||||
## This defaults to 1
|
||||
#
|
||||
# Durability: This is the maximum durability of the tool.
|
||||
## Valid values are >= 1
|
||||
#
|
||||
###
|
||||
#
|
||||
# Settings for Axes
|
||||
###
|
||||
Axes:
|
||||
Axe_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Axe_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
#
|
||||
# Settings for Bows
|
||||
###
|
||||
Bows:
|
||||
Bow_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Bow_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
#
|
||||
# Settings for Hoes
|
||||
###
|
||||
Hoes:
|
||||
Hoe_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Hoe_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
#
|
||||
# Settings for Pickaxes
|
||||
###
|
||||
Pickaxes:
|
||||
Pickaxe_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Pickaxe_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
#
|
||||
# Settings for Shovels
|
||||
###
|
||||
Shovels:
|
||||
Shovel_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Shovel_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
#
|
||||
# Settings for Swords
|
||||
###
|
||||
Swords:
|
||||
Sword_1:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
Sword_2:
|
||||
XP_Modifier: 1.0
|
||||
Ability_Enabled: true
|
||||
Tier: 1
|
||||
Repairable: true
|
||||
Repair_Material: REPAIR_MATERIAL_NAME
|
||||
Repair_Material_Data_Value: 0
|
||||
Repair_Material_Quantity: 9
|
||||
Repair_Material_Pretty_Name: Repair Item Name
|
||||
Repair_MinimumLevel: 0
|
||||
Repair_XpMultiplier: 1.0
|
||||
Durability: 9999
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs as Libs
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import as allows for shorthand.
|
||||
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
compile(Libs.configurate) { // Configurate-Yaml dependency, inherits Configurate-core
|
||||
exclude(Deps.Groups.guava, Deps.Modules.guava) // Exclude guava
|
||||
exclude(Deps.Groups.checker, Deps.Modules.checker) // Exclude checkerframework
|
||||
}
|
||||
compile(Libs.flowmath) // flowpowered math, for more maths.
|
||||
compile(Libs.jdbc) // Database connectors
|
||||
compile(Libs.juli) // Database connectors
|
||||
testCompile(Libs.junitDep) // junit for testing
|
||||
|
||||
// Spigot for in-dev dependency
|
||||
compileOnly(Libs.Bukkit.`1_13`.spigotApi) { // Spigot only for temporary usage in core
|
||||
isTransitive = false // Don't include spigot api's dependencies
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
package com.gmail.nossr50.core;
|
||||
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManager;
|
||||
import com.gmail.nossr50.core.mcmmo.event.EventCommander;
|
||||
import com.gmail.nossr50.core.mcmmo.plugin.Plugin;
|
||||
import com.gmail.nossr50.core.mcmmo.server.Server;
|
||||
import com.gmail.nossr50.core.mcmmo.tasks.TaskScheduler;
|
||||
import com.gmail.nossr50.core.platform.Platform;
|
||||
import com.gmail.nossr50.core.util.ModManager;
|
||||
import com.gmail.nossr50.core.util.experience.FormulaManager;
|
||||
import com.gmail.nossr50.core.util.upgrade.UpgradeManager;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class McmmoCore {
|
||||
//TODO: Wire all this stuff
|
||||
public static Plugin p;
|
||||
private static EventCommander eventCommander;
|
||||
private static Logger logger;
|
||||
private static Platform platform;
|
||||
private static boolean retroModeEnabled;
|
||||
|
||||
//Why do all these things need to be here? Sigh...
|
||||
private static DatabaseManager databaseManager;
|
||||
private static UpgradeManager upgradeManager; //TODO: I can't even remember what this one did
|
||||
private static FormulaManager formulaManager;
|
||||
private static ModManager modManager; //TODO: Probably need to rewrite this
|
||||
|
||||
/**
|
||||
* Returns our Logger
|
||||
* @return the logger
|
||||
*/
|
||||
public static Logger getLogger()
|
||||
{
|
||||
return logger;
|
||||
}
|
||||
|
||||
public static EventCommander getEventCommander() {
|
||||
return eventCommander;
|
||||
}
|
||||
|
||||
public static Server getServer() {
|
||||
return platform.getServer();
|
||||
}
|
||||
|
||||
public static TaskScheduler getTaskScheduler()
|
||||
{
|
||||
return platform.getScheduler();
|
||||
}
|
||||
|
||||
public static java.io.InputStream getResource(String path)
|
||||
{
|
||||
return platform.getResource(path);
|
||||
}
|
||||
|
||||
public static File getDataFolderPath()
|
||||
{
|
||||
return platform.getDataFolderPath();
|
||||
}
|
||||
|
||||
public static DatabaseManager getDatabaseManager() { return databaseManager; }
|
||||
|
||||
public static UpgradeManager getUpgradeManager() { return upgradeManager; }
|
||||
|
||||
public static FormulaManager getFormulaManager() { return formulaManager; }
|
||||
|
||||
public static boolean isRetroModeEnabled() { return retroModeEnabled; }
|
||||
|
||||
public static ModManager getModManager() { return modManager; }
|
||||
|
||||
public static String getModDataFolderPath() { return platform.getModDataFolderPath(); }
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user