1
0
mirror of https://github.com/mcMMO-Dev/mcMMO.git synced 2026-02-18 09:43:00 +01:00

Compare commits

..

1249 Commits

Author SHA1 Message Date
nossr50
46e285bf44 Merge branch 'configurable' of github.com:mcMMO-Dev/mcmmo into configurable 2020-03-18 17:09:05 -07:00
nossr50
9a72af12b3 Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-03-18 17:05:08 -07:00
nossr50
f8dbace9f0 add comment 2020-03-17 16:00:32 -07:00
nossr50
58174d3391 dev mode 2020-03-17 15:42:25 -07:00
nossr50
7865ad8934 2.1.123 2020-03-13 15:15:00 -07:00
nossr50
d525f754a7 Add nether gold ore 2020-03-11 17:53:36 -07:00
nossr50
fd1b1fe124 treat new vines as multi block plants 2020-03-11 17:52:35 -07:00
nossr50
de71c60d6b Weeping vines fix / twisted vines added 2020-03-11 17:47:00 -07:00
nossr50
5609f1cdde update changelog 2020-03-11 17:45:18 -07:00
Shane Freeder
1bd4454a6b Show correct minimum level in adept salvage message 2020-03-07 23:20:18 +00:00
nossr50
8f8dfcf556 Update ability black lists 2020-03-03 22:32:24 -08:00
nossr50
ce1051c364 2.1.122 2020-03-03 22:24:35 -08:00
nossr50
b9d05d8d67 Move roots to herbalism xp tables 2020-03-03 22:13:34 -08:00
nossr50
3aa9f385e5 Wart blocks are now treated like leaves 2020-03-03 22:09:57 -08:00
nossr50
ff8c94bf44 2.1.121 2020-03-03 18:14:56 -08:00
nossr50
51e80f40dd sigh 2020-03-03 17:57:51 -08:00
nossr50
a7d2c901df 2.1.120 2020-03-03 17:52:18 -08:00
nossr50
325cbcad9d 2.1.120 2020-03-03 17:52:02 -08:00
nossr50
2644de5ab4 2.1.119 - 1.16 Support 2020-03-03 17:19:46 -08:00
nossr50
3a81d94b32 1.16 support part 5 2020-03-03 17:14:57 -08:00
nossr50
89a990f0cb Another dupe fix + 1.16 support part 4 2020-03-03 16:37:13 -08:00
nossr50
d585b1c2f7 1.16 support part 3 2020-03-02 14:52:51 -08:00
nossr50
1101815f18 1.16 Support part 2 2020-02-28 16:44:37 -08:00
nossr50
efea1c5d33 1.16 Support part 1 2020-02-28 16:29:11 -08:00
Shane Freeder
33e0b40e19 Merge remote-tracking branch 'origin/master' into configurable 2020-02-29 00:21:37 +00:00
nossr50
31a98791f3 dev mode 2020-02-28 15:48:48 -08:00
nossr50
c2bbe33fe8 2.1.118 2020-02-28 15:44:22 -08:00
nossr50
12abd68add Rupture fires a FakeEntityDamageByEntityEvent fixes #4122 2020-02-28 15:43:32 -08:00
nossr50
326ff1cd70 Update blast mining info in /mining 2020-02-28 15:27:57 -08:00
nossr50
9f0fe26778 Blast Mining Tweaks 2020-02-27 12:45:35 -08:00
nossr50
0a59b79ef9 Dev mode 2020-02-27 10:50:56 -08:00
nossr50
441125dbd1 2.1.117 2020-02-27 07:36:41 -08:00
nossr50
27b1c6b094 null check on player debug command 2020-02-24 17:08:23 -08:00
nossr50
db70d56493 Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-02-24 16:05:34 -08:00
nossr50
eff1ce102f Merge branch 'master' of github.com:mcMMO-Dev/mcmmo 2020-02-24 16:01:18 -08:00
nossr50
705b57a30b dev mode 2020-02-24 16:01:10 -08:00
Shane Freeder
d4ba9d7605 Reduce mojang profile API call limit (Fixes #4121) 2020-02-22 11:12:52 +00:00
nossr50
3b3396ce2c Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-02-20 17:43:58 -08:00
nossr50
4cd91350db 2.1.116 2020-02-20 17:35:33 -08:00
nossr50
b3bea7833f Merge me daddy 2020-02-20 16:22:46 -08:00
nossr50
b0c7e0368a merge master + singleton removal on ParticleEffectUtils 2020-02-20 16:15:38 -08:00
nossr50
4e895b7361 Some kyori/text stuff 2020-02-20 15:23:58 -08:00
nossr50
6168309ec9 2.1.115 2020-02-19 17:41:47 -08:00
nossr50
95c403a467 More tweaks to GT 2020-02-19 17:31:00 -08:00
nossr50
a598796c99 More tweaks to GT 2020-02-19 17:20:05 -08:00
nossr50
a333f36fd8 Fix sneak check on GT 2020-02-19 16:19:19 -08:00
nossr50
7c6d5c476d Green Thumb requires a hoe, sneak to break with a hoe 2020-02-19 16:14:21 -08:00
nossr50
e2073ff9f7 Immature crop replanting, green thumb tweaks, replant accidental break
protection
2020-02-19 15:58:53 -08:00
nossr50
8f26544188 Immature plants will be replanted if weilding a hoe 2020-02-19 13:51:10 -08:00
nossr50
4e21f1a200 tweak and fix salvage result chance 2020-02-19 13:27:21 -08:00
nossr50
ab6dbe306d Fix potential NPE for salvage 2020-02-19 11:38:48 -08:00
nossr50
19a4c0238f add sonatype 2020-02-17 19:34:10 -08:00
nossr50
c071471bdf update for text libs 2020-02-17 19:27:21 -08:00
nossr50
85550c5750 Add kashike's text lib to dependencies 2020-02-17 18:46:48 -08:00
nossr50
3c382a11ed Add showtags subcommand to nbttools 2020-02-17 18:30:09 -08:00
nossr50
f45c70b694 More work on ACF integration 2020-02-12 15:20:21 -08:00
Shane Freeder
38d64f207d Fix default permission for Critical Strikes 2020-02-12 02:06:49 +00:00
nossr50
2d342f8a3d Missing default tag 2020-02-11 15:44:52 -08:00
nossr50
3b276b59cf Merge branch 'nbt' of github.com:mcMMO-Dev/mcmmo into configurable 2020-02-10 13:20:05 -08:00
nossr50
4ff4def56a Optimize imports 2020-02-10 13:19:14 -08:00
nossr50
63de093ebb Remove debug on swing 2020-02-10 13:18:42 -08:00
nossr50
b34f0d62d6 Fixing shadow dependencies (I hope) 2020-02-10 13:13:29 -08:00
nossr50
a74f33c96d Latest changes 2020-02-09 16:06:28 -08:00
Shane Freeder
8e8024e3e1 update changelog 2020-02-09 22:50:28 +00:00
Shane Freeder
4f161812aa Use minimum level of salvagable properly 2020-02-09 22:47:20 +00:00
nossr50
24ba3b1a01 New command 'nbttools' also integrating ACF 2020-02-07 15:06:00 -08:00
nossr50
359e3e34ad Unused import 2020-02-07 13:28:17 -08:00
nossr50
ab0fc06dc2 Merge branch 'configurable' of github.com:mcMMO-Dev/mcmmo into nbt 2020-02-07 11:32:26 -08:00
Shane Freeder
11ca0d9ff1 Fix 1.13.x archery compat 2020-02-04 23:36:54 +00:00
Shane Freeder
4eef4a3e41 Fix CCE from spectral arrows (Fixes #4114) 2020-02-04 23:29:51 +00:00
Shane Freeder
816b64cb70 Track spectral arrows for combat 2020-01-28 16:37:02 +00:00
Shane Freeder
dceee5554d Fix CombatUtils NPE due to arrows from unloaded players 2020-01-28 16:33:30 +00:00
nossr50
e3edc9a18f Fix faulty WG logic 2020-01-27 20:38:52 -08:00
nossr50
aaffafb88b No more Standard or Retro, use cosmetic scale modifier setting instead 2020-01-27 20:13:36 -08:00
nossr50
2e5a12a72b Add new Cosmetic Level Scaling setting to the leveling config 2020-01-27 19:11:00 -08:00
nossr50
769a26a911 Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-01-27 19:03:24 -08:00
nossr50
8094be46c8 Dev mode 2020-01-27 19:01:08 -08:00
nossr50
2525ce9abe 2.1.114 2020-01-27 18:53:39 -08:00
nossr50
47bcd1223b Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-01-27 18:47:06 -08:00
nossr50
ea70c937f2 Fix rank for new versions of MySQL 2020-01-27 18:45:19 -08:00
nossr50
3eb160a794 Missed a few merges 2020-01-27 18:40:46 -08:00
nossr50
4b6e2c35b2 Merge branch 'master' of github.com:mcMMO-Dev/mcmmo into configurable 2020-01-27 18:36:32 -08:00
Shane Freeder
550a3df616 place SnowGolemExcavation exploit fix under the correct section 2020-01-28 00:12:50 +00:00
apachezy
657abb76a7 "EndermanEndermiteFarms" does not work. (#4111)
This error causes the "ExploitFix.EndermanEndermiteFarms" option in ExperienceConfig to not work.
2020-01-28 00:11:57 +00:00
Shane Freeder
0ffcff53b3 Further address locale issues (Targets #4083) 2020-01-26 17:48:14 +00:00
nossr50
33f4ac14b5 Add toggle for snow golem exploit to experience.yml - SnowGolemExcavation 2020-01-24 18:28:41 -08:00
nossr50
15d3119627 Berserk now breaks a soft block if it was used to activate it 2020-01-24 01:25:55 -08:00
nossr50
4fd94bfe29 2.1.113 2020-01-24 01:11:23 -08:00
nossr50
ac731258c7 Berserk now breaks glass and makes noise when doing so 2020-01-24 01:09:19 -08:00
nossr50
7b8c90d362 BlockCracker fix for infested stone bricks 2020-01-24 00:56:16 -08:00
nossr50
055391e908 Hacky fix for spigot bug 2020-01-24 00:43:18 -08:00
nossr50
cd6ce5a19d Correct changelog 2020-01-23 20:34:54 -08:00
nossr50
7441d2d8d6 Merge branch 'master' of github.com:mcMMO-Dev/mcmmo 2020-01-23 20:34:13 -08:00
nossr50
7b941baa1c Update changelog 2020-01-23 20:34:00 -08:00
Lane
0c1fa07079 Fixed typo in config for potato (#4096) 2020-01-17 07:23:28 +00:00
andrewkm
539cd7290e Retro mode documentation. (#4104)
This commit will save lives, believe me.
2020-01-17 07:21:31 +00:00
Shane Freeder
406429f4e3 Use ThreadedLocalRandom for RNG utils 2020-01-16 18:21:35 +00:00
Shane Freeder
40802e6bae Merge branch 'master' into configurable 2020-01-16 04:50:50 +00:00
t00thpick1
421a394f68 Another check for PTP exploit 2020-01-15 13:49:11 -08:00
t00thpick1
d4adb490e2 Fixing PTP exploit 2020-01-15 13:32:10 -08:00
nossr50
de5a8babc5 dev mode 2020-01-15 13:21:33 -08:00
nossr50
d892bfe83a 2.1.112 2020-01-14 20:10:33 -08:00
nossr50
ceaff0c862 SkillShot tweaks 2020-01-14 20:09:41 -08:00
nossr50
a118d8465e Sweet Berry Bush nerf 2020-01-14 19:57:38 -08:00
nossr50
7c156319be Skill Shot is now multiplicative instead of additive 2020-01-14 19:53:37 -08:00
nossr50
24b3bf1100 NPE fix for combat on unloaded profiles 2020-01-14 19:44:17 -08:00
nossr50
41bdca948a Update POM for 1.15.1 2020-01-13 19:28:28 -08:00
Shane Freeder
5441a7eb96 Add doTranslation script for easing repetative migrations 2020-01-11 16:56:39 +00:00
Shane Freeder
c45f2ce406 Merge branch 'master' into configurable 2020-01-11 16:51:38 +00:00
Shane Freeder
3cbbf1bee0 Move valid check higher up, no need to set additional metadata 2019-12-31 12:17:03 +00:00
Shane Freeder
8fd1af4cbf Don't cache mob infomation in the updater task 2019-12-31 12:16:12 +00:00
Shane Freeder
601297799f Enforce locale usage for enums to ensure correct casing (Fixes #4086) 2019-12-16 01:05:47 +00:00
nossr50
da98be88ad Update changelog 2019-12-10 21:51:41 -08:00
nossr50
1104f48ad5 2.1.111 2019-12-10 21:46:09 -08:00
nossr50
af50699de1 1.15 changes 2019-12-10 21:35:44 -08:00
Shane Freeder
1c71f1daf5 Update changelog 2019-11-13 19:56:07 +00:00
Shane Freeder
b7dd491c01 Prevent nesting of bleed damage
This commit prevents the nesting of damage event processing in general in
regards to bleed, health related stuff will need a further glance over down
the line, however; This will fix a major problematic area
2019-11-13 19:53:02 +00:00
nossr50
3ce0d7b972 dev mode 2019-11-10 19:51:47 -08:00
Robert Alan Chapton
9dcbccb010 Merge pull request #4078 from Ineusia/master
Missing Section Error Messages (Repair & Salvage Config)
2019-11-10 18:18:12 -08:00
Ineusia
c5cbab39b6 Update RepairConfig.java
Removed accidental whitespace
2019-11-10 11:56:32 -06:00
Ineusia
ca1906fbc5 Added error message for missing Salvageables section (rather than throw NPE) 2019-11-08 01:15:32 -06:00
Ineusia
7eab20ef56 Added error message for missing Repairables section (rather than throw NPE) 2019-11-08 01:11:29 -06:00
nossr50
25a9c75a5a Flesh out NBT types 2019-10-31 20:15:36 -07:00
nossr50
9911c406f8 Refactor some Type names and javadocs 2019-10-30 14:56:30 -07:00
nossr50
fdb900ec5d PlatformManager to manage the platform adapters 2019-10-30 14:38:02 -07:00
nossr50
bf94073935 Work on NBT adapters 2019-10-29 19:00:16 -07:00
nossr50
bfcc167862 Flesh out NBT types 2019-10-29 12:23:39 -07:00
nossr50
2a606b1ed1 Our own basic NBT types 2019-10-28 19:47:38 -07:00
nossr50
edc8701e35 Some JavaDocs 2019-10-22 16:13:53 -07:00
nossr50
188b0f9813 2.1.110 2019-10-18 15:48:53 -07:00
nossr50
e6c9cc6fdd Actually fixed BlockCracker + One more type of block can be cracked 2019-10-18 15:48:12 -07:00
nossr50
76ca7cc88f Additional dupe failsafes 2019-10-18 15:37:36 -07:00
nossr50
335d708848 Bump version 2019-10-18 15:24:46 -07:00
nossr50
b4179cb9a6 Fixed a dupe bug 2019-10-18 15:23:15 -07:00
Robert Alan Chapton
8bbf95e9da Merge pull request #4065 from Vyciokazz/master
locale_lt_LT.properties
2019-10-18 01:10:09 -07:00
nossr50
dc805825de 2.1.109 2019-10-17 20:16:01 -07:00
Robert Alan Chapton
871ca744d9 Merge pull request #4070 from Fabrimat/patch-4
Update locale_it.properties
2019-10-17 10:01:26 -07:00
Fabrizio La Rosa
1b091bdbd5 Update locale_it.properties
Fixed definetly /mctop and fixed special characters.
2019-10-17 13:37:00 +02:00
Robert Alan Chapton
31dc7bf03f Update build.gradle.kts 2019-10-09 12:46:04 -07:00
Shane Freeder
7be849da2a Fix compilation warnings 2019-10-06 01:16:27 +01:00
Shane Freeder
b572494c9c Remove the other deprecated PlayerProfile constructor 2019-10-06 01:07:01 +01:00
Shane Freeder
143714c9eb Remove deprecated PlayerProfile constructor 2019-10-06 01:03:07 +01:00
Robert Alan Chapton
110d9a633b Update FUNDING.yml 2019-10-02 13:26:34 -07:00
Robert Alan Chapton
584859318b Create FUNDING.yml 2019-10-02 13:06:56 -07:00
nossr50
4bff07bd2b Target the tag compound 2019-10-01 16:52:35 -07:00
nossr50
365938f351 ItemMeta needed? 2019-10-01 16:33:31 -07:00
nossr50
7f6bbadc1c Less error prone Kappa 2019-10-01 16:28:46 -07:00
nossr50
ec1fdea40d Progress??? 2019-10-01 16:23:59 -07:00
nossr50
8febe2d0bd Progress?? 2019-10-01 16:19:15 -07:00
nossr50
6e0f8f99fa Progress? 2019-10-01 15:44:58 -07:00
Robert A. C
1eb2c7b2d7 Merge pull request #4068 from ethernetcat/master
Update locale_ja_JP.properties
2019-10-01 14:37:21 -04:00
SNAKE
3310a12a95 Update locale_ja_JP.properties 2019-10-02 01:43:51 +09:00
nossr50
433f6d085d Time for a break 2019-09-30 17:53:57 -07:00
nossr50
0509f4f63e Starting work on reading NBT 2019-09-30 16:47:47 -07:00
nossr50
d2028321d4 Fixing SuperAbility strings 2019-09-30 16:11:06 -07:00
nossr50
4437f419cb Fix our TamingSummon serializer 2019-09-30 15:44:22 -07:00
nossr50
a58d875d74 Cleaning up more runtime errors during load 2019-09-30 15:28:51 -07:00
nossr50
154d0a8d50 Completely disable all Repair code pending rewrite
Repair code will be handled in a sep branch, this is being done so the
configurable branch can compile and be semi-playable for testing
important in development features.
2019-09-30 15:10:59 -07:00
nossr50
9e01a07542 Removing the hocon package 2019-09-30 14:34:38 -07:00
nossr50
f13364eb04 You missed some stuff catboy :) 2019-09-30 14:18:59 -07:00
nossr50
b763a56d75 Ignore bash scripts + Update Changelog 2019-09-30 13:59:38 -07:00
Shane Freeder
c7d2631a79 Add maven central repo 2019-09-30 21:37:33 +01:00
Shane Freeder
0cea66a084 Set version back to 2.2.0-SNAPSHOT 2019-09-30 21:26:30 +01:00
Shane Freeder
15913c8cf0 Drop maven pom 2019-09-30 21:24:05 +01:00
Shane Freeder
ba5c24fa3c Merge branch 'configurable' into gradlelize 2019-09-30 21:18:56 +01:00
Shane Freeder
f53d4bde67 invoke shadowJar 2019-09-30 21:08:02 +01:00
Shane Freeder
83373275f7 Move mcmmo into submodule
Goal will be to slowly move out the bukkit* dependencies from -core,
but, we have our starting point
2019-09-30 20:55:35 +01:00
nossr50
90897c9ae1 I'll probably end up rewriting these serializers 2019-09-28 17:58:02 -07:00
nossr50
7385679ec5 Initialize SkillTools before DST 2019-09-28 17:21:46 -07:00
nossr50
075ccbf4da Add missing ConfigSerializable annotation 2019-09-28 17:16:13 -07:00
nossr50
8a4318ee1f Load locale manager after config manager 2019-09-28 17:14:28 -07:00
nossr50
8e1f002808 WG Manager now lives in WG Utils class, fixing the runtime errors for WG
hooks in mcMMO during start up
2019-09-28 16:50:55 -07:00
Shane Freeder
3700128b21 move locale files into their intended resource folder 2019-09-28 10:02:46 +01:00
Shane Freeder
c44ca47bfe Setup resource filtering
Also mark gradlew as executable
2019-09-28 09:43:33 +01:00
Shane Freeder
6125b3fbd2 Don't spam incompatible WG error 2019-09-27 18:57:25 +01:00
Gabriel Harris-Rouquette
2ee102b44f Migrate the project to use Gradle. Reproduces a build almost exactly as the maven shade, only changed version numbers for comparison.
Signed-off-by: Gabriel Harris-Rouquette <gabizou@me.com>
2019-09-26 10:05:42 -07:00
Shane Freeder
c0bfdd34b7 And it compiles again! 2019-09-26 08:50:58 +01:00
Shane Freeder
fd7bcc4a32 Merge branch 'master' into configurable 2019-09-26 08:46:24 +01:00
nossr50
7f94f3833d 2.2 compiles again :) 2019-09-25 19:21:54 -07:00
nossr50
df6386ec2f NBT Manager will be a static abusing class for now 2019-09-25 18:29:30 -07:00
nossr50
f1de5484ec Minor tweaks 2019-09-25 17:47:51 -07:00
nossr50
20b9b0d0fe WIP - Add default entries to Repairables 2019-09-25 17:30:32 -07:00
nossr50
8a4b1bf307 We cutting corners boys 2019-09-25 16:57:15 -07:00
nossr50
46b881e730 Add serializer for TamingSummon 2019-09-25 16:21:32 -07:00
nossr50
d484ccc15e Minor tweaks 2019-09-25 15:54:44 -07:00
nossr50
e8f14eece0 Squashing some final compiler errors from static abuse removal 2019-09-25 14:31:48 -07:00
nossr50
8ad08298d0 Fixing more breaks from the static abuse removal 2019-09-25 14:21:11 -07:00
nossr50
297ce64a24 Fixing some more classes broken in the static abuse removal edits 2019-09-25 14:08:49 -07:00
nossr50
32d9eaab3d Fixing some Acrobatics related classes 2019-09-25 13:57:13 -07:00
nossr50
e1656423c1 Static Abuse Removal - Various Chunklet classes 2019-09-25 13:48:37 -07:00
nossr50
f52144fb3e Static Abuse Removal PerkUtils 2019-09-24 17:01:08 -07:00
nossr50
f7aaf25d93 Static Abuse Removal - HardcoreManager 2019-09-24 16:53:57 -07:00
nossr50
3552457790 Static Abuse Removal - Misc (now MiscTools) 2019-09-24 16:44:23 -07:00
nossr50
564b8ceb94 More dependency injection fixes in many file 2019-09-24 16:34:12 -07:00
nossr50
4b1cdbf493 Remove Static Abuse - SoundManager 2019-09-24 15:06:49 -07:00
nossr50
f0636ef47e More fixes for serializers 2019-09-24 14:42:13 -07:00
nossr50
68f6fea66a Fix the serialized config loader 2019-09-24 14:35:55 -07:00
nossr50
bde66ee4e1 Remove static abuse - Chunklet stuff 2019-09-24 14:30:33 -07:00
nossr50
ec4fbe678e Static Abuse Removal - Motd ( now MessageOfTheDayUtils ) 2019-09-24 14:01:26 -07:00
nossr50
2735cb1666 ZipLibrary static abuse removal 2019-09-23 20:03:16 -07:00
nossr50
1c2d1fa56f Fixing TamingManager 2019-09-23 19:53:19 -07:00
nossr50
14fa243b69 Refactor McMMOAbilityEvent(s) and fix TextComponentFactory 2019-09-23 19:42:47 -07:00
nossr50
815131a013 Treasure code removed pending rewrite 2019-09-23 19:20:09 -07:00
nossr50
3aead73d07 Refactoring McMMOPlayer 2019-09-23 16:26:34 -07:00
nossr50
b0803df7c5 Fixing a few more things 2019-09-23 16:18:36 -07:00
nossr50
50e955d07e Normalizing parameter names / Fixing PlayerProfile 2019-09-23 15:54:08 -07:00
nossr50
67a2841705 Simplify the SuperAbilityType ENUM 2019-09-23 14:44:40 -07:00
nossr50
d4826eebd8 Fix TrackedTamingEntity 2019-09-23 13:54:47 -07:00
nossr50
12e3a5d222 Fix Roll class 2019-09-23 13:51:32 -07:00
nossr50
57c30bac98 Fix Salvage, Swords and Unarmed command 2019-09-23 13:30:21 -07:00
nossr50
efbd9d52c3 Fix mmoinfo command 2019-09-23 13:20:42 -07:00
nossr50
ef25385786 Fix Axes command class 2019-09-23 13:01:11 -07:00
nossr50
b399c415dc Fix Acrobatics and Archery command classes 2019-09-23 12:58:28 -07:00
nossr50
810a29cb9d time to cut some corners :sick: 2019-09-23 12:40:00 -07:00
nossr50
9b6e6d7861 Add missing limit break settings 2019-09-23 12:34:00 -07:00
nossr50
4e2d68908e What a pain in the ass 2019-09-23 12:23:47 -07:00
Robert A. C
0d6b5e2530 Merge pull request #4064 from Fabrimat/patch-3
Update locale_it.properties
2019-09-23 10:46:29 -07:00
Fabrizio La Rosa
d679101cfb Update locale_it.properties
Spaces doesn't work in commands like "/mctop Tiro con l'arco"
2019-09-23 18:40:56 +02:00
Shane Freeder
122c8b0faa Added missing 1.14 blocks to ability/tool activation blacklists (Fixes #4050) 2019-09-22 04:30:24 +01:00
nossr50
1a3832f117 Correct structure of Archery skill config to have parity with others 2019-09-20 17:00:58 -07:00
nossr50
a6a544f472 Add limit break setting to Axes 2019-09-20 16:54:23 -07:00
nossr50
1d7bfc615f I should just rewrite this, instead I do a band-aid fix. 2019-09-20 16:42:34 -07:00
nossr50
2165d1448e Treasures are being rewritten completely 2019-09-20 15:56:25 -07:00
nossr50
396926d970 Removing dead symbols from ConfigManager 2019-09-20 15:54:38 -07:00
nossr50
7c0d1f4e0a Remove Static Abuse - WorldGuardUtils 2019-09-20 15:07:37 -07:00
nossr50
3aa896cfc9 Cleaner TamingSummon initialization/checks 2019-09-19 19:29:27 -07:00
nossr50
43d60b6a7d The pain begins 2019-09-19 19:04:31 -07:00
nossr50
08d1ad4f6c Dev mode 2019-09-19 18:45:09 -07:00
nossr50
8e19e1de15 2.1.108 2019-09-19 18:33:33 -07:00
nossr50
101b0671fe compatibility with FAWE ( :| ) 2019-09-19 18:31:18 -07:00
nossr50
e14c53d3ca Load after worlds 2019-09-19 18:02:23 -07:00
nossr50
28c0215a93 Catch more exceptions when doing WG reflection checks 2019-09-19 17:21:25 -07:00
nossr50
51a373db4f Fixing an Acrobatics exploit 2019-09-17 18:59:44 -07:00
Vyciokazz
1b889b8177 locale_lt_LT.properties
I translated in Lithuanian language manny required info for player and player skils, in time i update this translation.
2019-09-18 00:14:14 +03:00
nossr50
4a4124d09f 2.1.107 2019-09-14 16:08:20 -07:00
nossr50
ceaf3d46cb Update changelog 2019-09-14 16:06:14 -07:00
Robert A. C
260d0f9b4a Merge pull request #4051 from Shrek5InTheatres2019/master
McMMOPlayerProfileLoadEvent for the api
2019-09-14 16:05:26 -07:00
Shane Freeder
d3a7ff8e8c Correctly encode Russian translation file (#4058) 2019-09-14 23:58:46 +01:00
nossr50
9154b3f083 Fixes #4056 2019-09-14 15:44:58 -07:00
Shrek5InTheatres2019
c3548be380 deleting one character variables for good 2019-09-09 17:56:06 -07:00
Shrek5InTheatres2019
67bfb40dd5 fixing the things 2019-09-09 16:50:05 -07:00
Robert A. C
777a9d4185 Merge pull request #4052 from andris155/patch-1
Update locale_hu_HU.properties
2019-09-09 15:06:02 -06:00
András Marczinkó
fcd45f3bc1 Update locale_hu_HU.properties 2019-09-07 13:24:05 +02:00
Shrek5InTheatres2019
478d542981 removing this task that i once thought i needed and now realize that it is completely unnecessary 2019-09-06 16:46:38 -07:00
Shrek5InTheatres2019
c6c1c39a98 player profile load event from issue request #4045 2019-09-06 16:44:58 -07:00
nossr50
0d6165c0f4 dev mode 2019-09-06 15:37:54 -06:00
nossr50
f45983949a 2.1.106 2019-09-06 15:21:13 -06:00
nossr50
cca0524441 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-09-05 18:59:08 -06:00
nossr50
e84e9a7dc8 more blacklisted blocks 2019-09-05 18:58:50 -06:00
Robert A. C
a3600e11a9 Merge pull request #4048 from ethernetcat/master
Update locale_ja_JP.properties
2019-09-03 14:10:50 -06:00
Robert A. C
483579503a Merge pull request #4047 from 89009332/patch-10
Update locale_zh_CN.properties
2019-09-03 14:10:37 -06:00
SNAKE
d89ff8b238 Update locale_ja_JP.properties 2019-09-04 01:05:33 +09:00
89009332
582ff48b6f Update locale_zh_CN.properties 2019-09-03 19:50:02 +08:00
nossr50
d6e14ca431 Dev mode 2019-09-02 17:10:40 -06:00
nossr50
0961351ba2 2.1.105 2019-09-02 16:56:16 -06:00
Robert A. C
0b93a74652 Merge pull request #4041 from Shrek5InTheatres2019/master
Implementing request from issue #3918
2019-09-02 16:53:50 -06:00
Robert A. C
2bc2e5bb32 Merge pull request #4042 from QuantumToasted/master
Support jump strength stats for horses in Beast Lore
2019-09-02 15:18:10 -06:00
Daniel Jarski
98f8e049f3 Update to Beast Lore
Removed movement speed information for llamas, and added jump strength info for horses. Also added another locale string to display this information.
2019-08-30 23:14:39 -05:00
Shrek5InTheatres2019
e27d299132 removing unnecessary code 2019-08-29 23:16:26 -07:00
Shrek5InTheatres2019
7cf40d9dbf Implementing request from issue #3918 2019-08-29 18:51:48 -07:00
Daniel Jarski
d6eefac065 Merge pull request #1 from mcMMO-Dev/master
update
2019-08-29 19:53:42 -05:00
nossr50
3036c4ef80 Update locale 2019-08-28 14:29:14 -06:00
Robert A. C
a81468ccfc Merge pull request #4040 from Leomixer17/patch-1
Update locale_it.properties
2019-08-28 14:00:05 -06:00
Leomixer17
2a2a4479ca Update locale_it.properties 2019-08-27 17:17:34 +02:00
Leomixer17
289276d987 Update locale_it.properties 2019-08-27 17:06:20 +02:00
Leomixer17
f771b777b9 Update locale_it.properties 2019-08-27 04:38:35 +02:00
Robert A. C
e4d081f14b Merge pull request #4039 from Mixpa/master
simply if code
2019-08-26 14:34:36 -06:00
nossr50
bba35f8a4e Set player scoreboards to main server scoreboard upon entering a blacklisted world 2019-08-26 14:15:42 -06:00
Shane Freeder
8a4410cde8 Add a configuration to print jdbc exceptions
By default, mcmmo tries to pretty print errors, which is fine for many cases,
however; deeper nested errors can lack information, e.g. networking related issues,
while the pretty print is less intimitating and provides useful information to users,
surpressing the trace can prevent debugging these deeper issues, this config option serves
as a compromise between scaring users and having a means to find these deeper issues.
2019-08-26 05:29:29 +01:00
Shane Freeder
8951c1fd21 Back in dev 2019-08-26 05:28:21 +01:00
nossr50
1f7f71e8b5 2.1.104 2019-08-25 12:06:07 -06:00
Robert A. C
88b056c38f Merge pull request #4035 from andris155/patch-2
Update locale_hu_HU.properties
2019-08-25 12:03:34 -06:00
Robert A. C
d408782acf Merge pull request #4037 from ethernetcat/master
Update locale_ja_JP.properties
2019-08-25 12:03:24 -06:00
Mixpa
dfeab6b558 simply if code 2019-08-25 21:51:19 +08:00
SNAKE
f4fe25009d Convert to UTF16 2019-08-25 05:37:58 +09:00
SNAKE
905010aacd Update locale_ja_JP.properties 2019-08-25 04:01:17 +09:00
Shane Freeder
5ea2c493e8 Don't process mcmmo damage for invuln (#4028) 2019-08-24 17:40:46 +01:00
András Marczinkó
734c6f9c62 Update locale_hu_HU.properties 2019-08-24 10:23:10 +02:00
nossr50
44a3238c79 Dev mode 2019-08-23 21:14:23 -06:00
nossr50
139975958f 2.1.103 2019-08-23 21:00:50 -06:00
nossr50
52f9273fa8 Fishing drops are no longer random amounts 2019-08-23 20:51:32 -06:00
nossr50
77ffee2515 Fixed a bug where Tree Feller only rewarded 1 XP per block 2019-08-23 13:08:04 -06:00
nossr50
40118d570c Update notes 2019-08-23 12:19:52 -06:00
Robert A. C
8109ecb0e0 Merge pull request #4032 from Leomixer17/patch-1
Update locale_it.properties
2019-08-22 19:17:28 -06:00
Leomixer17
1147dff4c3 Update locale_it.properties 2019-08-23 03:02:15 +02:00
Leomixer17
c274b21af1 Update locale_it.properties 2019-08-23 02:51:20 +02:00
nossr50
2b72e8e69f Making Limit Break code clearer to understand 2019-08-22 14:54:47 -06:00
Robert A. C
ca511ca0f5 Merge pull request #4029 from QuantumToasted/master
Fix spelling error in Guilds.Salvage.Section.0
2019-08-22 14:20:56 -06:00
Daniel Jarski
cafacc05ab Fix spelling error in Guilds.Salvage.Section.0
"...use an gold block" -> "...use a gold block"
2019-08-22 13:05:54 -05:00
Shane Freeder
2974ed0993 correct item salvage level check 2019-08-22 00:38:29 +01:00
Robert A. C
861552bcd8 Merge pull request #4027 from QuantumToasted/master
Add additional info about horse speed in Beast Lore
2019-08-21 14:06:15 -07:00
nossr50
7095ddb611 Dev mode 2019-08-21 14:17:27 -06:00
Daniel Jarski
f70f2321f2 Add additional info about horse speed in Beast Lore
An additional string containing info about the horse's movement speed (in blocks per second) is now concat'd to the end of the Beast Lore info. Also, added a Combat.BeastLoreHorseSpeed locale string to service this info.
2019-08-21 13:10:43 -05:00
nossr50
4bb8e20b59 2.1.102 2019-08-21 04:57:02 -07:00
Shane Freeder
e8165321e1 Fix bleed tasks invoking ruptures
Also, made the mcmmo custom damage checks handle nested calls
2019-08-21 01:05:01 +01:00
nossr50
9428ea395d Partially finished merge 2019-08-20 11:24:47 -04:00
nossr50
4f6706b664 Test 2019-08-19 15:01:45 -07:00
Robert Chapton
665a31fc85 Players moving to a blacklisted world will have scoreboards removed 2019-08-19 14:49:21 -07:00
nossr50
1221069854 Dev mode 2019-08-11 23:58:13 -04:00
Robert A. C
054f8ffe0a Merge pull request #4021 from ethernetcat/master
Update locale_ja_JP.properties
2019-08-11 23:57:22 -04:00
Shane Freeder
dbecd289b2 Check configuration for fishing spam prevention (#4010) 2019-08-12 03:54:45 +01:00
Shane Freeder
bb7989449e Do not allow additions of timer tasks while iterating
Follow up on:
e4d980b135
Should help debug #4019 (and let us know when this actually occurs)
2019-08-12 02:31:51 +01:00
SNAKE0053
296c2e99f7 Update locale_ja_JP.properties 2019-08-12 02:35:23 +09:00
nossr50
4246f59d44 2.1.101 2019-08-09 17:18:26 -04:00
nossr50
87ff69d5c4 Add fix to changelog 2019-08-07 15:30:48 -07:00
Shane Freeder
84cb40521b Don't unmark herbalism blocks early (Fixes #4015) 2019-08-06 00:52:23 +01:00
nossr50
dda894dd9a dev mode 2019-08-05 10:46:26 -04:00
nossr50
7853efc63d 2.1.100 2019-08-05 10:43:05 -04:00
nossr50
11409c07c0 Fixed a bug with herbalism double drops 2019-08-05 10:39:33 -04:00
Robert A. C
7c17126ffb Merge pull request #4012 from myfbone/master
Another portion of Russian translation
2019-08-04 19:19:59 -07:00
myfbone
05e19b2122 Small correction of xp desc 2019-08-03 08:25:57 +03:00
myfbone
3b8fee5134 Some color corrections and added missing translation 2019-08-03 08:10:31 +03:00
Shane Freeder
4735b2ff8f Use the full GPLv3 license file 2019-08-02 16:02:07 +01:00
Shane Freeder
ac29c51d6e Fixed an NPE that may occur with random chances on a player without loaded data
Also correct changelog version
2019-08-02 03:34:26 +01:00
myfbone
ad9fa2dd9f Add some missing translations 2019-08-01 14:51:14 +03:00
Robert A. C
1e2f11f4f9 Merge pull request #4009 from myfbone/master
some russian translation corrections
2019-07-31 06:26:34 -07:00
myfbone
3a1f297618 new available version message now points to spigot instead of bukkit 2019-07-30 02:37:58 +03:00
myfbone
8af3f41f12 Стрельба (shooting) was renamed to Луки (bows) to reflect that this skill is about bows, but not about tridens and crossbows 2019-07-30 02:36:01 +03:00
Shane Freeder
e4d980b135 Fixed some concurrency concerns around BleedTasks 2019-07-29 17:41:57 +01:00
Shane Freeder
62ce98c8a5 validate that mcnotify isn't being ran by the console 2019-07-29 17:23:21 +01:00
myfbone
31a1fd4ece Fixed records translation in fishing extra and drop rate 2019-07-28 20:04:56 +03:00
nossr50
51e22f7904 Dev mode 2019-07-27 18:47:38 -07:00
Robert A. C
106fd84b7f Merge pull request #4006 from myfbone/master
Small corrections. Also shorted two word skill names to one word in order to be able running /skillname command
2019-07-26 20:13:59 -07:00
myfbone
5f99a6cf19 Merge branch 'master' of https://github.com/myfbone/mcMMO 2019-07-26 21:46:45 +03:00
myfbone
aba465e1a8 Small corrections. Alse shorted two word skill names to one word in order to be able running /skillname command 2019-07-26 21:46:24 +03:00
nossr50
73500aae90 2.1.99 2019-07-25 21:53:45 -07:00
nossr50
c3ec6a0b80 Debug message color tweaks 2019-07-25 21:50:17 -07:00
nossr50
509ca5ae7f 毎日... 2019-07-25 21:47:11 -07:00
nossr50
9b3091add4 Debug mode will now dump info about XP perks and how they are modifying
incoming XP gains
2019-07-25 21:43:19 -07:00
nossr50
b503cb5d80 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-07-25 21:26:31 -07:00
Robert A. C
a631388e5a Merge pull request #4003 from myfbone/master
Updated Russian translation up to the last version
2019-07-25 20:15:25 -07:00
myfbone
d64b869695 Updated Russian translation up to the last version 2019-07-26 06:09:24 +03:00
nossr50
8e1c1c9ef4 2.1.98 2019-07-24 20:11:54 -07:00
nossr50
952ee9556a Fixing Taming XP 2019-07-24 19:57:58 -07:00
nossr50
3155550931 Dev Mode again 2019-07-23 23:04:11 -07:00
nossr50
7242a171dd Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-07-22 20:12:35 -07:00
nossr50
0dac5f6b3f 2.1.97 2019-07-22 20:12:10 -07:00
Robert A. C
ff3bbad68c Merge pull request #3991 from andris155/patch-7
Update locale_hu_HU.properties
2019-07-22 20:09:53 -07:00
Robert A. C
5cc473fd96 Merge pull request #3996 from Yukiiro-Nite/close-files-after-world-unload
Close all the files after unload instead of before
2019-07-22 20:08:51 -07:00
Yukiiro-Nite
c03907b5a3 Close all the files after unload instead of before
- This ensures that all file handles are closed after a world is
unloaded, since the unloadChunk function calls saveChunk, which
opens files.
- Should resolve issue #3995
2019-07-21 01:01:42 -04:00
András Marczinkó
f9c257b73a Update locale_hu_HU.properties 2019-07-13 12:43:07 +02:00
nossr50
fdc8e4b81d Actually I should merge from master before working on this further 2019-07-12 10:54:03 -07:00
Robert A. C
308e3a4b1f Merge pull request #3988 from EvilOlaf/patch-6
Update locale_de.properties
2019-07-11 08:33:47 -07:00
Werner
99f8f34529 Update locale_de.properties 2019-07-11 16:27:14 +02:00
nossr50
5f7f6fc55a Fixed a NPE with taming. 2019-07-10 05:03:33 -07:00
nossr50
36932e397d 2.1.96 2019-07-08 07:57:07 -07:00
nossr50
732e29f0a5 Add missing 's' to Nether_Bricks 2019-07-08 03:53:00 -07:00
nossr50
cd0ed4b385 Dev mode 2019-07-07 06:13:33 -07:00
nossr50
03fd558e1b Add toggle to allow piston cheating 2019-07-07 06:11:15 -07:00
nossr50
6bc57f184a 2.1.95 2019-07-07 02:48:17 -07:00
nossr50
6c58e8a243 Limit Break Nerfs 2019-07-07 02:33:39 -07:00
nossr50
c818bf82b0 Cap how much XP can be given for Roll based on damage 2019-07-07 02:07:55 -07:00
nossr50
67a687ee40 Fix Ender Pearls not preventing XP gains in offhand 2019-07-07 01:55:23 -07:00
nossr50
ec44c99076 Many Herbalism bug fixes 2019-07-07 01:42:57 -07:00
nossr50
39a1a07a7d Add missing Chorus_Flower xp entry for Herbalism to experience.yml 2019-07-05 06:20:44 -07:00
nossr50
0b2d0fa332 Make the last bug fix compatible with 1.13 2019-07-05 06:14:54 -07:00
nossr50
304a942f51 Fixed a bug preventing wandering traders from granting XP 2019-07-05 05:51:41 -07:00
nossr50
250753c064 Remove Static Abuse - ItemUtils -> ItemTools 2019-07-04 08:07:02 -07:00
nossr50
05f289e6e6 Static Abuse Removal - BlockUtils -> BlockTools 2019-07-04 08:03:11 -07:00
nossr50
c5a7c88e0c Static Abuse Removal - RandomChanceUtil -> RandomChanceTools 2019-07-04 06:13:29 -07:00
nossr50
8f540796ff Static Abuse Removal - PlayerLevelUtils -> PlayerLevelTools 2019-07-04 06:03:44 -07:00
nossr50
376e156646 Static Abuse Removal - Commands, Boss Bars 2019-07-04 06:01:34 -07:00
nossr50
e001dea4d7 Updating various classes for the new SkillTools class 2019-07-04 05:42:15 -07:00
nossr50
381eba8ddc Static Abuse Removal - ComatUtils -> CombatTools 2019-07-04 05:22:52 -07:00
nossr50
084b5edf1f Crimes were commited today.
PrimarySkillType was a mess... SkillTools is not much better though.
2019-07-04 04:41:08 -07:00
nossr50
8b39224cbc Removing Static Abuse - WorldBlackList -> WorldBlackListManager 2019-07-03 22:31:59 -07:00
nossr50
bd0a673838 Removing Static Abuse - CommandRegistrationManager 2019-07-03 22:01:30 -07:00
nossr50
900d3bb7fd Wire up woodcutting behaviour, adding missing dependency injection in a
few places
2019-07-03 03:16:22 -07:00
nossr50
5af09581e0 Convert or Tweaked Mining/Salvage/Smelting for behaviours 2019-07-03 02:40:41 -07:00
nossr50
cf6d28a1bd Wire up Excavation, Fishing, and Herbalism behaviours 2019-07-03 02:29:51 -07:00
nossr50
148a4fd555 Wire up Acrobatics, Archery, and Axes behaviour managers 2019-07-03 02:24:04 -07:00
nossr50
b756938fb1 Skill Behaviour Managers 2019-07-03 02:14:56 -07:00
nossr50
cf46ec7498 Static Abuse Removal - Misc Tasks 2019-07-03 01:36:46 -07:00
nossr50
3ea739d111 Static Abuse Removal - Skill Tasks 2019-07-03 01:33:53 -07:00
nossr50
997fac0d17 Remove Static Abuse - Player / Party Tasks 2019-07-03 01:17:06 -07:00
nossr50
35f3c5d585 Remove Static Abuse - CWing (Needs more work) 2019-07-03 01:12:47 -07:00
nossr50
982e67af70 Remove Static Abuse - Database Tasks 2019-07-03 00:56:25 -07:00
nossr50
4da455b9d2 Remove Static Abuse - Command Tasks 2019-07-03 00:40:28 -07:00
nossr50
40a3de76fb Static Abuse Removal - More events purged of static abuse, moved some
unwanted alchemy code into the dumpster
2019-07-03 00:27:09 -07:00
nossr50
3bddfed72f Remove Static Abuse - Level Events 2019-07-03 00:22:32 -07:00
nossr50
bc183cd4f9 Static Abuse Removal - TextComponentFactory 2019-07-02 21:45:42 -07:00
nossr50
5ec59536c7 Remove Static Abuse - Scoreboards... (Yuck) 2019-07-02 21:12:50 -07:00
nossr50
e7b80cbce5 Dependency inject Party in ShareHandler 2019-07-02 20:10:06 -07:00
nossr50
4815bd7d11 Remove Static Abuse - ShareHandler -> Moved into Party 2019-07-02 20:07:52 -07:00
nossr50
1260f4e57a Remove Static Abuse - Database package 2019-07-02 19:41:32 -07:00
nossr50
67afdd7efb Static Abuse Removal - Command package done for now 2019-07-02 19:27:51 -07:00
nossr50
a9207b6f38 Renamed a lot of Command classes 2019-07-02 19:19:43 -07:00
nossr50
57b7050a2c Static Abuse Removal - CommandUtils -> CommandTools 2019-07-02 19:00:06 -07:00
nossr50
762c3bd04e Static Abuse Removal - Party Commands 2019-07-02 18:55:05 -07:00
nossr50
5fd93cea19 Static Abuse Removal - PTP Commands 2019-07-02 18:38:22 -07:00
nossr50
4c4732695b Static Abuse Cleanup - EventUtils -> EventManager 2019-07-02 18:32:28 -07:00
nossr50
fc9942fdc4 Static Abuse Cleanup - MobHealthBarUtils (now MobHealthBarManager) 2019-07-02 18:27:17 -07:00
nossr50
02c1ce749c 2.1.94 2019-07-02 17:29:57 -07:00
nossr50
1307169d8b Debug Stick is now replaced by /mmodebug 2019-07-02 17:29:33 -07:00
nossr50
8eeebf63e9 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-07-02 16:23:14 -07:00
nossr50
f7c0c9beb7 Add new mcMMO devs to readme.md and plugin.yml 2019-07-02 16:22:56 -07:00
Robert A. C
9ec4f64c70 Merge pull request #3978 from snake0053/master
Fix spelling
2019-07-02 15:09:15 -07:00
SNAKE0053
9667eaf045 Fix spelling 2019-07-03 06:51:06 +09:00
nossr50
51ade5113f Adjust changelog 2019-07-02 14:50:34 -07:00
nossr50
0af3c82612 Fixed a bug that could prevent a Tree from being removed by Tree Feller
if 2 or more players were using Tree Feller simultaneously
2019-07-02 14:46:55 -07:00
Robert A. C
4c13c0ec31 Merge pull request #3977 from andris155/patch-1
Update locale_hu_HU.properties
2019-07-02 14:46:33 -07:00
Robert A. C
8ca5a5cdec Merge pull request #3976 from snake0053/update_japanese_local
Update locale_ja_JP.properties
2019-07-02 14:46:22 -07:00
András Marczinkó
43819605fa Update locale_hu_HU.properties 2019-07-02 23:44:23 +02:00
SNAKE0053
6e00f7eaa2 Update locale_ja_JP.properties 2019-07-03 06:41:29 +09:00
nossr50
5d0ce407b7 2.1.93 2019-07-02 13:47:37 -07:00
nossr50
bf70a42f6a Fix breeding sending incorrect messages 2019-07-02 12:45:25 -07:00
nossr50
6e70258f9a 2.1.92 2019-07-02 01:44:01 -07:00
nossr50
1ae9e80d96 Prevent spam from breeding events 2019-07-02 01:31:49 -07:00
nossr50
444edb209c Remove summoned entities on server shutdown 2019-07-02 01:14:11 -07:00
nossr50
8a9c836065 More locale tweaks for COTW 2019-07-02 00:45:08 -07:00
nossr50
a19ddb46b6 Fixing some bugs, tweaking some strings for COTW 2019-07-02 00:32:38 -07:00
nossr50
53d6065185 Numerous COTW tweaks 2019-07-01 23:50:30 -07:00
nossr50
a66940b2b8 Unarmed no longer uses a serverwide cooldown for all players for bonus
damage
2019-06-30 12:19:45 -07:00
nossr50
225045b49f Bad Design Removal WIP Part 3 2019-06-30 12:10:54 -07:00
nossr50
87af2419a3 Part 2 of removing bad design patterns 2019-06-27 03:04:34 -07:00
nossr50
5ee862effd Temporarily comment out the API since we're about to break everything 2019-06-27 00:01:58 -07:00
nossr50
6504e06b5f Part 1 of removing some bad design patterns 2019-06-27 00:00:41 -07:00
nossr50
1c9e5ba542 Apply changes from 2.1.90 to 2.2 2019-06-26 22:47:03 -07:00
nossr50
bc0a59d6fb Apply changes from 2.1.89 to 2.2 2019-06-26 22:40:05 -07:00
nossr50
b069480244 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-26 21:55:41 -07:00
nossr50
9092e70544 Check the projectile type instead of main hand item 2019-06-25 22:44:14 -07:00
nossr50
517ca6568f Increase compatiblility with crazy enchants 2019-06-25 22:29:02 -07:00
nossr50
3368625dde 2.1.90 2019-06-25 18:21:14 -07:00
nossr50
2eb330f070 Mining XP values tweaked 2019-06-25 18:20:56 -07:00
nossr50
74a2485cff Multiple tweaks to how salvaged items travel towards a player 2019-06-25 18:02:16 -07:00
nossr50
03efd14ff4 2.1.89 2019-06-24 23:33:17 -07:00
nossr50
e71c95139d RetroMode is now the default mode. 2019-06-24 23:31:31 -07:00
nossr50
d9b84b0ab3 Check mining rank before processing double drops 2019-06-24 23:25:15 -07:00
nossr50
421d6cff3b Tweak archaeology numbers 2019-06-24 22:48:22 -07:00
nossr50
ccb86264d9 Update excavation command 2019-06-24 22:31:21 -07:00
nossr50
ee2a1b332e tweak Archaeology rewards 2019-06-24 22:30:20 -07:00
nossr50
2dda0bf27a Fix some WG logic + Archaeology stat display 2019-06-24 21:25:51 -07:00
nossr50
d347fa9512 Add information about Archaeology to /excavation and tweak some locale
strings related to excavation
2019-06-24 20:54:26 -07:00
nossr50
913323245c Archaeology now does something 2019-06-24 20:27:50 -07:00
nossr50
68ad507be3 Skills which used to unlock at level 5 now unlock at level 1 and some
tweaks to  ranks of other skills, and length scaling for super
abilities. Early game boost has also been modified.
2019-06-24 20:17:35 -07:00
nossr50
764b4c20f5 Tools with durability enchant will be damaged properly by super
abilities again (at a reduced rated)
2019-06-24 17:49:02 -07:00
nossr50
a135e08e12 Improved WG compatibility + Tree Feller will now damage unbreaking
enchant tools again
2019-06-24 17:32:05 -07:00
Robert A. C
214974e3a3 Merge pull request #3968 from snake0053/master
Update locale_ja_JP.properties
2019-06-23 12:01:53 -07:00
nossr50
3673d3fb7b Tree Feller bug fix 2019-06-23 12:00:49 -07:00
nossr50
f6ad530660 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-06-23 11:56:41 -07:00
SNAKE0053
046daa43fa Update locale_ja_JP.properties 2019-06-24 00:11:24 +09:00
Robert A. C
cc1c5239dc Merge pull request #3967 from EvilOlaf/patch-5
Update locale_de.properties
2019-06-23 01:26:09 -07:00
Werner
4fafb5731e Update locale_de.properties 2019-06-23 10:00:07 +02:00
nossr50
9ab4d59cca mcMMO will ignore damage triggers for events with a value of zero 2019-06-22 22:35:25 -07:00
nossr50
89e988660d Tweaks 2019-06-22 20:18:14 -07:00
nossr50
121f881d59 More work on the new repair system 2019-06-22 19:21:57 -07:00
nossr50
68864dae2d 2.1.87 2019-06-22 15:06:24 -07:00
nossr50
ae6d377abb Fixing a mistake when grabbing level cap 2019-06-22 15:03:51 -07:00
nossr50
b479d45f14 Level Cap bugfixes and tweaks 2019-06-22 14:48:16 -07:00
nossr50
e17afe31a5 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-06-22 13:05:58 -07:00
nossr50
5c31bdbd49 Lets generify some of this stuff 2019-06-22 13:05:28 -07:00
Robert A. C
5f115d5e4a Merge pull request #3966 from EvilOlaf/patch-1
Update locale_de.properties
2019-06-22 08:28:33 -07:00
Werner
1984131874 Update locale_de.properties 2019-06-22 13:33:03 +02:00
nossr50
d843108164 More work on the repair rewrite, fleshing out more serializers 2019-06-21 18:26:02 -07:00
nossr50
d782d64750 Simplify the design of Repairable 2019-06-21 15:10:43 -07:00
nossr50
0b4e2b48c9 Dev mode 2019-06-21 12:45:31 -07:00
nossr50
0050a73be8 NBT WIP 2019-06-21 10:46:27 -07:00
nossr50
099dfcb0e5 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-21 09:19:03 -07:00
nossr50
6aa53823f1 Small changelog edits 2019-06-21 09:10:53 -07:00
nossr50
7f567585e2 2.1.86 2019-06-21 08:12:00 -07:00
nossr50
c6d604bbbc Inspect, Salvage, and Locale fixes 2019-06-21 08:05:57 -07:00
nossr50
c7fadf02e6 Repair rewrite continues 2019-06-21 05:50:37 -07:00
nossr50
55609249ed Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-20 00:09:50 -07:00
nossr50
5698d8282c 2.1.85 2019-06-20 00:02:48 -07:00
nossr50
b41a30fa26 Repair rewrite continues 2019-06-19 23:28:11 -07:00
nossr50
458e198fdb More work on new repair datatypes 2019-06-18 23:08:14 -07:00
nossr50
1e338e6aec Flesh out RepairCost some more 2019-06-18 23:02:20 -07:00
nossr50
8f04b83954 RepairableBuilder, ItemStackSerializer WIP 2019-06-18 22:14:32 -07:00
nossr50
c0685bd1eb PermissionWrapper WIP 2019-06-18 18:07:06 -07:00
nossr50
29670cd66f Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-18 15:46:20 -07:00
nossr50
83636644b1 2.1.84 2019-06-18 15:28:56 -07:00
nossr50
fa6995b9fd You can no longer set fire to party members 2019-06-18 14:04:42 -07:00
nossr50
c83d38b5c2 Arrow Retrieval will no longer work with piercing enchant 2019-06-18 13:06:26 -07:00
nossr50
27d25ad321 Taming config WIP 2019-06-18 09:33:31 -07:00
Robert A. C
31e9abd8eb Merge pull request #3960 from andris155/patch-1
Update locale_hu_HU.properties
2019-06-18 09:00:34 -07:00
András Marczinkó
43b7abafe7 Update locale_hu_HU.properties 2019-06-18 16:29:06 +02:00
András Marczinkó
483134df10 Update locale_hu_HU.properties 2019-06-18 16:22:48 +02:00
nossr50
a6a734befe Repair rewrite pt 2 WIP 2019-06-17 16:36:37 -07:00
nossr50
18fd9bbf9b Repair rewrite pt 1 - WIP 2019-06-17 14:01:44 -07:00
nossr50
bca1298918 Wire up swords config 2019-06-17 11:03:40 -07:00
nossr50
87f0171969 Add swords config values 2019-06-17 10:54:53 -07:00
nossr50
8b2d1eb1d8 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-17 10:37:57 -07:00
nossr50
b612a599de 2.1.82 2019-06-17 08:26:21 -07:00
nossr50
2cecc91026 WG Hardcore penalty flag 'mcmmo-hardcore' 2019-06-17 08:25:37 -07:00
nossr50
38bc60ba86 Inspecting offline players no longer requires permissions + fixing
errors when using mcrank on an offline player
2019-06-17 08:19:15 -07:00
nossr50
4e4d798b1d Add proper error handling to file loading 2019-06-17 07:38:30 -07:00
nossr50
218b2a1a75 Double check that a Player is not an NPC when loading profiles 2019-06-17 07:00:39 -07:00
nossr50
12964a816d RepairWildcard wip 2019-06-16 12:41:14 -07:00
nossr50
3a89ba2139 Wire up salvage config options 2019-06-16 09:12:42 -07:00
nossr50
303b12b79f Add Smelting config options 2019-06-16 09:10:59 -07:00
nossr50
84704007ac Fix abilities wearing off instantly 2019-06-16 06:55:51 -07:00
nossr50
5a48b568ef Fix sounds being disabled by default 2019-06-16 06:46:25 -07:00
Robert A. C
73ce7e729c Merge pull request #3958 from 89009332/patch-9
Update locale_zh_CN.properties
2019-06-16 06:15:34 -07:00
89009332
d67cbe2861 Update locale_zh_CN.properties 2019-06-16 21:09:34 +08:00
nossr50
726369077e Fixing some issues with reloading 2019-06-16 05:57:52 -07:00
nossr50
2d1472b913 Fix Blast Mining and /mining command 2019-06-16 05:17:12 -07:00
nossr50
a1e3bb18a4 Fix double drops for mining 2019-06-16 04:59:34 -07:00
nossr50
43ca43cc48 Fix repair command 2019-06-16 01:42:30 -07:00
nossr50
278efc8e37 Fix repair logic 2019-06-16 01:13:39 -07:00
nossr50
3cde1400d1 Skill Ceiling removed 2019-06-16 00:17:21 -07:00
nossr50
3e01b413b4 Fix Salvage section in exploit conf 2019-06-16 00:07:34 -07:00
nossr50
8320b89b9f Add Herbalism subskill properties to config 2019-06-16 00:05:36 -07:00
nossr50
fb08bbb79d Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-15 23:51:36 -07:00
nossr50
c3f38cdabd A few typos in javdocs 2019-06-15 21:22:21 -07:00
nossr50
8f55a6277a Fix Repair enchant logic 2019-06-14 20:44:33 -07:00
nossr50
ef71661db1 2.1.81 2019-06-14 20:39:57 -07:00
nossr50
4f2e3f4399 Update axes to the new naming scheme 2019-06-14 15:51:26 -07:00
nossr50
dac447f381 Add missing skill properties to archery config 2019-06-14 15:46:13 -07:00
nossr50
8eba1dda1f Add Set<?> serializer + fix some errors 2019-06-14 13:49:01 -07:00
nossr50
ffa35d0179 Fix leveling + Fix Roll 2019-06-14 12:00:47 -07:00
nossr50
e7e28ec3cb Wire up unarmed config 2019-06-14 11:36:21 -07:00
nossr50
ab56464bc4 Add disarm config settings 2019-06-14 11:16:46 -07:00
nossr50
43600ef800 Add and wire up Herbalism AFK exploit toggle 2019-06-13 18:12:10 -07:00
nossr50
b4e612b15b Fix skill property registration method 2019-06-13 16:48:49 -07:00
nossr50
9e336c8a6f Reduce console spam 2019-06-13 16:19:59 -07:00
nossr50
29a712ca80 Fixing some mistakes with FQNs 2019-06-13 16:14:59 -07:00
nossr50
18a28a87b1 Fix mistake when registering fully qualified names 2019-06-13 15:57:44 -07:00
nossr50
307bf8b332 SoundSettingSerializer 2019-06-13 15:28:06 -07:00
nossr50
86a4b74eb3 Wire up sound config 2019-06-13 14:02:15 -07:00
nossr50
6f3b90d0dd Sound Config 2019-06-13 13:43:10 -07:00
nossr50
f0cce29d71 Rewrite NotificationManager to handle more flexible config options 2019-06-13 12:43:51 -07:00
nossr50
8abccfc9cd Rewrite of McMMOPlayerNotificationEvent 2019-06-13 11:28:10 -07:00
nossr50
adefda42df Dev mode 2019-06-12 14:43:13 -07:00
nossr50
9c04054017 2.1.80 2019-06-12 12:23:58 -07:00
nossr50
bdd0335d0b Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-12 11:07:54 -07:00
nossr50
7ab70ba597 2.1.79 2019-06-12 11:05:16 -07:00
nossr50
a97f1b208f NotificationManager now uses a getter in mcMMO 2019-06-12 10:54:05 -07:00
Robert A. C
0abccd105d Merge pull request #3953 from snake0053/master
Update locale_ja_JP.properties
2019-06-12 10:43:08 -07:00
nossr50
473e4586c9 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-12 10:40:04 -07:00
SNAKE0053
15b34e2056 Update locale_ja_JP.properties 2019-06-13 02:35:39 +09:00
nossr50
ae551a6bc1 2.1.78 2019-06-12 10:22:20 -07:00
nossr50
98f6eac50c Super Abilities don't do extra durability damage to tools with the
unbreaking enchantment
2019-06-12 10:18:43 -07:00
nossr50
b0f09c8e7b Add PlayerNotificationSerializer 2019-06-12 10:01:18 -07:00
nossr50
b03abcdee8 Add notification settings 2019-06-12 09:51:22 -07:00
nossr50
963d0a1897 Fixed a bug where shovels took too many materials to repair 2019-06-12 06:20:20 -07:00
nossr50
b29d87df8c Add ScrapCollector and wire up profile loading message toggle 2019-06-12 05:44:25 -07:00
nossr50
a654762f4d Yikes that was a lot of merge conflicts. 2019-06-12 05:26:45 -07:00
nossr50
705285878f Diagnosing myself with dyslexia 2019-06-11 03:57:28 -07:00
nossr50
e1dcb65888 Add back in the comment about min quantity 2019-06-11 03:52:45 -07:00
nossr50
9062dbcaae Add minimum quantity back to the repair config 2019-06-11 03:50:13 -07:00
nossr50
97c98969ff 2.1.76 2019-06-10 22:49:47 -07:00
nossr50
3fe47c939a You can not salvage without 1 rank in Scrap Collector now (unlocks at
level 2)
2019-06-10 22:46:03 -07:00
nossr50
46dee3c9b6 Numerous tweaks to salvage + fixing repair bugs 2019-06-10 22:37:20 -07:00
nossr50
8e67e2d158 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO 2019-06-10 16:33:30 -07:00
nossr50
f5f4182a90 2.1.75 2019-06-10 16:14:24 -07:00
Robert A. C
05087e569a Merge pull request #3950 from 89009332/patch-8
Update locale_zh_CN.properties
2019-06-09 20:16:38 -07:00
89009332
77bde61f4b Update locale_zh_CN.properties 2019-06-10 09:17:07 +08:00
nossr50
1297b45ef8 2.1.74 2019-06-09 07:08:26 -07:00
nossr50
83b55db4f8 2.1.73 2019-06-09 05:53:39 -07:00
nossr50
caec01e9fa 2.1.72 2019-06-09 05:12:56 -07:00
nossr50
2be67bae19 Fixed a NPE that could occur if Roll was disabled in coreskills.yml 2019-06-09 05:10:30 -07:00
nossr50
a677450d50 Fix NPE on server shutdown with no user data 2019-06-09 05:07:34 -07:00
nossr50
1d7919c050 2.1.71 2019-06-08 10:21:12 -07:00
nossr50
a132172507 You can no longer repair/salvage item stacks with more than one item 2019-06-08 10:20:22 -07:00
nossr50
549ef5734e Repair now always requires confirmation 2019-06-07 10:32:55 -07:00
nossr50
77fbf7f51e Salvage always asks for confirmation before breaking an item 2019-06-07 10:26:49 -07:00
nossr50
e37820d25e 2.1.70 2019-06-07 05:14:51 -07:00
nossr50
00bee60151 Prevent tool ready messages on shulker boxes 2019-06-07 05:13:37 -07:00
nossr50
c58a36e604 Most the functionality of SkillPropertiesManager is in place, but not
yet complete
2019-06-07 04:07:43 -07:00
nossr50
3c3bc338f2 Add serializer for MaxBonusLevel 2019-06-07 01:24:11 -07:00
nossr50
80beb92a06 Rewrote how Arrow Retrieval subskill is handled 2019-06-07 01:18:14 -07:00
nossr50
39b5719e12 Fill in Daze/Skill Shot for Archery config 2019-06-07 00:31:59 -07:00
nossr50
7679afd3e0 Add new DatabaseAPI 2019-06-06 23:15:18 -07:00
nossr50
0b0408ef98 2.1.70 dev mode 2019-06-06 21:42:12 -07:00
nossr50
5eb80f9277 Add skill shot config settings 2019-06-06 08:09:27 -07:00
nossr50
d879575d5f Wire up PVP/PVE settings 2019-06-06 06:07:05 -07:00
nossr50
51a57429b6 Add PVP/PVE settings to core skill config 2019-06-06 05:58:44 -07:00
nossr50
3e75026281 Wire up Hardcore/Vampirism 2019-06-06 05:31:13 -07:00
nossr50
c698bed05e Setup the hardcore/vampirism config 2019-06-06 05:25:37 -07:00
nossr50
237311a98f Fix spelling mistake + Wire up ChimaeraWing 2019-06-06 04:19:01 -07:00
nossr50
240ab0a0af Add Chimaera Wing to the items config 2019-06-06 03:38:09 -07:00
nossr50
582c9a6726 Correct the name of FastFoodService for rank config 2019-06-06 02:03:31 -07:00
nossr50
fc2077ffdb Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-06 01:58:52 -07:00
nossr50
58cde322f5 Add shoutout to changelog 2019-06-06 01:53:59 -07:00
nossr50
0638f4c437 2.1.69 2019-06-05 23:50:39 -07:00
nossr50
426b2d27e7 Fix NPE for new data tracker 2019-06-05 21:43:07 -07:00
nossr50
3ce3ac5350 mcMMO should no longer lose a few minutes of player data from shutting
down the server
2019-06-05 21:11:44 -07:00
nossr50
94df19bdb4 Converting some remaining float literals to double literals 2019-06-04 21:18:51 -07:00
nossr50
fc6c6ed2c4 Using doubles in most places again to avoid precision loss 2019-06-04 21:12:10 -07:00
nossr50
32fa6cee96 Fix some issues with the CustomXPPerkSerializer 2019-06-04 20:00:25 -07:00
nossr50
ffe27326e3 Move serializers 2019-06-04 19:33:29 -07:00
nossr50
97b70ec2a1 Correcting issues with deserializing SkillRankProperty 2019-06-04 19:03:20 -07:00
nossr50
e5592919b7 Add SkillRankProperty serializer 2019-06-04 14:58:17 -07:00
nossr50
b2dc322a2b Remove the old rank config file 2019-06-04 13:13:41 -07:00
nossr50
cf6a4c804a Rewrote how SkillRanks were pulled for the new config system 2019-06-04 13:11:45 -07:00
nossr50
b62bd0e620 Fill in Excavation rank config 2019-06-03 06:13:35 -07:00
nossr50
86a46babc1 Fill in Woodcutting rank config 2019-06-03 06:09:20 -07:00
nossr50
0bafcb659b Fill in Unarmed rank config 2019-06-03 05:56:03 -07:00
nossr50
9db152ebc8 Fill in Swords rank config 2019-06-03 05:52:53 -07:00
nossr50
ef44a43bd2 Fill in rank configs for Fishing 2019-06-03 05:48:15 -07:00
nossr50
bdc44f6ede Fill in rank config for Herbalism 2019-06-03 05:44:22 -07:00
nossr50
0e70c9ce75 Fill in Mining rank info 2019-06-03 05:42:42 -07:00
nossr50
2d1d2693ed Fill in Salvage rank information 2019-06-03 04:44:16 -07:00
nossr50
c33d6e62b7 Fill in Smelting rank information 2019-06-03 04:39:50 -07:00
nossr50
fd78ce278e Fill in Taming subskill rank information 2019-06-03 04:34:54 -07:00
nossr50
5ca027650e Add ConfigRanks WIP (axes, acrobatics, archery so far) 2019-06-03 04:17:23 -07:00
nossr50
e05078b280 Some misc cleanup, including removing some leftover April Fools stuff 2019-06-03 02:36:29 -07:00
nossr50
12c0b19776 Stringify ConfigExperienceWoodcutting 2019-06-03 02:01:28 -07:00
nossr50
f898525362 Stringify ConfigExperienceMining 2019-06-03 01:57:25 -07:00
nossr50
f53bd1ab03 Stringify ConfigExperienceHerbalism 2019-06-03 01:51:58 -07:00
nossr50
c82f60e08b Custom serializer for SkillCeiling 2019-06-03 01:09:06 -07:00
nossr50
8c1c17fa17 Custom Serializer for DamageProperty 2019-06-03 01:02:45 -07:00
nossr50
7a0ef0d4ed Making the compiler happy 2019-06-03 00:31:46 -07:00
nossr50
29876b4a20 SkillProperty no longer has an identifier for SubSkillType 2019-06-02 23:24:30 -07:00
nossr50
fc7455354f Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-02 23:04:52 -07:00
nossr50
4048ecc764 Fixing some imports 2019-06-02 22:42:03 -07:00
nossr50
f93a1aa151 2.1.68 - You can use food in the off hand with the diet abilities now. 2019-06-02 22:41:13 -07:00
nossr50
f6dc76719a Update changelog 2019-06-02 20:10:40 -07:00
Robert A. C
3035af97a4 Merge pull request #3940 from snake0053/master
Update locale_ja_JP.properties
2019-06-02 20:08:26 -07:00
SNAKE0053
3832ef3547 Update locale_ja_JP.properties 2019-06-02 05:50:26 +09:00
nossr50
8b4cea5dab Chimaera Wing should not be disabled by default 2019-06-01 12:26:11 -07:00
nossr50
4e7e2daf3c Fix issues in the ExperienceBarWrapper 2019-06-01 03:23:08 -07:00
nossr50
9dfbb14c39 Wire up the new Axes config 2019-06-01 03:16:30 -07:00
nossr50
cb9a4e5e5d Greater Impact settings & some refactoring for Axes config 2019-06-01 02:11:31 -07:00
nossr50
5af60e2fe1 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-06-01 01:58:21 -07:00
nossr50
9111590dc2 2.1.67 2019-05-31 19:46:14 -07:00
nossr50
9d47234918 Add private keyword 2019-05-31 18:52:28 -07:00
nossr50
299c989dd4 Add Axes Critical Strikes to new configs 2019-05-31 18:49:24 -07:00
nossr50
00131bb412 DamageProperty for skills 2019-05-31 18:42:23 -07:00
nossr50
186ad2cd59 Add MaximumProgressLevel interface and implementation 2019-05-31 01:45:57 -07:00
nossr50
19acf47f1e Add Armor Impact settings to Axes config 2019-05-30 18:59:50 -07:00
nossr50
01bffc6670 Fixing a typo of sorts 2019-05-30 16:17:02 -07:00
nossr50
1532791c3f Still some work to do, but now the convert XP command is less clunky 2019-05-30 16:12:32 -07:00
nossr50
84b9b255aa Parties now use the same formula for leveling as players 2019-05-30 15:52:13 -07:00
nossr50
61e46b6f10 Fixing some tab completion bugs for mcconvert 2019-05-30 15:48:29 -07:00
nossr50
8d10f8053f Removing the clunky previous formula file design 2019-05-30 15:33:57 -07:00
nossr50
b27d46f0cc Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-29 14:06:55 -07:00
nossr50
ff1bb0deed 2.1.66 2019-05-29 11:01:02 -07:00
nossr50
4795143fca Fixed a memory leak in MySQL that would cause errors if users were
removed from the DB
2019-05-29 10:14:04 -07:00
nossr50
54eca5b8ba Fixed a bug where RetroMode would always use Linear formula 2019-05-27 20:13:22 -07:00
nossr50
11f669f8f4 2.1.64 2019-05-27 19:27:35 -07:00
nossr50
1cda612e86 Fixed a bug that would spam other players when someone used an ability 2019-05-27 19:25:36 -07:00
nossr50
50e4e971d9 Standard level scaling now mirrors RetroMode in a true 1:10 parity 2019-05-27 17:37:54 -07:00
nossr50
33dd34931c Add missing credits to snake for ja_JP 2019-05-21 15:24:45 -07:00
nossr50
ce230bf403 2.1.63 2019-05-21 13:28:22 -07:00
Robert A. C
d7b2a98723 Merge pull request #3934 from andris155/patch-6
Update locale_hu_HU.properties
2019-05-21 13:27:34 -07:00
nossr50
bfb48ccea3 Buffed Impact durability damage and fixed it 2019-05-21 13:13:17 -07:00
András Marczinkó
8cd39301a3 Update locale_hu_HU.properties 2019-05-21 19:11:28 +02:00
nossr50
321684e5f6 Fixed a bug where creative players could gain XP if they qualified for
early game XP boosts
2019-05-19 17:34:51 -07:00
nossr50
b6d11e655d Minor changelog edit 2019-05-19 17:29:22 -07:00
nossr50
04fb4c30fe Fix compiler errors 2019-05-18 16:25:52 -07:00
nossr50
04b4a8e069 Remove redundant operations on LimitedSizeList 2019-05-18 15:49:14 -07:00
nossr50
1e1b803cce Wire up mining exploit toggle 2019-05-18 15:47:36 -07:00
nossr50
3d576eaa6a Add mining exploit settings + delegate methods to exploit config 2019-05-18 15:45:43 -07:00
nossr50
087df05e77 Add wandering trader xp 2019-05-18 15:38:39 -07:00
nossr50
05936b3c75 Add missing chiseled_* xp values 2019-05-18 15:35:02 -07:00
nossr50
c10853def9 Add missing mossy_* xp values 2019-05-18 15:33:39 -07:00
nossr50
08baa5993e Remove duplicate mossy cobblestone entry 2019-05-18 15:02:02 -07:00
nossr50
0396039d50 Add missing stone_brick_* xp values 2019-05-18 14:57:42 -07:00
nossr50
4aa81f1023 Add bamboo XP 2019-05-18 14:55:17 -07:00
nossr50
4bd3f8d6bd Add wither rose XP 2019-05-18 14:54:07 -07:00
nossr50
4627df1160 Add lilly of the valley xp 2019-05-18 14:53:32 -07:00
nossr50
a72c45766f Add cornflower xp 2019-05-18 14:52:56 -07:00
nossr50
4ced61e4fc Add sweet berry bush 2019-05-18 14:52:02 -07:00
nossr50
c237601af6 Lower guardian XP 2019-05-18 14:48:41 -07:00
nossr50
3a88193459 Add magma block 2019-05-18 14:47:38 -07:00
nossr50
65a234c6b3 Wire up admin notification toggle 2019-05-18 14:46:48 -07:00
nossr50
9fb9228869 Wire up events config 2019-05-18 14:08:33 -07:00
nossr50
ca8293bc35 Add new config for events 2019-05-18 13:57:23 -07:00
nossr50
9c5ec234d9 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-18 13:21:36 -07:00
Robert A. C
0b247dfae7 Merge pull request #3932 from snake0053/japanese-translate
Update locale_ja_JP.properties
2019-05-18 11:55:19 -07:00
SNAKE0053
d46fae2d1a Update locale_ja_JP.properties 2019-05-19 03:46:48 +09:00
nossr50
5d6690fc1a 2.1.62 2019-05-18 11:06:48 -07:00
nossr50
66425ba48d Add UUID to admin notifications 2019-05-18 10:59:52 -07:00
nossr50
3b3a36c64d Updating changelog 2019-05-18 10:51:21 -07:00
nossr50
2433ef5db7 Move admin notification toggle check 2019-05-18 10:47:37 -07:00
nossr50
663757352a Tweak xp rate admin notification messages 2019-05-18 10:45:50 -07:00
nossr50
1ced5d8ffc Confirmation messages for admin commands are now moved into the
convenience methods in NotificationManager
2019-05-18 10:40:06 -07:00
nossr50
04c6bd8750 Admin notifications convenience methods handled by NotificationManager 2019-05-18 10:09:45 -07:00
nossr50
b0dc41b4d9 Encapsulate admin notifications + add prefix 2019-05-18 08:12:32 -07:00
nossr50
92e6cedb14 This is why you don't program when you haven't slept in 20 hours 2019-05-18 08:04:55 -07:00
nossr50
447ce97f24 Send message to correct player 2019-05-18 08:03:39 -07:00
nossr50
2a471e409c Fix mistake in new admin notification locale 2019-05-18 08:02:16 -07:00
nossr50
08223bd320 Hotfix for repairing diamond, nerf guardian xp rate 2019-05-18 08:01:15 -07:00
nossr50
90480ca626 Add missing Magma_Block xp value 2019-05-17 15:45:07 -07:00
Robert A. C
56b031b99d Merge pull request #3930 from andris155/patch-1
Update locale_hu_HU.properties
2019-05-17 04:28:15 -07:00
nossr50
f3cbd450d0 Admin chat now sends useful information to admins/adminchat permissible
players
2019-05-17 04:27:27 -07:00
András Marczinkó
b176fd9bca Update locale_hu_HU.properties 2019-05-17 13:08:49 +02:00
nossr50
1c130aad42 2.1.61 - Some fixes + Exploit prevention 2019-05-16 13:30:43 -07:00
nossr50
734dfcdec5 Add toggle to disable event information on player join 2019-05-16 11:40:47 -07:00
nossr50
c8a32b8b38 Add toggle for event broadcasts - General.EventBroadcasts 2019-05-16 11:34:26 -07:00
nossr50
ed3ec3aa40 Add note about JP locale update 2019-05-16 11:29:45 -07:00
nossr50
88d8d0e6bb Fix the Double Drop string in the mining command 2019-05-16 11:20:51 -07:00
nossr50
b532b42db3 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-15 16:39:49 -07:00
Robert A. C
a763f7f025 Merge pull request #3928 from snake0053/translate
Update locale_ja_JP.properties
2019-05-15 09:52:54 -07:00
SNAKE0053
357e9cc08f Update locale_ja_JP.properties 2019-05-16 01:11:25 +09:00
nossr50
f0d6f7077b Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-14 23:01:05 -07:00
nossr50
2746bac86a 2.1.60 2019-05-14 16:16:24 -07:00
nossr50
95652efbaa Fix bonus drops on multi-block crops 2019-05-14 16:14:01 -07:00
nossr50
e70e5b04b5 Remove unecessary parameter 2019-05-14 15:29:15 -07:00
nossr50
34869914c4 Wolfs no longer kill themselves + tamed mob heart death message bug 2019-05-14 15:14:30 -07:00
nossr50
a53505ee0b Raised overfishing limit + improved tips 2019-05-13 08:53:22 -07:00
nossr50
f0e64d992b Remove unecessary check 2019-05-13 08:45:00 -07:00
nossr50
c61c55031d Core skill config is now converted 2019-05-13 08:36:37 -07:00
nossr50
39d10855d8 Temporarily add them back in :juice: 2019-05-13 08:21:24 -07:00
nossr50
aeb518f38c Don't make unecessary folders 2019-05-13 08:18:28 -07:00
nossr50
d3a719eb8d Experience configs are now fully converted 2019-05-13 05:32:49 -07:00
nossr50
ab4b4edb1a Wire up Repair XP values 2019-05-13 05:31:34 -07:00
nossr50
591c9e67a3 Wire up XP bar settings 2019-05-13 05:25:40 -07:00
nossr50
59c8d16374 XP Bar settings 2019-05-13 05:17:00 -07:00
nossr50
3a6d94e682 Cleanup 2019-05-13 04:00:08 -07:00
nossr50
2b0931314a Wire up smelting XP values 2019-05-13 03:57:23 -07:00
nossr50
d1298c0cd2 Further cleanup 2019-05-13 03:49:33 -07:00
nossr50
3f6a33dea6 Refactoring experience manager 2019-05-13 03:39:24 -07:00
nossr50
d8841c6ae7 Add + Wire up Combat XP Multipliers 2019-05-13 03:33:33 -07:00
nossr50
2e3f9b4a96 Add + Wire DiminishingReturn config values
Removed the experience multiplier from the xp conversion task, it just
seems like something very unecessary
2019-05-13 02:55:20 -07:00
nossr50
6425cd18b8 Temporarily hold party settings in DSM (will be removed later) 2019-05-13 02:05:44 -07:00
nossr50
86b98368bc Move API checks into their own class 2019-05-13 01:58:27 -07:00
nossr50
b5eb942682 Catch all exceptions not just NPE 2019-05-13 01:40:54 -07:00
nossr50
f7e6e3adb6 Add notes about the API changes to changelog 2019-05-13 01:37:32 -07:00
nossr50
ca4f15df46 More refactoring, made the changelog less noisy 2019-05-13 01:32:52 -07:00
nossr50
2c8b8658a3 Update classes to use DSM over CM 2019-05-13 01:27:48 -07:00
nossr50
80163c0d8f Cleaning up mcMMO.java 2019-05-13 01:15:53 -07:00
nossr50
72fc3efa78 DynamicSettingsManager - Handles platform specific datasets
Converts datasets from the config into ready to use platform specific
ones
Currently only supports Bukkit, that will change later
Expect API breakages if you hook into this class
2019-05-13 00:53:29 -07:00
nossr50
d614df65a7 unbox some floats 2019-05-12 03:48:25 -07:00
nossr50
3123f69aec Setup combat XP map - Use float in more places 2019-05-12 03:46:23 -07:00
nossr50
1c6b0363ce Step 1 of rewriting Alchemy - Removing all the old code 2019-05-12 00:53:15 -07:00
nossr50
ddb92af400 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-11 20:54:29 -07:00
nossr50
ed1831da78 Fixed the wrong locale string being used for Mining DD 2019-05-11 12:45:00 -07:00
nossr50
774ee65677 Fixing Alchemy Part 1 2019-05-10 17:23:02 -07:00
nossr50
61ae372694 Collection manager init now handles mapping values from collections 2019-05-10 12:30:59 -07:00
nossr50
945359b408 Add failsafes to repairables 2019-05-10 12:17:31 -07:00
nossr50
06bf814fcf Add failsafes to Salvageables 2019-05-10 12:16:26 -07:00
nossr50
cc1eae150a Fixed salvage deserializer swapping signature parameters 2019-05-10 11:30:50 -07:00
nossr50
7ad0a61c53 Fix casting, remove unused mod configs 2019-05-10 11:20:16 -07:00
nossr50
48a3621ac6 Avoid race conditions 2019-05-10 09:49:43 -07:00
nossr50
4ab688b302 Add custom serializer registration for CustomXPPerk 2019-05-08 12:14:09 -07:00
nossr50
8cfeaf34f3 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-08 12:10:31 -07:00
nossr50
ad550759e6 Fixed an incredibly rare and difficult to perform dupe bug 2019-05-08 10:24:34 -07:00
nossr50
ca7cf5cc58 Unlimited custom XP perks part 2 2019-05-08 09:50:19 -07:00
nossr50
40598a0e96 Unlimited custom xp perks Part 1 2019-05-08 06:44:19 -07:00
Robert A. C
984518d9f5 Merge pull request #3925 from SpiderRobotMan/patch-1
Fix small grammar mistake in README
2019-05-07 06:40:19 -07:00
Daniel Bethel
e0055eeead Fix small grammar mistake in README 2019-05-07 09:37:08 -04:00
nossr50
0331c98c9b Add and wire up skill specific xp formula multipliers 2019-05-07 00:18:50 -07:00
nossr50
c968b9f94a Add and wire up Early Game Boost settings 2019-05-07 00:09:31 -07:00
nossr50
8033bc577c Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-06 19:46:58 -07:00
nossr50
fe07261846 Very large update to the chinese language 2.1.56 2019-05-06 03:52:22 -07:00
Robert A. C
0cbb9b22a5 Merge pull request #3922 from 89009332/patch-7
Update locale_zh_CN.properties
2019-05-06 00:29:28 -07:00
89009332
31ccf2ca02 Update locale_zh_CN.properties 2019-05-06 15:25:41 +08:00
nossr50
08269cab5b Add back in the UUID upgrade classes just in case anyone from 2014 shows
up
2019-05-06 00:19:42 -07:00
nossr50
71a2ea2a2e Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-05 23:50:40 -07:00
nossr50
23b7e11dd1 Fixed bugs that could occur while updating old DBs to have UUIDs 2019-05-05 16:41:42 -07:00
nossr50
ecac8d00ee Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-04 05:31:44 -07:00
nossr50
588b6f3692 Fixed the furnace XP bug 2019-05-04 04:08:56 -07:00
nossr50
620f2fc4f8 Revert some state changes 2019-05-04 01:09:25 -07:00
nossr50
3e61dc6c5f Some cleanup to BonusDrops & reducing expensive state calls 2019-05-04 00:48:35 -07:00
nossr50
a919c45b09 Fixing Java naming conventions for constants in mcMMO.java also added
some Javadocs
2019-05-03 23:39:49 -07:00
nossr50
8a312da0f5 Merge 2.1.53 2019-05-03 23:31:08 -07:00
nossr50
cdf6e607de 2.1.53 - Fixed critical XP bug 2019-05-03 15:04:40 -07:00
nossr50
29835a3316 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-05-03 03:46:28 -07:00
nossr50
f61917e8fe 2.1.52 2019-05-03 01:08:29 -07:00
Robert A. C
661564df36 Merge pull request #3914 from snake0053/master
Update locale_ja_JP.properties
2019-05-01 14:39:56 -07:00
SNAKE0053
0a7c852d89 Update locale_ja_JP.properties 2019-05-01 16:57:58 +09:00
nossr50
c1379f7ac6 2.1.51 - mikroskeem patch 2019-04-30 17:26:14 -07:00
nossr50
22ef134c84 Update changelog 2019-04-30 17:20:23 -07:00
nossr50
9157a08a3b Stashing changes.. oh wait 2019-04-30 17:02:08 -07:00
nossr50
3997a44fce Merge 2.1.51 2019-04-30 17:01:45 -07:00
Robert A. C
7f95956a01 Merge pull request #3911 from mikroskeem/feature/locale-reload-command
Add a command to reload locale
2019-04-30 11:33:08 -07:00
Mark Vainomaa
40ea101bf6 Add a command to reload locale 2019-04-30 21:19:55 +03:00
Robert A. C
0c8b001d05 Merge pull request #3910 from mikroskeem/feature/locales-in-plugin-data-folder
Try to load locale from plugin data folder first
2019-04-30 10:33:28 -07:00
Mark Vainomaa
5dc9c3f732 Note user that locale is loaded from locales directory 2019-04-30 20:14:42 +03:00
Mark Vainomaa
ec574a6b63 Cache raw messages from resource bundles
Should speed things up a bit as next message lookups are from single
hashmap instead
2019-04-30 17:58:37 +03:00
Mark Vainomaa
1ca48051ad Dedicated directory for locales 2019-04-30 14:08:43 +03:00
nossr50
4d8e4d0e70 Wire up Mining/Excavation/Herbalism/Woodcutting XP values 2019-04-30 02:08:11 -07:00
nossr50
2efa64ae17 wire up taming XP 2019-04-30 01:46:59 -07:00
nossr50
e5441f2a96 Taming XP values are now converted to an enum mpa and managed by ExperienceMapManager 2019-04-30 01:39:06 -07:00
nossr50
06016f4ada Wire up special combat XP multipliers 2019-04-30 00:57:50 -07:00
nossr50
6932abc9d8 Create fully qualified name : integer maps from user configs, wiring up some global xp settings 2019-04-30 00:42:09 -07:00
Mark Vainomaa
0f2e1ea740 Fall back to locale loaded from JAR when filesystem one doesn't have requested key 2019-04-30 09:29:04 +03:00
Mark Vainomaa
c2d4aeaf85 Try to load locale from plugin data folder first 2019-04-30 09:29:04 +03:00
nossr50
faed690602 Add mcMMO reload command "/mcmmoreload" 2019-04-29 22:55:39 -07:00
nossr50
7b3f69aee6 Add config reload 2019-04-29 22:37:46 -07:00
nossr50
6e173c0d4e Add per-skill global multiplier default values 2019-04-29 22:09:38 -07:00
nossr50
d0259d73c5 Gloabl XP multiplier is now tracked by the ExperienceMapManager
Added method to grab original value to ExperienceMapManager
Moved skill xp values/mults into their own section
2019-04-29 21:59:01 -07:00
nossr50
7f64fe11b8 Put special combat xp multipliers in their own section 2019-04-29 21:34:29 -07:00
nossr50
a496b1fd71 Dev mode 2019-04-29 18:54:00 -07:00
nossr50
ff8baecb54 Merge branch 'master' of github.com:mcMMO-Dev/mcMMO into configurable 2019-04-28 06:56:22 -07:00
nossr50
ac8042f5d8 update gitignore 2019-04-28 06:52:16 -07:00
nossr50
437bac1324 Revert "Add missing XP tables to 2.2"
This reverts commit d1085aa8f8.
2019-04-28 06:15:08 -07:00
nossr50
7c4481f099 removing unused classes 2019-04-28 06:08:15 -07:00
nossr50
d1085aa8f8 Add missing XP tables to 2.2 2019-04-28 06:05:39 -07:00
nossr50
986162803b Merge 2.1.50 2019-04-28 05:46:49 -07:00
nossr50
f7eb06e80b 2.1.50 2019-04-27 06:39:06 -07:00
nossr50
f4214e2031 changelog update 2019-04-27 00:00:52 -07:00
Robert A. C
fd8712ee61 Merge pull request #3905 from Zed-I/patch-6
Added some missing blocks to Herbalism/Mining
2019-04-26 23:50:43 -07:00
BuildTools
f904ac7019 Fixing 1.13.2 bamboo material errors 2019-04-26 23:26:00 -07:00
Robert A. C
3c08af363f Merge pull request #3904 from OverCrave/master
Minor German Locale Update
2019-04-26 14:17:54 -07:00
Robert A. C
8295355a5d Merge pull request #3906 from Zed-I/patch-7
Added bamboo to the non-2 high plant blocks
2019-04-26 14:17:36 -07:00
Zed-I
aee81f87f5 Added bamboo to the non-2 high plant blocks 2019-04-26 18:16:42 +02:00
Zed-I
43d08ec21d Added some missing blocks to Herbalism/Mining
Added some missing entries to herbalism mining and one to combat.
Reasoning for each xp below:

bamboo - 10 Cant grow nearly as tall as kelp
cornflower - 150 same as the other 1 high tall flowers (excluding poppy, dandelion and allium)
lily_of_the_valley - 150 same as the other 1 high tall flowers (excluding poppy, dandelion and allium)
wither_rose - 500. Quite hard to harvest. You need a wither to kill a mob and have the block not get destroyed by the wither blast. If the block where to get destroyed the flower just drops instead and you dont get any xp.

The whole stone brick family get the same xp as nether brick, 50
stone_bricks
cracked_stone_bricks
mossy_stone_bricks
chiseled_stone_bricks

The rest of the prismarine family continue with the same xp as their main block, 70
prismarine_bricks
dark_prismarine
sea_lantern

wandering_trader  - 1.0 same as normal villagers
2019-04-26 18:08:12 +02:00
OverCrave
15e3ad8876 add missing translations 2019-04-26 17:58:23 +02:00
OverCrave
a583f557d7 remove unused translations 2019-04-26 17:49:35 +02:00
nossr50
0949931a61 2.1.49 2019-04-25 18:56:49 -07:00
nossr50
8efee39f7e Add sweet berrys to Herbalism XP tables (update configs) 2019-04-25 18:54:41 -07:00
Robert A. C
307b807b38 Merge pull request #3788 from LogGits/patch-5
Herbalism compatibility with PlayerAnimationEvent
2019-04-25 18:50:27 -07:00
nossr50
be8a2a4b07 Fixes #3902 - NPE in Inventory Listener 2019-04-25 18:49:18 -07:00
nossr50
30df57fa35 Fix async tool lower 2019-04-25 18:46:49 -07:00
nossr50
467025888c Fixed #3858 - Falling blocks in water not getting tracked 2019-04-25 18:28:24 -07:00
nossr50
02a69cbb05 Update code style 2019-04-24 22:52:53 -07:00
nossr50
dc758a6dfc Wire up XP formula settings 2019-04-24 22:44:24 -07:00
nossr50
989537366a Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable 2019-04-24 22:14:02 -07:00
nossr50
21ecf959ea updating pom 2019-04-24 22:12:49 -07:00
nossr50
9fcedcad76 Add linear/exponential formula config options to defaults 2019-04-24 22:11:11 -07:00
nossr50
9d9b5464c3 fixing some serializer errors 2019-04-24 21:38:32 -07:00
nossr50
5fc416a457 Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable 2019-04-24 21:12:07 -07:00
nossr50
d1401d0cba change targetted API 2019-04-24 21:11:27 -07:00
nossr50
63e905db6c use a custom collection of serializers instead of the default list 2019-04-24 21:01:33 -07:00
nossr50
e8ea502f77 Add delegates to player level conf and wire up xp formula setting 2019-04-24 19:46:06 -07:00
nossr50
ba8b73ad4d add some missing delegates to xp config 2019-04-24 19:36:46 -07:00
nossr50
df2a52984e add combat default xp values 2019-04-24 19:30:15 -07:00
nossr50
b8ad722e9e Taming default XP values + updated acrobatics XP values 2019-04-24 18:58:29 -07:00
nossr50
7928ababf6 add smelting default xp values 2019-04-24 18:51:52 -07:00
nossr50
0a63e6674a merge prs 2019-04-24 18:24:29 -07:00
Robert A. C
b5930fc35d Merge pull request #3897 from Zed-I/patch-4
Added excavation treasure to coarse dirt
2019-04-24 18:23:29 -07:00
Robert A. C
9a74ab77f4 Merge pull request #3900 from Leomixer17/patch-1
Update locale_it.properties
2019-04-24 18:22:45 -07:00
nossr50
7f233b8e77 Tweaking some merge mistakes / bugs 2019-04-24 17:19:04 -07:00
nossr50
17c193f984 Merge branch 'configurable' of https://github.com/mcMMO-dev/mcmmo into configurable 2019-04-24 17:17:26 -07:00
nossr50
176b5db83e 2.1.48 2019-04-24 17:17:14 -07:00
nossr50
18d698aad2 2.1.48 2019-04-24 16:40:28 -07:00
Leomixer17
3329a6c49e Update locale_it.properties 2019-04-24 23:09:03 +02:00
nossr50
c07a29ba86 mcMMO should work on both 1.13 and 1.14 now 2019-04-23 08:20:00 -07:00
nossr50
b36c4b56c3 first 5 levels in all skills are now much easier to level 2019-04-23 04:21:25 -07:00
nossr50
cee0025147 Bonus XP for early combat levels 2019-04-23 03:52:48 -07:00
nossr50
372ad1fac3 Experience settings for 114 are now under Experience_114 in experience.yml 2019-04-23 03:37:43 -07:00
nossr50
09cba965d3 Switch to GSON since mojang lib does not exist in 1.14 2019-04-23 02:12:22 -07:00
nossr50
d862f7f779 Tool lower task sync 2019-04-23 01:13:21 -07:00
nossr50
0adaa0ba66 PlayerNotification now marked async 2019-04-23 01:10:09 -07:00
nossr50
432a4aa330 1.14 is required for this version of mcMMO 2019-04-23 00:54:49 -07:00
nossr50
1c490cd463 1.14 Compatibility (this build won't run on 1.13 anymore) 2019-04-22 23:54:02 -07:00
nossr50
b41637fbf8 2.1.47 2019-04-21 17:08:58 -07:00
nossr50
7506646862 Party NPE fix 2019-04-21 16:56:26 -07:00
Zed-I
570ab49e55 Added excavation treasure to coarse dirt
Added coarse dirt to all drops that dirt can drop.
Also added grass block to the quartz drop since there is no reason not to.
2019-04-20 16:35:01 +02:00
nossr50
227fb49dec 2.1.46 2019-04-19 17:59:00 -07:00
nossr50
78fdfc1c35 Made improvements to the Party member list from /party 2019-04-19 17:56:59 -07:00
nossr50
0b26d6c72c Fixed error related to Bleed, fixed missing default XP values for Herbalism and Woodcutting 2019-04-19 14:55:07 -07:00
nossr50
cae722e8c7 Changelog upd 2019-04-19 14:34:21 -07:00
Robert A. C
0eed1a6c5a Merge pull request #3892 from Zed-I/patch-3
Fixed bug where you couldn't shake zombie/creeper heads
2019-04-19 13:06:00 -07:00
Zed-I
bbf7ce9c57 Fixed bug where skeleton heads would drop in instead of zombie/creeper heads on successful shake
Creeper/zombie heads are now their own items and data is no longer used
2019-04-19 20:35:06 +02:00
Robert A. C
1fa21823a4 Merge pull request #3891 from Zed-I/patch-2
Fixed axe salvage bug
2019-04-19 10:12:37 -07:00
Zed-I
4b34299648 Fixed axe salvage bug
Changes max quantity to 3 from 2 on all axes since they are crafted with 3 resources not 2
2019-04-19 14:36:29 +02:00
nossr50
45841218e6 dev mode 2019-04-18 16:34:19 -07:00
Robert A. C
c509daff9f Merge pull request #3890 from OverCrave/master
Fix adminchat returning too early if send by the console
2019-04-18 15:13:21 -07:00
OverCrave
ce92329705 fix it for real now 2019-04-18 22:59:52 +02:00
OverCrave
817b5364cf fix adminchat returning too early if send by console 2019-04-18 22:58:50 +02:00
Robert A. C
9b08f9bc44 Merge pull request #3884 from jstnf/acro-fix
Check if a player has Absorption when calculating Acrobatics XP gain
2019-04-17 15:04:28 -07:00
jstnf
3973f9ec43 Check if a player has Absorption when calculating Acrobatics XP gain 2019-04-17 13:51:42 -07:00
nossr50
820c3260c8 2.1.45 - mcMMO will check for outdated software and provide tips 2019-04-17 11:51:13 -07:00
Robert A. C
57bbde552a Merge pull request #3881 from jstnf/configurable
Removed more Kraken references - configurable branch
2019-04-16 11:19:01 -07:00
nossr50
30bc73be7d Repair no longer consumes items with item lore + Fixing logic errors in repair. 2019-04-16 11:17:56 -07:00
Justin
ae35da8e02 Arcane bypass readded 2019-04-16 11:07:46 -07:00
jstnf
3c6b694fb8 Removed more Kraken references - configurable branch 2019-04-16 10:03:37 -07:00
nossr50
bbd43e156a Fixing some mistakes in default values for Repair 2019-04-15 20:14:29 -07:00
nossr50
a9cb28a8f2 Default Repair XP config values 2019-04-15 19:04:20 -07:00
nossr50
3e2f2cd000 Setup default Mining XP config values 2019-04-15 18:44:33 -07:00
nossr50
c69a9fc299 fixing another compile error 2019-04-15 15:51:29 -07:00
nossr50
f09007b60c temporary fix to compile error 2019-04-15 15:49:35 -07:00
nossr50
6e62930b6a Wire up Dodge XP config setting 2019-04-15 15:48:39 -07:00
nossr50
28bf67f154 Add default Herbalism XP values to config, added missing WALL_FAN and DEAD_WALL_FAN blocks 2019-04-15 15:40:41 -07:00
nossr50
5d7d06831b Add default Woodcutting XP values to config, added missing stripped wood values 2019-04-15 12:29:15 -07:00
nossr50
e23aec7294 Add default Excavation XP values to config 2019-04-15 11:59:42 -07:00
nossr50
f90205f1ae Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable 2019-04-15 10:43:26 -07:00
Robert A. C
54a1475fef Merge pull request #3878 from andris155/patch-2
Update locale_hu_HU.properties
2019-04-15 10:43:12 -07:00
nossr50
7e039321e1 Merge 2.1.44 2019-04-15 10:40:57 -07:00
András Marczinkó
bd0204a09e Update locale_hu_HU.properties 2019-04-15 10:10:33 +02:00
nossr50
31c1bd52bc 2.1.44 2019-04-14 05:39:23 -07:00
nossr50
0f8c0f97d9 Fixing another NPE for brewing 2019-04-14 05:27:31 -07:00
nossr50
5a56b27ea8 Fix AlchemyBrew NPE 2019-04-14 04:55:37 -07:00
nossr50
273dfbbdce 2.1.43 2019-04-14 04:23:28 -07:00
nossr50
138b109ff5 Correct display error when successfully salvaging enchantments 2019-04-13 22:04:35 -07:00
Robert A. C
908ac7c541 Update README.md 2019-04-13 15:56:00 -07:00
Robert A. C
e7e13d990a Update README.md 2019-04-13 15:55:38 -07:00
Robert A. C
ea9f79291e Update readme.md
Adjusting the team information to represent the current state of the project
2019-04-13 15:51:03 -07:00
nossr50
4b13cbeb43 2.1.42 2019-04-13 13:20:49 -07:00
nossr50
d542098f8a New salvage enchant bypass permission node 2019-04-13 13:17:28 -07:00
nossr50
f6e01ea910 UserManager::getPlayer returns null again (oopsie) 2019-04-13 12:58:32 -07:00
nossr50
2a053a0be2 Fixing logic error in mcrank CD msg 2019-04-12 15:34:33 -07:00
nossr50
b5cbfc7f66 Commands.Database.CooldownMS - new locale string 2019-04-12 15:29:37 -07:00
nossr50
8c0076ff80 2.1.41 2019-04-12 15:24:57 -07:00
nossr50
6e3c2fcb76 Fix mcrank cd display 2019-04-12 15:24:01 -07:00
nossr50
33a68daa9c mcMMO now checks in all places for a loaded profile before executing processing on said profile 2019-04-12 15:17:05 -07:00
nossr50
7cf3b4e521 Wire up inspect command settings 2019-04-11 08:05:15 -07:00
nossr50
7e047aed59 Inspect Command Config 2019-04-11 07:39:59 -07:00
nossr50
86f62fba0b Wire up admin chat settings 2019-04-11 07:11:25 -07:00
nossr50
b64b8d0f8f Admin Chat config settings 2019-04-11 07:09:58 -07:00
nossr50
1fe4fef75a Merge master 2.1.40 2019-04-11 04:43:59 -07:00
nossr50
00cc5f0845 Move Fall data to AcrobaticsManager 2019-04-11 04:09:00 -07:00
nossr50
8b0a580505 Fixing Party Chat Bug 2019-04-11 03:49:13 -07:00
nossr50
87bf3a5b40 fixing an oopsie 2019-04-11 00:00:22 -07:00
nossr50
de3e2b79f7 add inner peace to permissions 2019-04-10 06:00:27 -07:00
nossr50
21e1d54ad5 Inner Peace added to /fishing 2019-04-10 05:54:19 -07:00
nossr50
9c1f38ce6d Inner Peace locale strings 2019-04-10 05:46:18 -07:00
nossr50
78aeb0679b new fishing skill Inner Peace 2019-04-10 05:29:35 -07:00
nossr50
c41a650415 Wiring up Fishing config values 2019-04-10 04:56:59 -07:00
nossr50
856e6f0447 Fishing now actually grants XP for caught fish (values in the config did nothing before... lol ) 2019-04-10 04:35:14 -07:00
nossr50
1f734582d4 Add delegates to exploit config 2019-04-10 04:34:27 -07:00
nossr50
75bb3f181d Fishing now always gives fish in addition to treasure (configurable)
Fixing salvage oopsies
2019-04-10 04:06:06 -07:00
nossr50
2170c6de24 Setup Fishing XP Methods 2019-04-10 03:32:49 -07:00
nossr50
e156d6d5ef Wire up Alchemy XP config values 2019-04-10 03:01:14 -07:00
nossr50
fb6e5e41ad Wire up Acrobatics XP config + PVP XP 2019-04-10 02:25:47 -07:00
nossr50
8ddbb3aa91 Setup Acrobatics/Alchemy XP methods 2019-04-10 02:03:01 -07:00
nossr50
426b1304e2 Numerous tweaks + failsafes added to Loading/Saving of players 2019-04-10 01:52:34 -07:00
nossr50
ba180ebae3 xp config pt 4 2019-04-09 20:31:26 -07:00
nossr50
aecc90fa33 Correct Alchemy XP values in config defaults 2019-04-09 20:14:42 -07:00
nossr50
4394ac7049 xp config pt 3 + example fully qualified name map serializer 2019-04-09 20:12:52 -07:00
nossr50
a2279a58a5 xp config pt 2 2019-04-09 18:02:07 -07:00
nossr50
2ef10afce3 Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable
# Conflicts:
#	Changelog.txt
#	pom.xml
#	src/main/java/com/gmail/nossr50/skills/salvage/SalvageManager.java
2019-04-09 17:49:56 -07:00
nossr50
4433ea7118 hocon exp config pt 1 2019-04-09 17:48:51 -07:00
nossr50
f1204f8a2a 2.1.39 - Added Seagrass/Tall_Seagrass to experience tables
Salvage should sound a bit different to Repair now
Fixes #3863 #3862
2019-04-09 16:34:38 -07:00
nossr50
5facd8d412 Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable
# Conflicts:
#	Changelog.txt
#	pom.xml
#	src/main/java/com/gmail/nossr50/skills/acrobatics/AcrobaticsManager.java
2019-04-09 14:38:49 -07:00
nossr50
f7b07899c1 2.1.38 2019-04-08 17:58:44 -07:00
nossr50
e5de240eb4 Reduced Roll XP CD from 60s - > 10s 2019-04-08 17:58:06 -07:00
nossr50
b63280a2aa SkillProperty pt 1 2019-04-08 05:04:12 -07:00
Robert A. C
0ba3d7bd68 Update README.md 2019-04-08 03:17:36 -07:00
Robert A. C
79d5c6192f Update README.md 2019-04-08 03:17:16 -07:00
nossr50
8c164749e2 Wire up salvageable serializer 2019-04-08 01:35:25 -07:00
nossr50
3806dcbd5d Salvageable serializer 2019-04-08 01:34:36 -07:00
nossr50
b67bc45e9a Finished default salvageables list for config 2019-04-08 01:04:13 -07:00
nossr50
737b95d538 Merge branch 'master' of https://github.com/mcMMO-dev/mcmmo into configurable 2019-04-07 18:31:59 -07:00
Robert A. C
b8ae8438de Merge pull request #3861 from FabioZumbi12/patch-4
Update locale_pt_BR.properties
2019-04-07 00:26:53 -07:00
FabioZumbi12
974106f983 Update locale_pt_BR.properties 2019-04-07 04:03:08 -03:00
nossr50
ee90780d7b Multiple items can be specified as a detonator 2019-04-06 06:28:56 -07:00
nossr50
abda53641f Merging 2019-04-06 06:10:52 -07:00
nossr50
77eba76e13 This class is an abomination 2019-04-06 06:09:33 -07:00
nossr50
d599db2897 2.1.37 - Fixes #3859 2019-04-06 05:14:52 -07:00
Robert A. C
3f89f91f42 Merge pull request #3857 from andris155/patch-1
Update locale_hu_HU.properties
2019-04-05 01:45:12 -07:00
András Marczinkó
2fca0963d7 Update locale_hu_HU.properties
Improve AbilityGateRequirementFail translation.
Translated new translation lines.
Update and fix Guides.Mining.Section.4
2019-04-05 10:44:01 +02:00
nossr50
81d648f94d setup typed references to skill configs 2019-04-04 23:46:48 -07:00
nossr50
42a7673ad7 Init and register skill configs to a map to make traversing the root node for a specific skill given the same structure easier 2019-04-04 22:47:40 -07:00
nossr50
51291f7c49 more work on notifications config 2019-04-04 19:53:06 -07:00
nossr50
4068d61246 Merge master 2019-04-04 19:20:24 -07:00
nossr50
b63db1981c 2.1.36 2019-04-04 19:08:20 -07:00
nossr50
af744fa088 Villagers give XP now 2019-04-04 18:55:25 -07:00
nossr50
8538ac4e50 mcnotify will now squelch notifications from mcMMO & players who are squelched will be reminded of their squelch status at least once an hour (you can disable this in advanced.yml) 2019-04-04 17:27:17 -07:00
Robert A. C
cabc5977d9 Merge pull request #3856 from OverCrave/master
German Locale Update
2019-04-04 04:30:44 -07:00
OverCrave
43dd382541 fix concoction name inconsistency 2019-04-04 13:12:55 +02:00
OverCrave
cdb81e961e fix herbalism name inconsistency 2019-04-04 13:11:24 +02:00
OverCrave
51ced83301 mining guide update 2019-04-04 13:09:57 +02:00
OverCrave
09bca96af3 Merge remote-tracking branch 'upstream/master' 2019-04-04 13:05:37 +02:00
nossr50
f1d9f787f4 2.1.35 2019-04-04 00:39:00 -07:00
nossr50
6cad982969 Merge conflicts 2019-04-04 00:24:34 -07:00
nossr50
b8b0be71b1 2.1.34 2019-04-03 22:01:45 -07:00
nossr50
ac10261803 Blast Mining uses Pickaxe + Missing Taming XP entries 2019-04-03 21:54:49 -07:00
nossr50
5b2720a04f Taming Cleanup + Compiler Error fix 2019-04-03 21:07:12 -07:00
nossr50
0ca0140348 Code Cleanup pt 3 2019-04-03 19:55:52 -07:00
nossr50
43037f8c13 Code Cleanup Pt 2 2019-04-03 19:25:14 -07:00
nossr50
0e39656c88 Code cleanup and new settings for Database config 2019-04-03 18:42:58 -07:00
nossr50
8991c2bf2c Fixing merge conflicts 2019-04-03 17:25:18 -07:00
nossr50
7bbf1acd5d minor cleanup 2019-04-03 16:11:35 -07:00
OverCrave
dc018be6bb overhaul part 2
- fixed/changed punctuation and grammar in some of the skills
- fixed some skills commands not having the same name as their shown name
2019-04-03 22:20:59 +02:00
OverCrave
832b653a88 change usage of word 'wahrscheinlichkeit/chance' for consistency 2019-04-03 21:50:38 +02:00
OverCrave
1fddaf15cc add last missing new translations 2019-04-03 21:49:16 +02:00
nossr50
9acf597eb9 Fixing PlayerListener 2019-04-02 23:35:33 -07:00
nossr50
d2faac3b0d Code cleanup part 1 2019-04-02 23:28:12 -07:00
nossr50
b68feb6992 rogue import spotted 2019-04-02 23:07:52 -07:00
nossr50
f3837265db 2.1.33 2019-04-02 23:03:48 -07:00
nossr50
ecce631527 Mining Bonus Drop registration 2019-04-02 21:52:07 -07:00
nossr50
5c6f0e8cbf BonusDrops (Double/Triple) are now managed by BonusDropManager 2019-04-02 18:59:48 -07:00
nossr50
ac67e006d8 Kill the MultiConfigs 2019-04-02 18:30:06 -07:00
nossr50
661c63a8aa Unnecessary factory... 2019-04-02 18:11:05 -07:00
nossr50
eb43dc4460 Refactoring Salvageables/Repairables, removing Simple from the naming schemes 2019-04-02 17:42:35 -07:00
nossr50
9514b200cd unnecessary interfaces 2019-04-02 16:35:05 -07:00
nossr50
c428aff251 Anti-Exploit config pt 1 2019-04-01 18:16:20 -07:00
nossr50
c6e8e63088 Scoreboard config part 1 2019-04-01 18:12:18 -07:00
nossr50
8f33b378bf mod configs are taking a break 2019-04-01 18:02:36 -07:00
nossr50
67f95d3343 child.yml was a mistake 2019-04-01 16:50:35 -07:00
nossr50
5e1c12d8ec new config pt 9 2019-04-01 16:44:59 -07:00
nossr50
09c91f3b4b 2.1.32 2019-04-01 16:22:43 -07:00
nossr50
8d9f6c14a7 Completely remove Fireworks from mcMMO 2019-04-01 16:21:50 -07:00
nossr50
dcd40d3ced 2.1.31 2019-04-01 16:17:40 -07:00
nossr50
456e64456d Fixing an issue with mmoedit triggering notifications for skills already unlocked 2019-04-01 16:15:53 -07:00
nossr50
f1ecef310c Fixed a bug involving SubSkill notifications
Fixes #3808, also fixed the notification timer
2019-04-01 16:15:52 -07:00
BuildTools
1f2eae0799 Don't load the players profile just to get their name 2019-04-01 16:10:49 -07:00
nossr50
0d3551c84b Adding missing Double Drop entries for Woodcutting 2019-04-01 16:06:16 -07:00
nossr50
dc4401ffb0 Add missing Herbalism entries to config 2019-04-01 16:04:30 -07:00
nossr50
9568c0f85c Fixing Mining Double Drops (update configs) 2019-04-01 16:04:29 -07:00
nossr50
3f30f6950b unused imports 2019-04-01 15:45:40 -07:00
OverCrave
8182249641 Update locale_de.properties 2019-04-01 15:41:24 -07:00
OverCrave
b36c1376cf Update locale_de.properties 2019-04-01 15:38:37 -07:00
OverCrave
e4c911869d Update locale_de.properties 2019-04-01 15:38:37 -07:00
OverCrave
457b7f9d14 Update locale_de.properties 2019-04-01 15:38:36 -07:00
nossr50
ae551e17cd 2.1.32 2019-04-01 10:16:43 -07:00
nossr50
c6d055cb48 Completely remove Fireworks from mcMMO 2019-04-01 10:04:45 -07:00
nossr50
68e34d682c 2.1.31 2019-03-30 17:45:03 -07:00
nossr50
b125600dac Fixing an issue with mmoedit triggering notifications for skills already unlocked 2019-03-30 17:44:06 -07:00
Robert A. C
57b31b60b3 Merge pull request #3843 from Ineusia/master
Minor API fix
2019-03-30 17:09:27 -07:00
nossr50
7757e187be Fixed a bug involving SubSkill notifications
Fixes #3808, also fixed the notification timer
2019-03-30 16:56:00 -07:00
Robert A. C
5ce360d443 Merge pull request #3844 from OverCrave/master
German Locale Overhaul
2019-03-30 10:21:44 -07:00
OverCrave
d44b6e0afb readd other locales 2019-03-30 17:59:25 +01:00
OverCrave
629d882831 Merge remote-tracking branch 'upstream/master' 2019-03-30 17:57:14 +01:00
OverCrave
947018c0f1 remove other languages temporarily 2019-03-30 17:56:40 +01:00
BuildTools
ca2e1c11e6 Don't load the players profile just to get their name 2019-03-29 23:56:40 -05:00
nossr50
69e5d3e1b5 2.1.30 2019-03-29 18:21:07 -07:00
nossr50
b7d33f0227 Adding missing Double Drop entries for Woodcutting 2019-03-29 18:11:32 -07:00
nossr50
28c7fdd4e2 Add missing Herbalism entries to config 2019-03-29 17:57:48 -07:00
nossr50
53534e0f1d Fixing Mining Double Drops (update configs) 2019-03-29 17:44:54 -07:00
nossr50
8d477a5cf5 unused imports 2019-03-29 11:33:40 -07:00
nossr50
74908cdcf5 2.1.29 - Double Drop Fix 2019-03-29 11:27:49 -07:00
nossr50
c5f87e17f6 import cleanup 2019-03-29 00:04:51 -07:00
nossr50
7d1cbe4c45 notifications pt 1 2019-03-29 00:03:51 -07:00
nossr50
dc5766035b one last set of tweaks to repair config... I swear 2019-03-29 00:03:51 -07:00
nossr50
d144409673 even more comment restyling on repair 2019-03-29 00:03:51 -07:00
nossr50
07ebf12ae2 Tweaking Repair Comments + Anvils now use Name ID 2019-03-29 00:03:50 -07:00
nossr50
6e83763f22 Finishing touches on Repair Config 2019-03-29 00:03:50 -07:00
nossr50
e232bb3699 finished default repairables, diamond armor gives less xp by default 2019-03-29 00:03:50 -07:00
nossr50
968636b8d4 Repairables can now specify multiple items that can be used for repairs 2019-03-29 00:03:50 -07:00
nossr50
0f98d9babe Add Serializer for Repairable 2019-03-29 00:03:49 -07:00
nossr50
bf8e3d5a08 Removing unecessary interfaces 2019-03-29 00:03:49 -07:00
nossr50
7aea4e1d92 Repair Config pt 5 2019-03-29 00:03:48 -07:00
nossr50
68b32e0b9e Repair Config Pt 4, Salvage Config pt 1 2019-03-29 00:03:11 -07:00
nossr50
ef6bec4ffc Repair Config Pt 3 2019-03-29 00:03:11 -07:00
nossr50
ff986ec97d parent node renamed to something more specific 2019-03-29 00:03:11 -07:00
nossr50
0c58f5073c Acrobatics config pt 1 2019-03-29 00:03:11 -07:00
nossr50
579109b2f5 Configurable XP cooldowns for Roll 2019-03-29 00:03:10 -07:00
nossr50
d4d8cbbc03 arcane forging config 2019-03-29 00:03:10 -07:00
nossr50
d8b540cad8 actual last try 2019-03-29 00:03:10 -07:00
nossr50
1ff3e55c7e one last try then I give up :D 2019-03-29 00:03:10 -07:00
nossr50
437bc264bc at this point I'm just taking wild guesses lol 2019-03-29 00:03:10 -07:00
nossr50
17cb2c2615 try this 2019-03-29 00:03:10 -07:00
nossr50
3d21591830 update assembly plugin 2019-03-29 00:03:10 -07:00
nossr50
1cea9830a6 rename artifact 2019-03-29 00:03:09 -07:00
nossr50
121c54b802 Repair Config Pt 2 2019-03-29 00:03:09 -07:00
nossr50
e709f04004 Skill Configs pt 1 2019-03-29 00:03:08 -07:00
nossr50
2cdb0395ee wire up alerting admins to over-fishing repeated abuse 2019-03-29 00:03:08 -07:00
nossr50
8f6f0e4a0f Expanding fishing exploit options 2019-03-29 00:03:07 -07:00
nossr50
133dadccec Custom Serializer Attempt #2 2019-03-29 00:01:39 -07:00
nossr50
c01b8e4ad4 Update changelog 2019-03-29 00:01:39 -07:00
nossr50
ac04ca5c27 Exploit Config Tweaks 2019-03-29 00:01:38 -07:00
nossr50
956b01a28e wire up creatures config 2019-03-29 00:01:38 -07:00
nossr50
7cd8099d3c new mob config "creatures.conf" 2019-03-29 00:01:38 -07:00
nossr50
bd0a4c75c0 Wire up backup config 2019-03-29 00:01:38 -07:00
nossr50
883fca3cf3 Wire up locale config 2019-03-29 00:01:37 -07:00
nossr50
45430d9c25 Wire up Super Ability config pt 1 2019-03-29 00:01:37 -07:00
nossr50
e933efcee0 Wire up Language config 2019-03-29 00:01:36 -07:00
nossr50
b9a37614b2 Add missing annotation 2019-03-29 00:01:36 -07:00
nossr50
7c0469dce1 Fix fishing exploit toggle 2019-03-29 00:01:36 -07:00
nossr50
7d2e76e464 Super Ability config pt 2 2019-03-29 00:00:26 -07:00
nossr50
3a21a913c6 Added toggle to disable party system 2019-03-29 00:00:26 -07:00
nossr50
b0b326d080 Convert Party data to HOCON serialization 2019-03-29 00:00:26 -07:00
nossr50
16d4c160c6 fix imports 2019-03-29 00:00:25 -07:00
nossr50
652291fee1 Tweaking changelog 2019-03-29 00:00:25 -07:00
nossr50
f299f84a6f Wire up party config pt 5 - Actually need to redo how I'm deserializing maps, gonna do that tomorrow 2019-03-29 00:00:25 -07:00
nossr50
80df1dd4bd Wire up party config pt 4 2019-03-29 00:00:24 -07:00
nossr50
8a6ed2f076 Party Config Pt 5 2019-03-29 00:00:24 -07:00
nossr50
d11f8fcdce Wire up Party Config pt 3 2019-03-29 00:00:24 -07:00
nossr50
6be936972f Party Config pt 4 2019-03-29 00:00:23 -07:00
nossr50
82dec38e5c Wire up Party Config pt 2 2019-03-29 00:00:23 -07:00
nossr50
70b3ca3094 Wire up Party Config pt 1 2019-03-29 00:00:23 -07:00
nossr50
f0455b28dc tweak Party Level unlocks 2019-03-29 00:00:23 -07:00
nossr50
f96c4bc063 Party Config pt 3 2019-03-29 00:00:22 -07:00
nossr50
a812ca42f7 Party config pt 2 2019-03-29 00:00:22 -07:00
nossr50
fb1467551f World Blacklist cleanup, metric config pt 2 2019-03-29 00:00:22 -07:00
nossr50
96b781ab0a Add super ability config 2019-03-29 00:00:22 -07:00
nossr50
a710893e2a Add chat and hud notification config 2019-03-29 00:00:21 -07:00
nossr50
0bed8898bf Add automated backup config 2019-03-29 00:00:21 -07:00
nossr50
4c78afc04b Add party config 2019-03-29 00:00:21 -07:00
nossr50
cb21c0bf24 Add particles config 2019-03-29 00:00:21 -07:00
nossr50
eb14d14e05 Add language config 2019-03-29 00:00:21 -07:00
nossr50
7c0a741b47 Add item config 2019-03-29 00:00:20 -07:00
nossr50
2acc230895 Add command config 2019-03-29 00:00:19 -07:00
nossr50
e57bf35e5e new settings for showing patreon, paypal 2019-03-29 00:00:19 -07:00
nossr50
2001ef30ee new config author_support_advertisements.conf 2019-03-29 00:00:19 -07:00
nossr50
b2c1358a84 Better config file organization for exploit prevention config 2019-03-29 00:00:19 -07:00
nossr50
efdd56684b Add options for Fishing exploit prevention 2019-03-29 00:00:18 -07:00
nossr50
0d8b4c5f5f Add Acrobatics exploit prevention config settings 2019-03-29 00:00:18 -07:00
nossr50
04fdd3270a MOTD Config 2019-03-29 00:00:18 -07:00
nossr50
094850ab85 Exploit Prevention config pt 2 2019-03-28 23:59:49 -07:00
nossr50
d272d60112 Anti-Exploit config pt 1 2019-03-28 23:59:48 -07:00
nossr50
f5c1e0952b World Blacklist Config 2019-03-28 23:59:26 -07:00
nossr50
0e61557812 Player Leveling config pt 3 2019-03-28 23:59:26 -07:00
nossr50
160f27b492 update changelog 2019-03-28 23:59:25 -07:00
nossr50
7a7dd7002e Hypens instead of Underscores because the serializer is a dumbo 2019-03-28 23:59:25 -07:00
nossr50
0046c47163 Expanded level cap settings, Player Leveling config pt 2 2019-03-28 23:59:25 -07:00
nossr50
1cdc59cfb1 updating version number 2019-03-28 23:58:28 -07:00
nossr50
8660d86306 Expanding DB cleanup settings, Player Leveling config pt 1 2019-03-28 23:57:21 -07:00
nossr50
d139d520e7 Move generic Scoreboard settings to General section 2019-03-28 23:57:21 -07:00
nossr50
8578d923d6 Fix imports 2019-03-28 23:57:21 -07:00
nossr50
307340bea3 Scoreboard config pt 2 2019-03-28 23:57:20 -07:00
nossr50
bbe9b92c15 Refactoring mistake 2019-03-28 23:57:20 -07:00
nossr50
f00601931d Scoreboard config part 1 2019-03-28 23:57:20 -07:00
nossr50
1c289cfcdf Refactoring SQL config class names again 2019-03-28 23:57:19 -07:00
nossr50
a8bf6357aa Fixed the loading of the Serialized configs 2019-03-28 23:57:19 -07:00
nossr50
77b4ade885 On second thought lets not use an empty class as a parent idk 2019-03-28 23:57:19 -07:00
nossr50
d3b437f6d3 Renaming config classes 2019-03-28 23:57:19 -07:00
nossr50
45e785bd1f Rewiring SQL to the new config pt 2 2019-03-28 23:57:19 -07:00
nossr50
707e6d0342 Update changelog 2019-03-28 23:57:18 -07:00
nossr50
be69f0d6a7 Rewiring the SQL code to the new configs 2019-03-28 23:57:18 -07:00
nossr50
e94005df34 Move user settings to new User category for MySQL 2019-03-28 23:57:18 -07:00
nossr50
88cd8e64bb Database Config getter boilerplate 2019-03-28 23:57:18 -07:00
nossr50
948837546a Move config loading outside of constructors 2019-03-28 23:57:17 -07:00
nossr50
8bc49e8bfb Add typesafe library to maven, cleanup config directory code 2019-03-28 23:57:17 -07:00
nossr50
55b1da0341 no more MultiConfigContainers, updating existing config classes for HOCON (WIP) 2019-03-28 23:57:16 -07:00
nossr50
132b908eee Added some more missing defaults to database config 2019-03-28 23:57:16 -07:00
nossr50
7d152794ba add missing defaults and constructor for database config 2019-03-28 23:57:16 -07:00
nossr50
e757dd10c8 import cleanup 2019-03-28 23:57:15 -07:00
nossr50
d5ea196840 added hocon configurate libs to maven 2019-03-28 23:57:14 -07:00
nossr50
f772b39eda add missing db config options 2019-03-28 23:57:14 -07:00
nossr50
493d6b0a67 Starting the conversion to HOCON, splitting up configs, and more 2019-03-28 23:57:14 -07:00
nossr50
76472a2b9f Most Experience related maps are now tracked via a new ExperienceMapManager to simplify loading/unloading of registered values 2019-03-28 23:56:27 -07:00
nossr50
f0e8eb35c4 Most Super Abilities which increase gathering speed now check both XP registers and new hardcoded lists to determine whether or not the block should be affected by the super ability, if the block is found on either the xp registers or our own internal list then it will be considered compatible with that super ability.
This prevents weird behavior from a server admin removing XP from something like Stone
2019-03-28 23:56:27 -07:00
nossr50
59f3835554 set configurate user file builder to dump block style formatting 2019-03-28 23:55:56 -07:00
nossr50
38c11d1601 Fixing zero initalize for entity xp + party share 2019-03-28 23:55:56 -07:00
nossr50
608a523996 Fix zero initialize for Swords config options 2019-03-28 23:55:55 -07:00
nossr50
a2e0ca0f84 Flux Mining Cleanup 2019-03-28 23:54:47 -07:00
nossr50
a3b8ab81be Fixed zero initialize for Smelting's Fuel Efficiency 2019-03-28 23:54:47 -07:00
nossr50
07db198a67 Whoops 2019-03-28 23:54:08 -07:00
nossr50
234a31d283 Fix Repair Mastery zero initialize 2019-03-28 23:50:11 -07:00
nossr50
f2945569fb Fixed zero initialize for SkullSplitter. config nodes 2019-03-28 23:47:26 -07:00
nossr50
72663ae2d3 Solved zero initialize for Party.Sharing.ExpSharing_bonus_base 2019-03-28 23:47:25 -07:00
nossr50
22eead18dd Add warning about 2.1.13 snapshot releases 2019-03-28 23:47:25 -07:00
nossr50
8101decef5 Updating changelog 2019-03-28 23:47:25 -07:00
nossr50
35d1e1ebd9 Removing test files 2019-03-28 23:47:25 -07:00
nossr50
4418d34930 add register to constructor of repair/salvage 2019-03-28 23:47:25 -07:00
nossr50
ed8611585f remove reflection code from MultiConfigContainer 2019-03-28 23:47:25 -07:00
nossr50
b3ed05eb09 forgot the other super constructor for configcollection 2019-03-28 23:47:24 -07:00
nossr50
9d0dd7ecd6 do not call register() in super 2019-03-28 23:47:24 -07:00
nossr50
e354e7b89b add unload to potion config 2019-03-28 23:47:24 -07:00
nossr50
714d9c0ca7 init potion ingredient lists in constructor 2019-03-28 23:47:24 -07:00
nossr50
53f06832f1 Locale NPE 2019-03-28 23:47:24 -07:00
nossr50
562066311b Always grab the Localized name of a skill 2019-03-28 23:47:23 -07:00
nossr50
b5b9a223a7 better error reporting on enabling mcMMO 2019-03-28 23:47:23 -07:00
nossr50
049b76f651 Only grab List<String> if it's a proper list 2019-03-28 23:47:23 -07:00
nossr50
4ab5e5e925 Changing iteration over a nodes children to be based on a list of its children rather than a returned type of String 2019-03-28 23:47:21 -07:00
nossr50
22ca1863fd fix NPE for anvil, salvage block, detonator item 2019-03-28 23:47:21 -07:00
nossr50
bdbda5587f fix NPE for ChimaeraWing 2019-03-28 23:47:21 -07:00
nossr50
a344e43e2e fix configManager NPE 2019-03-28 23:47:21 -07:00
nossr50
198b7e3f46 xpratemultiplier fix 2019-03-28 23:47:20 -07:00
nossr50
5647eebe99 Multiplier to camelcase 2019-03-28 23:47:20 -07:00
nossr50
367fabf70c fixing many compiler errors for configs 2019-03-28 23:47:19 -07:00
nossr50
2f804de36f fishing treasures pt 4 (enchantments) 2019-03-28 23:46:43 -07:00
nossr50
677e45a811 fishing treasures pt 3 (shake) 2019-03-28 23:46:43 -07:00
nossr50
99f0e029c2 fishing treasures pt 2 2019-03-28 23:46:43 -07:00
nossr50
3fc9f26b8b fishing treasures pt 1 2019-03-28 23:46:42 -07:00
nossr50
e75170f576 need to rewrite this mess 2019-03-28 23:46:42 -07:00
nossr50
3158ba591b Hylian Treasure pt 2 2019-03-28 23:46:42 -07:00
nossr50
31402d97c4 Hylian Treasure pt 1 2019-03-28 23:46:42 -07:00
nossr50
bef86f0e97 add CustomName and Lore fields to default treasure configs
the functionality for these keys has always been here but this change should help make it more obvious
2019-03-28 23:46:42 -07:00
nossr50
811b90bc31 fixing imports 2019-03-28 23:46:41 -07:00
nossr50
ef6b70f686 Some more comments 2019-03-28 23:46:41 -07:00
nossr50
2c752dc470 Removing the oopsies 2019-03-28 23:46:41 -07:00
nossr50
63a0598766 Check for changeme 2019-03-28 23:46:41 -07:00
nossr50
772ceddf65 ExcavationTreasureConfig pt 1 2019-03-28 23:46:41 -07:00
nossr50
15be278ee1 kill TreasureConfig.java 2019-03-28 23:46:40 -07:00
nossr50
349a714134 Treasure Config Split pt 2, Configs now register to be backed up with the config manager 2019-03-28 23:46:39 -07:00
nossr50
41bfba0c68 treasures.yml is now split into 3 treasure configs 2019-03-28 23:46:39 -07:00
nossr50
83ee9ca92c DefaultKeys refactored to UnsafeValueValidation 2019-03-28 23:46:39 -07:00
nossr50
18d8b84099 Set removeOldKeys in the Config parent class 2019-03-28 23:46:39 -07:00
nossr50
e6aee141fb Update config constructors to pass removeOldKeys boolean 2019-03-28 23:46:38 -07:00
nossr50
b0b0167ee2 Convert RankConfig to the new system 2019-03-28 23:46:38 -07:00
nossr50
26b66b550c potion config is now converted to the new system 2019-03-28 23:46:38 -07:00
nossr50
cef1bf6c8c potion config pt 1 (wip) 2019-03-28 23:46:38 -07:00
nossr50
bd74d6e4f1 Convert soundconfig to new system 2019-03-28 23:46:38 -07:00
nossr50
6152ac30b9 kill hidden.yml 2019-03-28 23:46:37 -07:00
nossr50
6604f98140 Updating constructors, updating node address helper methods 2019-03-28 23:46:37 -07:00
nossr50
b81ca84a99 don't always copy defaults 2019-03-28 23:46:37 -07:00
nossr50
4bfa790be9 Converting salvage config to the new system 2019-03-28 23:46:37 -07:00
nossr50
c14b949b0a Converting repair config to the new system 2019-03-28 23:46:37 -07:00
nossr50
5ce08a2294 Kill the upgrade manager 2019-03-28 23:46:36 -07:00
nossr50
c91255c474 converting mainconfig pt 3 2019-03-28 23:46:36 -07:00
nossr50
4bb513c2d1 hardcore and vampirism commands were a mistake 2019-03-28 23:46:11 -07:00
nossr50
9f9b456b0a converting mainconfig pt 2 2019-03-28 23:46:11 -07:00
nossr50
894b30660c converting mainconfig pt1 2019-03-28 23:46:11 -07:00
nossr50
a939f54b10 experience getInstance() had an oopsie 2019-03-28 23:46:11 -07:00
nossr50
3fc0bbb466 comment out contents of mod configs until we need them again 2019-03-28 23:46:10 -07:00
nossr50
e7d8e51722 mod configs are taking a break 2019-03-28 23:46:09 -07:00
nossr50
63aebd0454 rewire getInstance for experience config 2019-03-28 23:44:16 -07:00
nossr50
f08456b789 child.yml was a mistake 2019-03-28 23:44:16 -07:00
nossr50
d7e0c95984 rewire getInstance() for configs 2019-03-28 23:44:15 -07:00
nossr50
f4ba472403 new config pt 10 - All configs are now managed by ConfigManager (WIP) 2019-03-28 23:44:15 -07:00
nossr50
acf2bf362f Refactoring the oopsies 2019-03-28 23:43:20 -07:00
nossr50
9731b9cffb new config pt 9 2019-03-28 23:43:19 -07:00
nossr50
2de87f7189 Regex errors 2019-03-28 23:30:11 -07:00
nossr50
fb2eddd432 fixing NPE and IO errors 2019-03-28 23:30:10 -07:00
nossr50
bf63ce33c5 new config system pt 5 2019-03-28 23:30:10 -07:00
nossr50
e7b91f57ea Advanced Config is now on the new config system 2019-03-28 23:30:10 -07:00
nossr50
78f0a42ec1 new config system part 4 2019-03-28 23:30:10 -07:00
nossr50
fd8e44ef47 new config system part 3 2019-03-28 23:30:09 -07:00
nossr50
0f743a55b5 new config system pt 2 2019-03-28 23:30:09 -07:00
nossr50
69fa10559c New Config System pt 1 2019-03-28 23:30:09 -07:00
nossr50
c1cf246084 Setting up configurable 2019-03-28 23:30:08 -07:00
Robert A. C
39b22d0ee8 Merge pull request #3841 from Fabrimat/patch-3
Update locale_it.properties
2019-03-28 08:05:57 -07:00
Fabrizio La Rosa
74e62ab08c Update locale_it.properties 2019-03-28 16:01:21 +01:00
OverCrave
f1cc745de8 fully translate party stuff 2019-03-28 13:41:39 +01:00
OverCrave
7654e78fbe Update locale_de.properties 2019-03-28 12:44:00 +01:00
OverCrave
558c727136 change color code usage style 2019-03-28 12:35:08 +01:00
OverCrave
18097fa1a5 Update locale_de.properties 2019-03-28 12:26:15 +01:00
nossr50
e2b8d940d3 2.1.28 2019-03-28 04:22:26 -07:00
OverCrave
5093c37efb Update locale_de.properties
so much done so much still missing .-.
2019-03-28 12:10:11 +01:00
OverCrave
610e1a6bf4 Merge remote-tracking branch 'upstream/master' 2019-03-28 11:25:56 +01:00
OverCrave
99843f2735 update en_US to upstream version 2019-03-28 11:25:41 +01:00
nossr50
732726bbd3 2.1.27 - Fixed an exploit that allowed players to dupe torches, rails, etc 2019-03-27 21:05:57 -07:00
nossr50
65687ca603 2.1.26 - Combat Skills are MUCH more deadly 2019-03-27 16:40:08 -07:00
nossr50
658382dba2 Added Limit Break to Archery, Axes, Swords, Unarmed 2019-03-27 16:30:29 -07:00
nossr50
404a876d6b Compiler made an oopsie 2019-03-27 12:36:46 -07:00
nossr50
c4a383c4fb Removed PVP requirement on Stab, added info about Stab to /swords 2019-03-27 12:33:04 -07:00
nossr50
e0341f7ae7 Added new subskill to Swords, Stab 2019-03-27 12:11:11 -07:00
nossr50
018c6fc96b 2.1.26 Dev Version 2019-03-27 11:27:27 -07:00
nossr50
d324aa9589 Rescale Iron Arm Damage 2019-03-27 11:27:05 -07:00
OverCrave
cc1c73cb17 Update locale_de.properties
stopped at Fishing.Exhausting
2019-03-26 22:33:44 +01:00
OverCrave
d6dc8bb04c Update locale_da.properties
generated by the eclipse property tool
2019-03-26 21:35:01 +01:00
OverCrave
88ef6b0984 Update locale_de.properties 2019-03-26 21:34:31 +01:00
OverCrave
624299602d Update locale_de.properties 2019-03-26 21:14:30 +01:00
OverCrave
8fe8db2353 Update locale_de.properties 2019-03-26 20:21:11 +01:00
OverCrave
159cf7c0d4 remove unused translations
this change removes every translation in every locale that does not exist in locale_en_US anymore, to keep everything up to date
2019-03-26 20:05:46 +01:00
OverCrave
947cdc91a4 Update locale_de.properties 2019-03-26 19:52:36 +01:00
OverCrave
ff55cbb946 Update locale_de.properties 2019-03-26 19:40:47 +01:00
OverCrave
fdb151083d Update locale_de.properties 2019-03-26 19:33:18 +01:00
nossr50
7a3d608f36 2.1.25 2019-03-26 08:36:13 -07:00
nossr50
719283177e Shake has an upper limit of 10 damage (will be configurable in the near future), alchemy ranks adjusted 2019-03-26 08:22:39 -07:00
nossr50
55fb3ed74f 2.1.24 - Critical Exploit Fix 2019-03-25 15:12:17 -07:00
nossr50
363ea66335 2.1.23 - Read the changelog, configs need to be updated. 2019-03-24 19:02:08 -07:00
nossr50
7ee65a7e65 Fixing a 7 year old damage bug. 2019-03-24 14:20:20 -07:00
nossr50
aa25ba6338 Fixed DoubleDrops for Mining, MANY nerfs to Rupture (PVP balance tweaks coming soon) 2019-03-23 22:57:44 -07:00
nossr50
b68bbad766 Eject players from Minecarts if they cast a fishing rod (Anti-AFK) 2019-03-23 21:01:40 -07:00
nossr50
6d19239db7 Don't add drops for items with a quantity of zero 2019-03-23 18:09:29 -07:00
nossr50
faab64864a Fixing Double Drops for Mining -- READ THE FULL COMMIT MSG
This fix is very similar to what was deployed for Herbalism in 2.1.22

NOTE: Here's what your Double_Drop entries in Config.yml for Mining should look like

https://paste.gg/p/anonymous/dcd06f1215844311b4f2225f200090d1

IMPORTANT: Version 2.1.22 which came before this had a similar fix for Herbalism, instructions on how to fix your Herbalism Double Drops can be found here
        https://www.spigotmc.org/resources/official-mcmmo.64348/update?update=269868
2019-03-23 18:07:23 -07:00
nossr50
b1f4ea8cba 2.1.22 release 2019-03-23 16:35:05 -07:00
nossr50
df6315dd62 Fixed Repair Mastery using incorrect numbers during calculations 2019-03-23 16:23:38 -07:00
nossr50
255f7bf335 Fixes #3832 - Resolved issue with double drops & herbalism, similar fixes coming to woodcutting/mining soon. Reminder to update config.yml, read changelog for instructions.
If you harvest crops with a Hoe it does not require seeds to replant on successful Green Thumb
2019-03-23 16:21:25 -07:00
nossr50
ce6553d857 Fixing Double Drops for Herbalism (Update your configs) see changelog for instructions 2019-03-23 13:34:14 -07:00
Robert A. C
df1497924c Merge pull request #3830 from andris155/patch-1
Added Fishing.LowResources translation to Hungarian locale file
2019-03-22 08:56:52 -07:00
András Marczinkó
aeed0cf6ad Added Fishing.LowResources translation to Hungarian locale file 2019-03-22 16:38:04 +01:00
nossr50
e40a7bb4e1 XP Gain from Roll has a CD now (60 seconds) 2019-03-21 14:32:01 -07:00
nossr50
d59dbe7630 update log 2019-03-20 07:08:39 -07:00
nossr50
dece43429d Added an option to turn off fishing exploit detection as a band-aid fix until the config update is done 2019-03-20 07:04:05 -07:00
Robert A. C
14f900aa83 Merge pull request #3828 from andris155/patch-1
Update Hungarian locale file
2019-03-19 01:36:02 -07:00
András Marczinkó
53848d3fd3 Update Hungarian locale file 2019-03-19 09:33:55 +01:00
nossr50
c8d95dc711 2.1.19 2019-03-18 03:12:00 -07:00
nossr50
bb118607ce Less aggressive detection 2019-03-18 02:40:19 -07:00
nossr50
2d849f55e5 Smaller bounds on fishing scarcity 2019-03-18 00:43:14 -07:00
nossr50
fef9058e16 Fishing is now more aggressive about over casting, added messages about fishing, removed vanilla rewards for exploiters 2019-03-18 00:26:49 -07:00
nossr50
e3d2526939 Improve Fishing AFK detection 2019-03-18 00:11:27 -07:00
nossr50
2f0a58b968 2.1.18 - It turns out Kelp is actually made up of 2 blocks mixed together 2019-03-16 20:26:26 -07:00
nossr50
8994594ed4 2.1.17 - Fix drowned mob spawner logic 2019-03-14 16:52:15 -07:00
nossr50
bb46b2a6ac Drowned Transformation will no longer enabled XP on mob spawners, Kelp will now count the whole block for XP 2019-03-13 13:27:16 -07:00
nossr50
7296deb149 2.1.15 Release - Fixing Fuel Efficiency Max Rank Benefits 2019-03-09 18:10:01 -08:00
nossr50
ef5cd3ec60 2.1.14 release 2019-03-09 17:36:20 -08:00
nossr50
f9f6d1550e Silk Touch toggle in advanced.yml for double drops 2019-03-09 17:31:45 -08:00
nossr50
68e43e3641 Mycellium removed from XP tables for woodcutting 2019-03-09 17:23:17 -08:00
nossr50
93458aa355 Kelp added to Herbalism XP tables 2019-03-09 17:18:04 -08:00
nossr50
e80e771e9d mcMMO now tracks blocks moved by pistons and flags them as unnatural, even if they were natural to combat automated xp farming 2019-03-09 17:12:34 -08:00
nossr50
af9b631ee2 kill flux mining 2019-03-09 16:44:55 -08:00
nossr50
ca5a46508d fixing a bug with setting ranks for fuel efficiency 2019-03-09 16:35:23 -08:00
nossr50
7703cafa34 fixing compile error 2019-03-09 16:25:51 -08:00
nossr50
437fe29112 Fuel Efficiency now uses a rank system, also fixed some bugs with it 2019-03-09 16:22:20 -08:00
nossr50
28b71804a2 Fixed display bug w/ Fish Diet, added Tropical, Raw Cod/Salmon to eligible foods 2019-03-09 15:48:29 -08:00
nossr50
6f15cd4005 2.1.13 Release 2019-03-08 15:34:35 -08:00
LogGits
3ed4228b72 Added imports 2019-02-16 05:40:49 +10:00
nossr50
ba88831c88 2.1.12 2019-02-15 10:21:39 -08:00
LogGits
93fefa031b Herbalism compatibility with PlayerAnimationEvent
This change in theory should make McMMO herbalism compatible with plugins that utilise PlayerAnimationEvent. The main reason that I want to add this is to fix `no swing` false positives in `AAC` (though didn't get to test this). 

I would appreciate if someone could test this PR and verify that its working without any issues. (I am busy for the next few days so I haven't been able to test it. In theory it looks like it should work. I could have checked if the event `isCancelled()` however, this doesn't seem necessary quite yet. Though, if it is needed I can add it 👍 

Please don't merge this unless it's confirmed completely working. I will find some time to test it out within the next few days.
2019-02-12 13:26:03 +10:00
1104 changed files with 64111 additions and 50460 deletions

1
.gitattributes vendored
View File

@@ -2,3 +2,4 @@
*.png binary
*.wav binary
p

12
.github/FUNDING.yml vendored Normal file
View 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
View File

@@ -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

File diff suppressed because it is too large Load Diff

894
LICENSE
View File

@@ -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>.

View File

@@ -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
[![nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/nossr50)
### Project Lead & Founder
[![com.gmail.nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/com.gmail.nossr50)
#### mcMMO Devs
[![nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/nossr50)
[![kashike](https://secure.gravatar.com/avatar/b5e86d6d443b957fd5cdee55501f3799.png)](https://github.com/kashike)
[![electronicboy](https://secure.gravatar.com/avatar/44759c38d311ce09596de6a2d5b88036.png)](https://github.com/electronicboy)
### Former Lead
#### Classic Maintainer
[![t00thpick1](http://www.gravatar.com/avatar/ee23c7794a0c40120c3474287c7bce06.png)](https://github.com/t00thpick1)
## Former Team Members
### Former Lead & Awesome guy
[![gmcferrin](http://www.gravatar.com/avatar/b64c52daf25d206b27650788b5813b7b.png)](https://github.com/gmcferrin)
### Developers
### Former team members
[![bm01](http://www.gravatar.com/avatar/ec8146f5358177f12e9a252271bbc391.png)](https://github.com/bm01)
[![Glitchfinder](http://www.gravatar.com/avatar/5aa4cce22f72ae9c002ecec30f061d00.png)](https://github.com/Glitchfinder)
[![NuclearW](http://www.gravatar.com/avatar/90926bdcf1c8a75918df5ea5fa801ce6.png)](https://github.com/NuclearW)
[![shatteredbeam](http://www.gravatar.com/avatar/cad3b5d7d39cf5387afb87f494389610.png)](https://github.com/shatteredbeam)
[![TfT_02](http://www.gravatar.com/avatar/b8914f9970e1f6ffd5281ce4770e20a7.png)](https://github.com/TfT-02)
[![t00thpick1](http://www.gravatar.com/avatar/ee23c7794a0c40120c3474287c7bce06.png)](https://github.com/t00thpick1)
[![riking](https://1.gravatar.com/avatar/aca9f37e569ac3a63929920035a91ba4.png)](https://github.com/riking)
### Special thanks
[![EasyMFnE](https://www.gravatar.com/avatar/99c9a1fa3bbf957791ceac7b45daadb0.png)](https://github.com/EasyMFnE)
Added the Alchemy skill
[![TheYeti](https://i.imgur.com/tzFrxdo.png)](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/

View File

@@ -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)

View File

@@ -1,8 +0,0 @@
plugins {
`kotlin-dsl`
}
repositories {
jcenter()
}

View File

@@ -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"
}
}
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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();
}
}

View File

@@ -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
}

View File

@@ -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();
}
}

View File

@@ -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
}

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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)
}
}

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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"));
}
}
}
}

View File

@@ -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();
}
}

View File

@@ -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));
}
}

View File

@@ -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();
}
}
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}

View File

@@ -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()));
}
}

View File

@@ -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()));
}
}

View File

@@ -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;
}
}
}

View File

@@ -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));
}
}

View File

@@ -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())));
}
}

View File

@@ -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);
}

View File

@@ -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)));
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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));
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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()));
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}

View File

@@ -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);
}
}

View File

@@ -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();
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}
}
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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}

View File

@@ -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.

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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
}
}

View File

@@ -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