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

Compare commits

..

148 Commits

Author SHA1 Message Date
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
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
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
54a1475fef Merge pull request #3878 from andris155/patch-2
Update locale_hu_HU.properties
2019-04-15 10:43:12 -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
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
426b1304e2 Numerous tweaks + failsafes added to Loading/Saving of players 2019-04-10 01:52:34 -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
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
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
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
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
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
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
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
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
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
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
nossr50
ba88831c88 2.1.12 2019-02-15 10:21:39 -08:00
557 changed files with 17517 additions and 16429 deletions

350
.gitignore vendored
View File

@@ -1,330 +1,54 @@
# Eclipse stuff
/.classpath
/.project
/.settings
/dependency-reduced-pom.xml
### Eclipse template
#vs code
/.vscode
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
# Maven Depends
/lib
# External tool builders
.externalToolBuilders/
# gradle
/.gradle
/mcMMO-core/.gradle
/mcMMO-core/gradle
# Locally stored "Eclipse launch configurations"
*.launch
# netbeans
/nbproject
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# we use maven!
/build.xml
# CDT-specific (C/C++ Development Tooling)
.cproject
# maven
/target
# CDT- autotools
.autotools
# vim
.*.sw[a-p]
# Java annotation processor (APT)
.factorypath
# various other potential build files
/build
/bin
/dist
/manifest.mf
# PDT-specific (PHP Development Tools)
.buildpath
/world
# sbteclipse plugin
.target
# Mac filesystem dust
*.DS_Store
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
# Scala IDE specific (Scala & Java development for Eclipse)
.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
# 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
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# 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
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Linux template
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .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
*.ipr
*.iws
.idea/
# IntelliJ
# mpeltonen/sbt-idea plugin
.idea_modules/
# Project Stuff
/src/main/resources/mcMMO
# 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
# Compiled class file
# Log file
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
# Other Libraries
*.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*
### 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
# Atlassian Stuff
/atlassian-ide-plugin.xml

View File

@@ -7,12 +7,260 @@ Key:
! Change
- Removal
Version 2.2.0
mcMMO has a new config system (WIP)
mcMMO for Bukkit no longer requires Spigot in order to play, you can now use Bukkit instead (WIP)
mcMMO is now abstracted from the Bukkit API in order to support more platforms (WIP)
mcMMO has changed from using maven to gradle!
mcMMO is now a gradle project (this makes it much easier for us to support older versions of MC and other APIs)
Version 2.1.47
Fix NPE when party leader is offline and players grab a party list
Version 2.1.46
Party member lists now show the whole party, including offline players again.
Party lists now have special markers for players who are in shared XP range
Party lists now have special markers for players who are offline
Party lists now have special markers for the party leader
Fixed an error where bleed was setting health outside minimum values
[See NOTE] Fixed a bug where Creepers and Zombies were not dropping the correct heads from Shake (thanks Zed-I)
[See NOTE] Fixed a bug where salvage was not returning the correct amount of materials for AXE items (thanks Zed-I)
[See NOTE] Added missing STRIPPED_WOOD entries to experience.yml for Woodcutting
[See NOTE] Added about 15-20 missing entries to experience.yml for coral to Herbalism
Fixed a bug where admin chat from console would fail to send (thanks OverCrave)
Reduced default XP values for DEAD_* coral plants from 30 -> 10
Updated hu_HU locale (thanks andris155)
NOTE: These bugfixes were related to default config values, to receive these changes you can either delete experience.yml, treasures.yml and salvage.vanilla.yml to generate new ones or make the necessary edits.
This is what the files should look like after being edited.
Experience Correct Default Config - https://paste.gg/p/anonymous/ff695df1417e4232957a3d176fd14ed4
Salvage Correct Default Config - https://paste.gg/p/anonymous/c4eb2f4e66ed444e872021051760f3be
Treasures Correct Default Config - https://paste.gg/p/anonymous/b0120210f8c149958ca0303c68c19ebd
Version 2.1.45
mcMMO will now check to see if the server version is incompatible and inform server admins on how to fix the problem.
Version 2.1.44
Fixed a NPE with Alchemy brewing
Version 2.1.43
Fixed a bug that would result in players being told they they failed to salvage enchantments when in reality they succeeded.
Version 2.1.42
Fixed McMMOPlayerNotFoundException being thrown instead of null
(API) UserManager.getPlayer() returns null again (oopsie)
Added new perk permission node `mcmmo.perks.bypass.salvageenchant` - guarantees full enchantment return for Salvage
Added alternative permission node `mcmmo.perks.bypass.repairenchant` - guarantees full enchantment return for Repair
Added new wildcard perk `mcmmo.perks.bypass.*` and `mcmmo.perks.bypass.all` (either of these will grant all new mcmmo.perks.bypass perk permissions)
NOTE: Sorry about that, when trying to improve Bungee Cord compatibility I made a big oopsie!
NOTE: Repair's new perk permission works in the exact same way as mcmmo.bypass.arcanebypass, bypass perk permissions will all eventually be moved to `mcmmo.perks.bypass`
NOTE: Expect perk permissions to all be moved to `mcmmo.perks.X` in the near future
Version 2.1.41
Fixed NullPointerException errors when trying to grab PlayerProfiles for players who have not loaded
Added new locale string Profile.PendingLoad
Added new locale string Commands.Database.CooldownMS
Fixed a display error preventing the remaining time on /mcrank from being shown if it was on cooldown
Version 2.1.40
(API) mcMMO will now return null in all cases for UserManager.getPlayerProfile() if they have not been loaded yet
(API) Roll stores exploit data in AcrobaticsManager now
Added new locale string "Profile.Loading.FailureNotice"
Added new locale string "Profile.Loading.FailurePlayer"
mcMMO no longer gives up forever if a player profile fails to load and the player is still online
mcMMO will attempt to save a profile up to 10 times now, previously it would only try one time.
Fixed an ArrayIndexOutOfBounds error with Party Chat
Player data for mcMMO is now loaded 3 seconds after a player connects in order to give any ongoing save tasks from other servers a small grace period to finish. This will mostly be useful to Bungee servers.
NOTES: I received reports from some users saying that saving and loading was failing could fail and not recover, I have implemented some fail safes to greatly reduce the the odds of that happening.
Version 2.1.39
Salvaging an item should now only play the item break sound (was playing the anvil sound simultaneously before)
Fixed bug where Tall_Grass was not giving full XP
Added Tall_Seagrass and Seagrass to experience.yml under Herbalism (update your configs)
NOTE: This is what your herbalism section in experience.yml should look like - https://paste.gg/p/anonymous/d5b03bd56e8442f2836f8a954d2974de
Version 2.1.38
Roll XP cooldown down from 60 seconds to 10
Updated pt_BR localization (thanks FabioZumbi12)
NOTE: The XP Cooldown will be configurable in 2.2 which is nearing the finish line
Version 2.1.37
Fixed a potential IndexOutOfBoundsException when informing a disconnected player that their Blast Mining was off CD
Updated hu_HU locale (thanks andris)
Version 2.1.36
Updated German locale (Thanks OverCrave)
Fixed a bug preventing Villagers from giving combat XP
The /mcnotify command will now squelch almost all chat messages or action bar notifications sent to the player from mcMMO
mcMMO will now remind players on an hourly basis that they are are not receiving notifications from mcMMO if they have run the mcnotify command and toggled squelch mode
Added a new setting to advanced.yml "Feedback.PlayerTips", when set to true this will allow mcMMO to send periodic helpful messages to players, currently this only affects mcnotify reminders.
Version 2.1.35
Readded the detonator config option
NOTE: I decided to make the detonator configurable again because 2.2 is some ways off. Sorry for the inconvenience.
NOTE: Pickaxes are now usable for blast mining, this is in addition to the detonator that you can specify in the config. This will be more configurable in the upcoming 2.2 update.
Version 2.1.34
Added Llama to taming XP tables
Added Parrot to taming XP tables
Pickaxes are now used to activate Blast Mining instead of Flint
The detonator for Blast Mining is no longer configurable
Fixed a bug where Blast Mining did not show cooldown length correctly
NOTE: You'll have to add these entries in yourself, this is what it should look like: https://paste.gg/p/anonymous/aadbcfde3eb3470fb13caebde4065a03
Alternatively you can delete the experience config file to generate a new one
Version 2.1.33
Renamed "Skills.Acrobatics.Prevent_AFK_Leveling" to "ExploitFix.Acrobatics"
ExploitFix.Acrobatics when set to false allows gaining XP in Acrobatics freely with no anti-grind measures
NOTE: The anti-grinding/exploit stuff is fully configurable in update 2.2 coming soon, this hotfix is to hold you over until that update comes out.
Version 2.1.32
Completely removed Fireworks from mcMMO because they lag
Added 'General.AprilFoolsEvent' setting to config.yml to turn off April Fools
NOTE: April Fools event has been in mcMMO for a long time, I did not write it so I didn't know it spawned fireworks like crazy.
Version 2.1.31
Fixed a bug where certain SubSkills did not properly send unlock or rank up notifications
Fixed a bug where unlock notifications would send simultaneously for a specific skill (still happens if mmoedit changes all skill levels on a player at once)
Fixed a bug where mmoedit triggered notifications for skills already gained
Fixed NPE with grabbing offline player skill ranks through certain API methods (thanks Ineusia)
Updated German language locale (thanks OverCrave)
Version 2.1.30
Fixed double drops behaving oddly
Double_Drop config table has been renamed to Bonus_Drops, this is to jankily auto-update everyones config
DoubleDrop config tables now must contain all things that can possibly be doubled, such as the Ore block, the ore itself, etc.
Added the following items to the Bonus_Drops tables for Mining: Coal, Diamond, Emerald, Glowstone_Dust, Iron_Ingot, Lapis_Lazuli, Nether_Quartz, Redstone, Cobblestone
Added the following items to the Bonus_Drops tables for Herbalism: Beetroot, Carrot, Cocoa_Beans, Melon_Slice, Potatoe
Added the following items to the Bonus_Drops tables for Woodcutting: Birch_Wood, Spruce_Wood, Jungle_Wood, Dark_Oak_Wood, Oak_Wood, Acacia_Wood
NOTE: You don't need to update your configs for this one unless you had custom entries in the Double_Drop tables, the renaming of the key will auto-insert default values and give everyone correct defaults
NOTE: I'm gonna have to blame Bukkit on this one, several API methods I used are actually unfinished and kind of janky. So I hacked something together to make them work.
Version 2.1.29
Fixed a bug where double drops and triple drops were not activating
Version 2.1.28
Fixed a bug where Archery could not gain XP
Version 2.1.27
Fixed an exploit that allowed players to duplicate torches, and rails
Version 2.1.26
Added new scaling damage buffs to all existing Combat Skills
Added a new subskill named Stab to Swords
Fixed a bug where Berserk was not adding 50% damage to attacks
Changed how Iron Arm damage is calculated (Rank 1 now effectively gives twice the damage bonus it used to, higher ranks have more damage)
NOTE: Combat skills will be completely configurable in the upcoming 2.2 update, be patient <3
New Permissions
- mcmmo.ability.unarmed.unarmedlimitbreak
- mcmmo.ability.axes.axeslimitbreak
- mcmmo.ability.archery.archerylimitbreak
- mcmmo.ability.swords.swordslimitbreak
- mcmmo.ability.swords.stab
Notes:
The new Limit Break subskills are intended to make Prot IV players less tanky and for you to feel more powerful for having high skill level.
Limit Break has 10 ranks, each rank gives 1 extra RAW damage, this is damage before reductions from armor and enchantments. The net result is you deal about 50% more damage with an end game skill compared to before.
With these new changes, most skills can 2 shot normal diamond armor, and it takes about 5 hits to kill someone in Prot IV Diamond Armor.
I'm not sure everyone will like these changes, the net result is players are a lot easier to kill now, whereas before you could take quite a beating before getting killed.
I collected several sets of data before making these changes, including damage to player with and without prot 4 diamond armor, damage to those players with and without enchanted weapons, damage with and without leveling your skills, and combinations of the previously mentioned things.
Version 2.1.25
Shake now has an upper limit of damage (10) - Will be configurable in 2.2 which is coming in the near future
Rank 1 of Catalysis & Concoctions are now available at level 0 by default (update skillranks.yml or delete it to regen a new one)
NOTE: The change to shake was to make mcMMO more compatible with plugins that spawn entities with large amounts of HP
Version 2.1.24
Fixed an exploit where you could clone inventories
Version 2.1.23
Fixed a bug with Double Drops for Mining (Update your configs instructions below)
Fixed a 7 year old bug where damage in mcMMO from SkillBs was potentially getting reduced by damage reduction TWICE
Fixed a bug where killing entities with Rupture would not properly credit you as the killer
Fixed a bug where Serrated Strikes was applying Rupture twice
Players will now be ejected from Minecarts if they cast their fishing rod (anti-afk)
Many nerfs to Rupture, its now much more reasonable and not very useful against Protection IV opponents
Rupture's strength is now related to your equipped Sword
Rupture will no longer be applied if the target is blocking, this doesn't prevent existing bleed damage from occurring though.
Wolf's Rupture has strength equivalent to a Stone Sword
Only Diamond swords will have bonus rupture damage at Rank 4
Rupture damage is cut in half for weapons below Diamond in quality, if the weapon is wooden, the damage is cut in half again.
Swords below Diamond quality will have their tick duration drastically reduced
Rupture damage is reduced by 25% on players if they are wearing Full Armor (can be any type)
Note: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically.
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
NOTE: Due to the nature of these fixes, Fortune enchants now work with Double/Triple drops
Version 2.1.22
Less aggressive spam click protection on Fishing
Updated Hungarian file for missing entries related to Fishing messages (credit: andris155)
Added all missing flowers to Double Drop tables for Herbalism
Fixed bug where Repair Mastery was calculating player skill level incorrectly when determining bonuses
Fixed Double Drop entries for all farming crops for Herbalism
It no longer requires seeds to replant crops if you are harvesting crops with a hoe (will still consume seeds if you aren't)
NOTE: You'll need to add these entries to your config.yml manually, or wait for the upcoming config update where this will be fixed for you automatically.
NOTE: Here's what your Double_Drop entries in Config.yml for Herbalism should look like: https://paste.gg/p/anonymous/8d8db4ac69bd495fa48a7f5190484c5e
Version 2.1.21
Improved anti-farm/anti-grinding mechanics for Rolling
When you gain XP from Rolling there is a cooldown period (60~ seconds) for gaining XP again
This XP cooldown period extends if players are taking fall damage within the cooldown period
NOTE: Roll already has a few built in measures to prevent XP grinding / abuse, those are still the same.
NOTE: Rolls still happen in the cooldown period, you just won't gain XP.
Version 2.1.20
Added Hungarian localization (Locale code: hu_HU) (thanks andris155)
Players can now fish in the same spot about 3 times before mcMMO will mark the area as being over-fished (over-fishing is to prevent abuse)
Added a toggle to turn off the fishing exploit detection to experience.yml "ExploitFix.Fishing"
Note: The new config update is coming soon and will use a different setting, putting this out as a band-aid fix for people that don't like the new fishing exploit prevention stuff
Added a message to warn players that their next fishing attempt will result in over-fishing (Locale: Fishing.LowResources)
Version 2.1.19
Greatly Improved Fishing AFK/Exploit Detection
Fixed a bug where Fishing AFK detection did not work on a new exploit
Certain exploits for Fishing now result in players losing small amounts of hunger and durability
Players who get detected by Fishing's anti-exploit measures will no longer get vanilla rewards from Minecraft
**Note: Previously if mcMMO detected you abusing Fishing it just switched you over to vanilla Minecraft fishing rewards, this change is to help server admins who don't want players to get any kind of reward from AFK fishing
Fishing now drops several hints to players if they are triggering the exploit detection
**Note: Not all types of exploit detection will warn players, this is just to prevent legitimate fishers from being confused by the aggressive exploit detection.
Added messages to warn players about fishing in the same spot (Locale: Fishing.Scarcity)
Added messages to warn players who exploit in order to catch fish unusually fast (Locale: Fishing.Scared)
Added messages to warn players about casting the fishing rod too often (Locale: Fishing.Exhausting)
Version 2.1.18
You will need to add Kelp to your experience.yml file for this fix to be fully functional
Breaking Kelp will now properly count its XP
Added "Kelp" to experience.yml (Kelp is actually made up of two blocks mixed together)
It is recommended that Kelp and Kelp_Plant have the same XP value in experience.yml
mcMMO will now calculate XP for plants that are taller than naturally allowed (Cactus above 3 block height, etc)
Version 2.1.17
Fixed a logic error that resulted in Drowned giving no XP
Fixed a bug that resulted in mob spawner entities to not be marked for no xp after being transforming into Drowned
Version 2.1.16
Breaking Kelp should now count the whole plant for XP
Spawned Mobs that are not supposed to award XP will no longer reward XP once transformed (ie: drowned)
Version 2.1.15
Fixed a bug where a max rank of Fuel Efficiency would cause its benefits to be lost
Version 2.1.14
Added a config option to toggle double drops for Silk Touch pickaxes (advanced.yml "Skills.Mining.DoubleDrops.SilkTouch"
Mycelium removed from Woodcutting XP tables (because its soil!)
Kelp added to Herbalism XP tables
mcMMO now flags blocks moved by piston as not natural to prevent automated XP farms
Fixed a bug where Fuel Efficiency was way too good
Fixed a display issue with Fisherman's Diet
Fuel Efficiency now uses the rank system
Removed Fuel Efficiency config options in advanced.yml
Added Tropical Fish, Raw Cod, Raw Salmon to the list of foods that benefit from Fisherman's Diet
Version 2.1.13
Fixed a bug where Archery's Arrow Retrieval was using the wrong permission node
Version 2.1.12
Salvage config entries are no longer case sensitive
@@ -446,7 +694,7 @@ Version 1.4.08
= Fixed bug which prevented players from gaining Acrobatics XP when the setting 'Prevent_XP_After_Teleport' was set to false
= Fixed bug where cooldown donor perks were reducing more than expected
= Fixed bug where disabling hardcore mode for specific skills didn't work
= Fixed bug which caused the net.shatteredlands.shatt.backup cleanup to delete old backups while it should have kept those
= Fixed bug which caused the backup cleanup to delete old backups while it should have kept those
= Fixed bug where party chat broke if the display name contained special characters
= Fixed bug where `/addlevels all` and `/skillreset all` didn't work
= Fixed bug which made it possible to gain XP by taming the same horse multiple times, if a player "untamed" that horse
@@ -794,7 +1042,7 @@ Version 1.4.00
! Changed Excavation to have individual XP values for each block type, rather than a base XP value.
! Changed the way party teleportation works. When using /ptp, the target player needs to confirm the teleport before it takes place. (Configurable)
! Changed BeastLore: Now also displays offline player names
! Changed net.shatteredlands.shatt.backup task to include ALL config files
! Changed backup task to include ALL config files
! Deprecated most functions in ExperienceAPI, replaced them with identical versions that use a String for the SkillName rather than the SkillType enum values
! Changed Super Breaker & Giga Drill Breaker to be an enchantment-based boost, rather than an instabreak. Option exists in hidden.yml to change this to an potion-based buff.
! Changed locales to fall back on English when translated strings cannot be found.
@@ -1017,7 +1265,7 @@ Version 1.3.07
+ Added permission nodes for Treasure & Magic Hunter for Fishing
+ Added a permission node for Farmer's Diet
+ Added config options for enabling/disabling specific double drops
+ Added automatic zip net.shatteredlands.shatt.backup of flatfile database & config files
+ Added automatic zip backup of flatfile database & config files
+ Added config options to enable/disable specific skills for PVP & PVE
= Fixed bug where Tree Feller was looking at the wrong blocks for determining how much to take down.
= Fixed bug where Green Terra consumed seeds even on Mossy Stone Brick
@@ -1603,7 +1851,7 @@ Fixed bug with randomly receiving Taming XP
mcmmo.users file moved into /plugins/mcMMO/FlatFileStuff/
Leaderboard files now moved into /plugins/mcMMO/FlatFileStuff/Leaderboards
Locale files now have the prefix locale_ instead of messages_
Locale files are now located inside com/com.gmail/com.gmail.nossr50/locale/ instead of com/com.gmail/com.gmail.nossr50/
Locale files are now located inside com/gmail/nossr50/locale/ instead of com/gmail/nossr50/
Updated the code that handles permissions (this may mean 3.1.6 will finally play well!)
Some more source code organization
Fixed warnings for compiler

View File

@@ -5,53 +5,43 @@
I'm working on a brand new website for mcMMO
You can check it out here http://www.mcmmo.org
Spigot Resource: https://www.spigotmc.org/resources/official-mcmmo-original-author-returns.64348/
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.
## About the Team
mcMMO is currently developed by a team of individuals from all over the world.
In December 2018 nossr50 returned as project lead for mcMMO once again to develop and improve mcMMO.
The mcMMO team currently has two members, nossr50 (lead) and t00thpick1 (classic maintainer).
mcMMO is currently developed almost entirely by nossr50, many thanks go out to the many developers who have worked on the project over the years.
### Project Lead & Founder
[![com.gmail.nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/com.gmail.nossr50)
[![nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/nossr50)
### Former Lead
Other mcMMO Projects
### 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
@@ -62,5 +52,8 @@ The typical command used to build mcMMO is: `mvn clean package install`
Required Libraries:
* Bukkit
* JUnit
* WorldGuard 7
* bStats Bukkit
https://spigot.mcmmo.org for more up to date information.
http://spigot.mcmmo.org for more up to date information.
https://www.spigotmc.org/resources/official-mcmmo-original-author-returns.64348/

View File

@@ -1,139 +0,0 @@
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))
}
}
}
// 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,9 +0,0 @@
#
# This file includes a few settings for each skill in mcMMO
#Acrobatics
Acrobatics:
# turn this to false to disable all subskills for this skill
Enabled: true
Roll:
Enabled: true

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

View File

@@ -1,34 +0,0 @@
This file is just going to take note of all the caveats of mcMMO code as I abstract out bukkit
1) In several places mcMMO is disabling itself, pretty sure this is not a good idea and this should be changed
eg: in McMMOPlayer, and when loading configs and finding bad values
2) mcMMO uses a a global reference of its Plugin class for Bukkit in order to schedule tasks
3) Need to configure the logger
4) Safety check the hardcore/vampirism commands
5) Tweak configs to not do any string operations
6) Need to add and check validation for all current configs
7) Weird stuff going on with ageables and strings in general in StringUtils
8) Reduce the amount of string operations in mcMMO as much as possible
////////////
CONFIG NOTES
///////////
1) All Config files need their validation redone and checked
2) All Config files need unload programmed in
3) All Config files need string operations reduced and to be double checked for errors in paths
4) Need to setup removing old keys on configs

View File

@@ -1,11 +0,0 @@
package com.gmail.nossr50.core.api.exceptions;
import com.gmail.nossr50.core.mcmmo.entity.Player;
public class McMMOPlayerNotFoundException extends RuntimeException {
private static final long serialVersionUID = 761917904993202836L;
public McMMOPlayerNotFoundException(Player player) {
super("McMMOPlayer object was not found for: " + player.getName() + " " + player.getUUID());
}
}

View File

@@ -1,21 +0,0 @@
package com.gmail.nossr50.core.chat;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.events.chat.McMMOAdminChatEvent;
public class AdminChatManager extends ChatManager {
protected AdminChatManager() {
super(MainConfig.getInstance().getAdminDisplayNames(), MainConfig.getInstance().getAdminChatPrefix());
}
@Override
public void handleChat(String senderName, String displayName, String message, boolean isAsync) {
handleChat(new McMMOAdminChatEvent(senderName, displayName, message, isAsync));
}
@Override
protected void sendMessage() {
McmmoCore.getServer().broadcast(message, "mcmmo.chat.adminchat");
}
}

View File

@@ -1,723 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.datatypes.interactions.NotificationType;
import com.gmail.nossr50.core.mcmmo.colors.ChatColor;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import java.util.ArrayList;
import java.util.List;
//@ConfigSerializable
public class AdvancedConfig extends ConfigValidated {
public static final String SKILLS = "Skills";
public static final String GENERAL = "General";
public static final String ABILITY = "Ability";
public static final String LENGTH = "Length";
public static final String INCREASE_LEVEL = "IncreaseLevel";
public static final String ENCHANT_BUFF = "EnchantBuff";
public static final String ACROBATICS = "Acrobatics";
public static final String DODGE = "Dodge";
public static final String CHANCE = "Chance";
public static final String CHANCE_MAX = CHANCE + "Max";
public static final String BONUS = "Bonus";
public static final String MAX_BONUS_LEVEL = "Max" + BONUS + "Level";
public static final String MODIFIER = "Modifier";
public static final String DAMAGE_MODIFIER = "Damage" + MODIFIER;
public static final String DAMAGE_THRESHOLD = "DamageThreshold";
public static final String ALCHEMY = "Alchemy";
public static final String CATALYSIS = "Catalysis";
public static final String MIN_SPEED = "MinSpeed";
public static final String MAX_SPEED = "MaxSpeed";
public static final String ARCHERY = "Archery";
public static final String SKILL_SHOT = "SkillShot";
public static final String MULTIPLIER = "Multiplier";
public static final String RANK_DAMAGE_MULTIPLIER = "RankDamage" + MULTIPLIER;
public static final String BONUS_DAMAGE = BONUS + "Damage";
public static final String FORCE_MULTIPLIER = "Force" + MULTIPLIER;
public static final String AXES = "Axes";
public static final String STANDARD = "Standard";
public static final String RETRO_MODE = "RetroMode";
public static final String CAP_LEVEL = "CapLevel";
public static final String KNOCKBACK_MODIFIER = "Knockback" + MODIFIER;
public static final String PVP_MODIFIER = "PVP_" + MODIFIER;
public static final String PVE_MODIFIER = "PVE_" + MODIFIER;
public static final String FISHING = "Fishing";
public static final String MASTER_ANGLER = "MasterAngler";
public static final String BOAT_MODIFIER = "Boat" + MODIFIER;
public static final String BIOME_MODIFIER = "Biome" + MODIFIER;
public static final String XP = "XP";
public static final String VANILLA_XPMULTIPLIER = "Vanilla" + XP + MULTIPLIER;
public static final String RANK = "Rank_";
public static final String TAMING = "Taming";
public static final String CALL_OF_THE_WILD = "CallOfTheWild";
public static final String MIN_HORSE_JUMP_STRENGTH = "MinHorseJumpStrength";
public static final String MAX_HORSE_JUMP_STRENGTH = "MaxHorseJumpStrength";
public static final String SHOCK_PROOF = "ShockProof";
public static final String UNARMED = "Unarmed";
public static final String STARTING_LEVEL = "StartingLevel";
public static final String AXE_MASTERY = "AxeMastery";
public static final String CRITICAL_STRIKES = "CriticalStrikes";
public static final String GREATER_IMPACT = "GreaterImpact";
public static final String ARMOR_IMPACT = "ArmorImpact";
public static final String SKULL_SPLITTER = "SkullSplitter.";
public static final String MAX_PERCENTAGE_DURABILITY_DAMAGE = "MaxPercentageDurabilityDamage";
public static final String SHAKE = "Shake";
public static final String MINING = "Mining";
public static final String BLAST_MINING = "BlastMining";
public static final String LEVELS = "Levels";
public static final String BLAST_DAMAGE_DECREASE = "BlastDamageDecrease";
public static final String ORE_BONUS = "Ore" + BONUS;
public static final String DEBRIS_REDUCTION = "DebrisReduction";
public static final String DROP_MULTIPLIER = "Drop" + MULTIPLIER;
public static final String BLAST_RADIUS = "BlastRadius";
public static final String REPAIR = "Repair";
public static final String REPAIR_MASTERY = "RepairMastery";
public static final String MAX_BONUS_PERCENTAGE = "Max" + BONUS + "Percentage";
public static final String ARCANE_FORGING = "ArcaneForging";
public static final String MAY_LOSE_ENCHANTS = "May_Lose_Enchants";
public static final String KEEP_ENCHANTS = "Keep_Enchants_";
public static final String DOWNGRADES = "Downgrades_";
public static final String ENABLED = "Enabled";
public static final String DOWNGRADES_ENABLED = DOWNGRADES + ENABLED;
public static final String SALVAGE = "Salvage";
public static final String ARCANE_SALVAGE = "ArcaneSalvage";
public static final String ENCHANT_DOWNGRADE_ENABLED = "EnchantDowngrade" + ENABLED;
public static final String ENCHANT_LOSS_ENABLED = "EnchantLoss" + ENABLED;
public static final String EXTRACT_FULL_ENCHANT = "ExtractFullEnchant";
public static final String EXTRACT_PARTIAL_ENCHANT = "ExtractPartialEnchant";
public static final String SMELTING = "Smelting";
public static final String FUEL_EFFICIENCY = "FuelEfficiency";
public static final String FLUX = "Flux";
public static final String SWORDS = "Swords";
public static final String RUPTURE = "Rupture";
public static final String DAMAGE_PLAYER = "DamagePlayer";
public static final String DAMAGE_MOBS = "DamageMobs";
public static final String MAX_TICKS = "MaxTicks";
public static final String BASE_TICKS = "BaseTicks";
public static final String COUNTER_ATTACK = "CounterAttack";
public static final String SERRATED_STRIKES = "SerratedStrikes";
public static final String TICKS = "Ticks";
public static final String GORE = "Gore";
public static final String FAST_FOOD = "FastFood";
public static final String FAST_FOOD_SERVICE = FAST_FOOD + "Service";
public static final String PUMMEL = "Pummel";
public static final String THICK_FUR = "ThickFur";
public static final String SHARPENED_CLAWS = "SharpenedClaws";
public static final String DISARM = "Disarm";
public static final String ANTI_THEFT = "AntiTheft";
public static final String DAZE = "Daze";
public static final String MAX_DAMAGE = "MaxDamage";
public static final String ROLL = "Roll";
public static final String GRACEFUL_ROLL = "Graceful" + ROLL;
public static final String ARROW_DEFLECT = "ArrowDeflect";
public static final String IRON_GRIP = "IronGrip";
public static final String WOODCUTTING = "Woodcutting";
public static final String HARVEST_LUMBER = "HarvestLumber";
public static final String FEEDBACK = "Feedback";
public static final String SKILL_COMMAND = "SkillCommand";
public static final String BLANK_LINES_ABOVE_HEADER = "BlankLinesAboveHeader";
public static final String ACTION_BAR_NOTIFICATIONS = "ActionBarNotifications";
public static final String SEND_COPY_OF_MESSAGE_TO_CHAT = "SendCopyOfMessageToChat";
public static final String EVENTS = "Events";
public static final String SEND_TITLES = "SendTitles";
private static AdvancedConfig instance;
private AdvancedConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "advanced.yml", true);
}
public static AdvancedConfig getInstance() {
if (instance == null) {
instance = new AdvancedConfig();
}
return instance;
}
/**
* The version of this config
*
* @return
*/
@Override
public double getConfigVersion() {
return 1;
}
@Override
public List<String> validateKeys() {
// Validate all the settings!
List<String> reason = new ArrayList<String>();
/* GENERAL */
if (getAbilityLength() < 1) {
reason.add(SKILLS + "." + GENERAL + "." + ABILITY + "." + LENGTH + ".<mode>." + INCREASE_LEVEL + " should be at least 1!");
}
if (getEnchantBuff() < 1) {
reason.add(SKILLS + "." + GENERAL + "." + ABILITY + "." + ENCHANT_BUFF + " should be at least 1!");
}
/* ACROBATICS */
if (getMaximumProbability(SubSkillType.ACROBATICS_DODGE) < 1) {
reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.ACROBATICS_DODGE) < 1) {
reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getDodgeDamageModifier() <= 1) {
reason.add(SKILLS + "." + ACROBATICS + "." + DODGE + "." + DAMAGE_MODIFIER + " should be greater than 1!");
}
if (getMaximumProbability(SubSkillType.ACROBATICS_ROLL) < 1) {
reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.ACROBATICS_ROLL) < 1) {
reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getRollDamageThreshold() < 0) {
reason.add(SKILLS + "." + ACROBATICS + "." + ROLL + "." + DAMAGE_THRESHOLD + " should be at least 0!");
}
if (getGracefulRollDamageThreshold() < 0) {
reason.add(SKILLS + "." + ACROBATICS + "." + GRACEFUL_ROLL + "." + DAMAGE_THRESHOLD + " should be at least 0!");
}
if (getCatalysisMinSpeed() <= 0) {
reason.add(SKILLS + "." + ALCHEMY + "." + CATALYSIS + "." + MIN_SPEED + " must be greater than 0!");
}
if (getCatalysisMaxSpeed() < getCatalysisMinSpeed()) {
reason.add(SKILLS + "." + ALCHEMY + "." + CATALYSIS + "." + MAX_SPEED + " should be at least Skills.Alchemy.Catalysis." + MIN_SPEED + "!");
}
/* ARCHERY */
if (getSkillShotRankDamageMultiplier() <= 0) {
reason.add(SKILLS + "." + ARCHERY + "." + SKILL_SHOT + "." + RANK_DAMAGE_MULTIPLIER + " should be greater than 0!");
}
if (getMaximumProbability(SubSkillType.ARCHERY_DAZE) < 1) {
reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.ARCHERY_DAZE) < 1) {
reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getDazeBonusDamage() < 0) {
reason.add(SKILLS + "." + ARCHERY + "." + DAZE + "." + BONUS_DAMAGE + " should be at least 0!");
}
if (getMaximumProbability(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
reason.add(SKILLS + "." + ARCHERY + ".Retrieve." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.ARCHERY_ARROW_RETRIEVAL) < 1) {
reason.add(SKILLS + "." + ARCHERY + ".Retrieve." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getForceMultiplier() < 0) {
reason.add(SKILLS + "." + ARCHERY + "." + FORCE_MULTIPLIER + " should be at least 0!");
}
/* AXES */
if(getAxeMasteryRankDamageMultiplier() < 0)
{
reason.add(SKILLS + "." + AXES + "." + AXE_MASTERY + "." + RANK_DAMAGE_MULTIPLIER + " should be at least 0!");
}
if (getMaximumProbability(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
reason.add(SKILLS + "." + AXES + ".CriticalHit." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.AXES_CRITICAL_STRIKES) < 1) {
reason.add(SKILLS + "." + AXES + ".CriticalHit." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getCriticalStrikesPVPModifier() < 1) {
reason.add(SKILLS + "." + AXES + "." + CRITICAL_STRIKES + "." + PVP_MODIFIER + " should be at least 1!");
}
if (getCriticalStrikesPVPModifier() < 1) {
reason.add(SKILLS + "." + AXES + "." + CRITICAL_STRIKES + "." + PVE_MODIFIER + " should be at least 1!");
}
if (getGreaterImpactChance() < 1) {
reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + CHANCE + " should be at least 1!");
}
if (getGreaterImpactModifier() < 1) {
reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + KNOCKBACK_MODIFIER + " should be at least 1!");
}
if (getGreaterImpactBonusDamage() < 1) {
reason.add(SKILLS + "." + AXES + "." + GREATER_IMPACT + "." + BONUS_DAMAGE + " should be at least 1!");
}
if (getArmorImpactIncreaseLevel() < 1) {
reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + INCREASE_LEVEL + " should be at least 1!");
}
if (getImpactChance() < 1) {
reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + CHANCE + " should be at least 1!");
}
if (getArmorImpactMaxDurabilityDamage() < 1) {
reason.add(SKILLS + "." + AXES + "." + ARMOR_IMPACT + "." + MAX_PERCENTAGE_DURABILITY_DAMAGE + " should be at least 1!");
}
if (getSkullSplitterModifier() < 1) {
reason.add(SKILLS + "." + AXES + "." + SKULL_SPLITTER + DAMAGE_MODIFIER + " should be at least 1!");
}
/*if (getFishermanDietRankChange() < 1) {
reason.add(SKILLS + "." + FISHING + ".FishermansDiet.RankChange should be at least 1!");
}*/
if (getMasterAnglerBoatModifier() < 1) {
reason.add(SKILLS + "." + FISHING + "." + MASTER_ANGLER + "." + BOAT_MODIFIER + " should be at least 1!");
}
if (getMasterAnglerBiomeModifier() < 1) {
reason.add(SKILLS + "." + FISHING + "." + MASTER_ANGLER + "." + BIOME_MODIFIER + " should be at least 1!");
}
/* HERBALISM */
/*if (getFarmerDietRankChange() < 1) {
reason.add(SKILLS + ".Herbalism.FarmersDiet.RankChange should be at least 1!");
}
if (getGreenThumbStageChange() < 1) {
reason.add(SKILLS + ".Herbalism.GreenThumb.StageChange should be at least 1!");
}*/
if (getMaximumProbability(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
reason.add(SKILLS + ".Herbalism.GreenThumb." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.HERBALISM_GREEN_THUMB) < 1) {
reason.add(SKILLS + ".Herbalism.GreenThumb." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
reason.add(SKILLS + ".Herbalism.DoubleDrops." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.HERBALISM_DOUBLE_DROPS) < 1) {
reason.add(SKILLS + ".Herbalism.DoubleDrops." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
reason.add(SKILLS + ".Herbalism.HylianLuck." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.HERBALISM_HYLIAN_LUCK) < 1) {
reason.add(SKILLS + ".Herbalism.HylianLuck." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
reason.add(SKILLS + ".Herbalism.ShroomThumb." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.HERBALISM_SHROOM_THUMB) < 1) {
reason.add(SKILLS + ".Herbalism.ShroomThumb." + MAX_BONUS_LEVEL + " should be at least 1!");
}
/* MINING */
if (getMaximumProbability(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
reason.add(SKILLS + "." + MINING + ".DoubleDrops." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.MINING_DOUBLE_DROPS) < 1) {
reason.add(SKILLS + "." + MINING + ".DoubleDrops." + MAX_BONUS_LEVEL + " should be at least 1!");
}
/* REPAIR */
if (getRepairMasteryMaxBonus() < 1) {
reason.add(SKILLS + "." + REPAIR + "." + REPAIR_MASTERY + "." + MAX_BONUS_PERCENTAGE + " should be at least 1!");
}
if (getRepairMasteryMaxLevel() < 1) {
reason.add(SKILLS + "." + REPAIR + "." + REPAIR_MASTERY + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
reason.add(SKILLS + "." + REPAIR + ".SuperRepair." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.REPAIR_SUPER_REPAIR) < 1) {
reason.add(SKILLS + "." + REPAIR + ".SuperRepair." + MAX_BONUS_LEVEL + " should be at least 1!");
}
/* SMELTING */
if (getBurnModifierMaxLevel() < 1) {
reason.add(SKILLS + "." + SMELTING + "." + FUEL_EFFICIENCY + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getBurnTimeMultiplier() < 1) {
reason.add(SKILLS + "." + SMELTING + "." + FUEL_EFFICIENCY + "." + MULTIPLIER + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
reason.add(SKILLS + "." + SMELTING + ".SecondSmelt." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.SMELTING_SECOND_SMELT) < 1) {
reason.add(SKILLS + "." + SMELTING + ".SecondSmelt." + CHANCE_MAX + " should be at least 1!");
}
if (getFluxMiningChance() < 1) {
reason.add(SKILLS + "." + SMELTING + "." + FLUX + MINING + "." + CHANCE + " should be at least 1!");
}
/* SWORDS */
if (getMaximumProbability(SubSkillType.SWORDS_RUPTURE) < 1) {
reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.SWORDS_RUPTURE) < 1) {
reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getRuptureMaxTicks() < 1) {
reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_TICKS + " should be at least 1!");
}
if (getRuptureMaxTicks() < getRuptureBaseTicks()) {
reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + MAX_TICKS + " should be at least Skills.Swords.Rupture." + BASE_TICKS + "!");
}
if (getRuptureBaseTicks() < 1) {
reason.add(SKILLS + "." + SWORDS + "." + RUPTURE + "." + BASE_TICKS + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.SWORDS_COUNTER_ATTACK) < 1) {
reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getCounterModifier() < 1) {
reason.add(SKILLS + "." + SWORDS + "." + COUNTER_ATTACK + "." + DAMAGE_MODIFIER + " should be at least 1!");
}
if (getSerratedStrikesModifier() < 1) {
reason.add(SKILLS + "." + SWORDS + "." + SERRATED_STRIKES + "." + DAMAGE_MODIFIER + " should be at least 1!");
}
if (getSerratedStrikesTicks() < 1) {
reason.add(SKILLS + "." + SWORDS + "." + SERRATED_STRIKES + "." + RUPTURE + "Ticks should be at least 1!");
}
/* TAMING */
if (getMaximumProbability(SubSkillType.TAMING_GORE) < 1) {
reason.add(SKILLS + "." + TAMING + "." + GORE + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.TAMING_GORE) < 1) {
reason.add(SKILLS + "." + TAMING + "." + GORE + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getGoreModifier() < 1) {
reason.add(SKILLS + "." + TAMING + "." + GORE + "." + MODIFIER + " should be at least 1!");
}
if (getFastFoodChance() < 1) {
reason.add(SKILLS + "." + TAMING + "." + FAST_FOOD + "." + CHANCE + " should be at least 1!");
}
if (getThickFurModifier() < 1) {
reason.add(SKILLS + "." + TAMING + "." + THICK_FUR + "." + MODIFIER + " should be at least 1!");
}
if (getShockProofModifier() < 1) {
reason.add(SKILLS + "." + TAMING + "." + SHOCK_PROOF + "." + MODIFIER + " should be at least 1!");
}
if (getSharpenedClawsBonus() < 1) {
reason.add(SKILLS + "." + TAMING + "." + SHARPENED_CLAWS + "." + BONUS + " should be at least 1!");
}
if (getMaxHorseJumpStrength() < 0 || getMaxHorseJumpStrength() > 2) {
reason.add(SKILLS + "." + TAMING + "." + CALL_OF_THE_WILD + "." + MAX_HORSE_JUMP_STRENGTH + " should be between 0 and 2!");
}
/* UNARMED */
if (getMaximumProbability(SubSkillType.UNARMED_DISARM) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + DISARM + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.UNARMED_DISARM) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + DISARM + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + ARROW_DEFLECT + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.UNARMED_ARROW_DEFLECT) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + ARROW_DEFLECT + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
if (getMaximumProbability(SubSkillType.UNARMED_IRON_GRIP) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + IRON_GRIP + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.UNARMED_IRON_GRIP) < 1) {
reason.add(SKILLS + "." + UNARMED + "." + IRON_GRIP + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
/* WOODCUTTING */
/*if (getLeafBlowUnlockLevel() < 0) {
reason.add("Skills.Woodcutting.LeafBlower.UnlockLevel should be at least 0!");
}*/
if (getMaximumProbability(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
reason.add(SKILLS + "." + WOODCUTTING + "." + HARVEST_LUMBER + "." + CHANCE_MAX + " should be at least 1!");
}
if (getMaxBonusLevel(SubSkillType.WOODCUTTING_HARVEST_LUMBER) < 1) {
reason.add(SKILLS + "." + WOODCUTTING + "." + HARVEST_LUMBER + "." + MAX_BONUS_LEVEL + " should be at least 1!");
}
return reason;
}
/* GENERAL */
public int getStartingLevel() { return getIntValue(SKILLS, GENERAL, STARTING_LEVEL); }
/**
* This returns the maximum level at which superabilities will stop lengthening from scaling alongside skill level.
* It returns a different value depending on whether or not the server is in retro mode
* @return the level at which abilities stop increasing in length
*/
public int getAbilityLengthCap() {
if(!McmmoCore.isRetroModeEnabled())
return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, STANDARD, CAP_LEVEL);
else
return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, RETRO_MODE, CAP_LEVEL);
}
/**
* This returns the frequency at which abilities will increase in length
* It returns a different value depending on whether or not the server is in retro mode
* @return the number of levels required per ability length increase
*/
public int getAbilityLength() {
if(!McmmoCore.isRetroModeEnabled())
return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, STANDARD, INCREASE_LEVEL);
else
return getIntValue(SKILLS, GENERAL, ABILITY, LENGTH, RETRO_MODE, INCREASE_LEVEL);
}
public int getEnchantBuff() { return getIntValue(SKILLS, GENERAL, ABILITY, ENCHANT_BUFF); }
/**
* Grabs the max bonus level for a skill used in RNG calculations
* All max level values in the config are multiplied by 10 if the server is in retro mode as the values in the config are based around the new 1-100 skill system scaling
* A value of 10 in the file will be returned as 100 for retro mode servers to accommodate the change in scaling
* @param subSkillType target subskill
* @return the level at which this skills max benefits will be reached on the curve
*/
public int getMaxBonusLevel(SubSkillType subSkillType) {
String[] category = subSkillType.getAdvConfigAddress();
if(!McmmoCore.isRetroModeEnabled())
return getIntValue(category[0], category[1], category[2], MAX_BONUS_LEVEL, STANDARD);
else
return getIntValue(category[0], category[1], category[2], MAX_BONUS_LEVEL, RETRO_MODE);
}
public int getMaxBonusLevel(AbstractSubSkill abstractSubSkill) {
return getMaxBonusLevel(abstractSubSkill.getSubSkillType());
}
public double getMaximumProbability(SubSkillType subSkillType) {
String[] category = subSkillType.getAdvConfigAddress();
double maximumProbability = getDoubleValue(category[0], category[1], category[2], CHANCE_MAX);
return maximumProbability;
}
public double getMaximumProbability(AbstractSubSkill abstractSubSkill)
{
return getMaximumProbability(abstractSubSkill.getSubSkillType());
}
/* Notification Settings */
public boolean doesSkillCommandSendBlankLines()
{
return getBooleanValue(FEEDBACK, SKILL_COMMAND, BLANK_LINES_ABOVE_HEADER);
}
public boolean doesNotificationUseActionBar(NotificationType notificationType)
{
return getBooleanValue(FEEDBACK, ACTION_BAR_NOTIFICATIONS, notificationType.toString(), ENABLED);
}
public boolean doesNotificationSendCopyToChat(NotificationType notificationType)
{
return getBooleanValue(FEEDBACK, ACTION_BAR_NOTIFICATIONS, notificationType.toString(), SEND_COPY_OF_MESSAGE_TO_CHAT);
}
public boolean useTitlesForXPEvent()
{
return getBooleanValue(FEEDBACK, EVENTS, XP, SEND_TITLES);
}
private ChatColor getChatColorFromKey(String keyLocation) {
String colorName = getStringValue(keyLocation);
return getChatColor(colorName);
}
private ChatColor getChatColor(String configColor) {
for (ChatColor chatColor : ChatColor.values()) {
if (configColor.equalsIgnoreCase(chatColor.toString()))
return chatColor;
}
//Invalid Color
System.out.println("[mcMMO] " + configColor + " is an invalid color value");
return ChatColor.WHITE;
}
/* ACROBATICS */
public double getDodgeDamageModifier() { return getDoubleValue(SKILLS, ACROBATICS, DODGE, DAMAGE_MODIFIER); }
public double getRollDamageThreshold() { return getDoubleValue(SKILLS, ACROBATICS, ROLL, DAMAGE_THRESHOLD); }
public double getGracefulRollDamageThreshold() { return getDoubleValue(SKILLS, ACROBATICS, GRACEFUL_ROLL, DAMAGE_THRESHOLD); }
/* ALCHEMY */
public int getCatalysisMaxBonusLevel() { return getIntValue(SKILLS, ALCHEMY, CATALYSIS, MAX_BONUS_LEVEL); }
public double getCatalysisMinSpeed() { return getDoubleValue(SKILLS, ALCHEMY, CATALYSIS, MIN_SPEED); }
public double getCatalysisMaxSpeed() { return getDoubleValue(SKILLS, ALCHEMY, CATALYSIS, MAX_SPEED); }
/* ARCHERY */
public double getSkillShotRankDamageMultiplier() { return getDoubleValue(SKILLS, ARCHERY, SKILL_SHOT, RANK_DAMAGE_MULTIPLIER); }
public double getSkillShotDamageMax() { return getDoubleValue(SKILLS, ARCHERY, SKILL_SHOT, MAX_DAMAGE); }
public double getDazeBonusDamage() { return getDoubleValue(SKILLS, ARCHERY, DAZE, BONUS_DAMAGE); }
public double getForceMultiplier() { return getDoubleValue(SKILLS, ARCHERY, FORCE_MULTIPLIER); }
/* AXES */
public double getAxeMasteryRankDamageMultiplier() { return getDoubleValue(SKILLS, AXES, AXE_MASTERY, RANK_DAMAGE_MULTIPLIER); }
public double getCriticalStrikesPVPModifier() { return getDoubleValue(SKILLS, AXES, CRITICAL_STRIKES, PVP_MODIFIER); }
public double getCriticalStrikesPVEModifier() { return getDoubleValue(SKILLS, AXES, CRITICAL_STRIKES, PVE_MODIFIER); }
public double getGreaterImpactChance() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, CHANCE); }
public double getGreaterImpactModifier() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, KNOCKBACK_MODIFIER); }
public double getGreaterImpactBonusDamage() { return getDoubleValue(SKILLS, AXES, GREATER_IMPACT, BONUS_DAMAGE); }
public int getArmorImpactIncreaseLevel() {
int increaseLevel = getIntValue(SKILLS, AXES, ARMOR_IMPACT, INCREASE_LEVEL);
if(McmmoCore.isRetroModeEnabled())
return increaseLevel * 10;
return increaseLevel;
}
public double getImpactChance() { return getDoubleValue(SKILLS, AXES, ARMOR_IMPACT, CHANCE); }
public double getArmorImpactMaxDurabilityDamage() { return getDoubleValue(SKILLS, AXES, ARMOR_IMPACT, MAX_PERCENTAGE_DURABILITY_DAMAGE); }
public double getSkullSplitterModifier() { return getDoubleValue(SKILLS, AXES, SKULL_SPLITTER, DAMAGE_MODIFIER); }
/* EXCAVATION */
//Nothing to configure, everything is already configurable in config.yml
/* FISHING */
public double getShakeChance(int rank) { return getDoubleValue(SKILLS, FISHING, SHAKE, CHANCE, RANK, String.valueOf(rank)); }
public int getFishingVanillaXPModifier(int rank) { return getIntValue(SKILLS, FISHING, VANILLA_XPMULTIPLIER, RANK, String.valueOf(rank)); }
public double getMasterAnglerBoatModifier() {return getDoubleValue(SKILLS, FISHING, MASTER_ANGLER, BOAT_MODIFIER); }
public double getMasterAnglerBiomeModifier() {return getDoubleValue(SKILLS, FISHING, MASTER_ANGLER, BIOME_MODIFIER); }
/* HERBALISM */
//public int getFarmerDietRankChange() { return getIntValue(SKILLS, ".Herbalism.FarmersDiet.RankChange"); }
//public int getGreenThumbStageChange() { return getIntValue(SKILLS, ".Herbalism.GreenThumb.StageChange"); }
/* MINING */
public int getBlastMiningRankLevel(int rank) { return getIntValue(SKILLS, MINING, BLAST_MINING, RANK, LEVELS, RANK, String.valueOf(rank)); }
public double getBlastDamageDecrease(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, BLAST_DAMAGE_DECREASE, RANK, String.valueOf(rank)); }
public double getOreBonus(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, ORE_BONUS, RANK, String.valueOf(rank)); }
public double getDebrisReduction(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, DEBRIS_REDUCTION, RANK, String.valueOf(rank)); }
public int getDropMultiplier(int rank) { return getIntValue(SKILLS, MINING, BLAST_MINING, DROP_MULTIPLIER, RANK, String.valueOf(rank)); }
public double getBlastRadiusModifier(int rank) { return getDoubleValue(SKILLS, MINING, BLAST_MINING, BLAST_RADIUS, MODIFIER, RANK, String.valueOf(rank)); }
/* REPAIR */
public double getRepairMasteryMaxBonus() { return getDoubleValue(SKILLS, REPAIR, REPAIR_MASTERY, MAX_BONUS_PERCENTAGE); }
public int getRepairMasteryMaxLevel() { return getIntValue(SKILLS, REPAIR, REPAIR_MASTERY, MAX_BONUS_LEVEL); }
/* Arcane Forging */
public boolean getArcaneForgingEnchantLossEnabled() { return getBooleanValue(SKILLS, REPAIR, ARCANE_FORGING, MAY_LOSE_ENCHANTS); }
public double getArcaneForgingKeepEnchantsChance(int rank) { return getDoubleValue(SKILLS, REPAIR, ARCANE_FORGING, KEEP_ENCHANTS, CHANCE, RANK, String.valueOf(rank)); }
public boolean getArcaneForgingDowngradeEnabled() { return getBooleanValue(SKILLS, REPAIR, ARCANE_FORGING, DOWNGRADES_ENABLED); }
public double getArcaneForgingDowngradeChance(int rank) { return getDoubleValue(SKILLS, REPAIR, ARCANE_FORGING, DOWNGRADES, CHANCE, RANK, String.valueOf(rank)); }
/* SALVAGE */
public boolean getArcaneSalvageEnchantDowngradeEnabled() { return getBooleanValue(SKILLS, SALVAGE, ARCANE_SALVAGE, ENCHANT_DOWNGRADE_ENABLED); }
public boolean getArcaneSalvageEnchantLossEnabled() { return getBooleanValue(SKILLS, SALVAGE, ARCANE_SALVAGE, ENCHANT_LOSS_ENABLED); }
public double getArcaneSalvageExtractFullEnchantsChance(int rank) { return getDoubleValue(SKILLS, SALVAGE, ARCANE_SALVAGE, EXTRACT_FULL_ENCHANT, RANK, String.valueOf(rank)); }
public double getArcaneSalvageExtractPartialEnchantsChance(int rank) { return getDoubleValue(SKILLS, SALVAGE, ARCANE_SALVAGE, EXTRACT_PARTIAL_ENCHANT, RANK, String.valueOf(rank)); }
/* SMELTING */
public int getBurnModifierMaxLevel() { return getIntValue(SKILLS, SMELTING, FUEL_EFFICIENCY, MAX_BONUS_LEVEL); }
public double getBurnTimeMultiplier() { return getDoubleValue(SKILLS, SMELTING, FUEL_EFFICIENCY, MULTIPLIER); }
public double getFluxMiningChance() { return getDoubleValue(SKILLS, SMELTING, FLUX, MINING, CHANCE); }
public int getSmeltingRankLevel(int rank) { return getIntValue(SKILLS, SMELTING, RANK, LEVELS, RANK, String.valueOf(rank)); }
public int getSmeltingVanillaXPBoostMultiplier(int rank) { return getIntValue(SKILLS, SMELTING, VANILLA_XPMULTIPLIER, RANK, String.valueOf(rank)); }
/* SWORDS */
public double getRuptureDamagePlayer() { return getDoubleValue(SKILLS, SWORDS, RUPTURE, DAMAGE_PLAYER); }
public double getRuptureDamageMobs() { return getDoubleValue(SKILLS, SWORDS, RUPTURE, DAMAGE_MOBS); }
public int getRuptureMaxTicks() { return getIntValue(SKILLS, SWORDS, RUPTURE, MAX_TICKS); }
public int getRuptureBaseTicks() { return getIntValue(SKILLS, SWORDS, RUPTURE, BASE_TICKS); }
public double getCounterModifier() { return getDoubleValue(SKILLS, SWORDS, COUNTER_ATTACK, DAMAGE_MODIFIER); }
public double getSerratedStrikesModifier() { return getDoubleValue(SKILLS, SWORDS, SERRATED_STRIKES, DAMAGE_MODIFIER); }
public int getSerratedStrikesTicks() { return getIntValue(SKILLS, SWORDS, SERRATED_STRIKES, RUPTURE, TICKS); }
/* TAMING */
public double getGoreModifier() { return getDoubleValue(SKILLS, TAMING, GORE, MODIFIER); }
public double getFastFoodChance() { return getDoubleValue(SKILLS, TAMING, FAST_FOOD_SERVICE, CHANCE); }
public double getPummelChance() { return getDoubleValue(SKILLS, TAMING, PUMMEL, CHANCE); }
public double getThickFurModifier() { return getDoubleValue(SKILLS, TAMING, THICK_FUR, MODIFIER); }
public double getShockProofModifier() { return getDoubleValue(SKILLS, TAMING, SHOCK_PROOF, MODIFIER); }
public double getSharpenedClawsBonus() { return getDoubleValue(SKILLS, TAMING, SHARPENED_CLAWS, BONUS); }
public double getMinHorseJumpStrength() { return getDoubleValue(SKILLS, TAMING, CALL_OF_THE_WILD, MIN_HORSE_JUMP_STRENGTH); }
public double getMaxHorseJumpStrength() { return getDoubleValue(SKILLS, TAMING, CALL_OF_THE_WILD, MAX_HORSE_JUMP_STRENGTH); }
/* UNARMED */
public boolean getDisarmProtected() { return getBooleanValue(SKILLS, UNARMED, DISARM, ANTI_THEFT); }
/* WOODCUTTING */
}

View File

@@ -1,38 +0,0 @@
package com.gmail.nossr50.core.config;
/**
* This class is used to define settings for upgrading EXTREMELY OLD versions of mcMMO to newer versions
* It could probably be deleted
*/
public class ChunkConversionOptions {
private static final boolean chunkletsEnabled = true;
private static final int conversionRate = 1;
private static final boolean useEnchantmentBuffs = true;
private static final int uuidConvertAmount = 5;
private static final int mojangRateLimit = 50000;
private static final long mojangLimitPeriod = 600000;
public static boolean getChunkletsEnabled() {
return chunkletsEnabled;
}
public static int getConversionRate() {
return conversionRate;
}
public static boolean useEnchantmentBuffs() {
return useEnchantmentBuffs;
}
public static int getUUIDConvertAmount() {
return uuidConvertAmount;
}
public static int getMojangRateLimit() {
return mojangRateLimit;
}
public static long getMojangLimitPeriod() {
return mojangLimitPeriod;
}
}

View File

@@ -1,338 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.google.common.io.Files;
import ninja.leaping.configurate.ConfigurationNode;
import ninja.leaping.configurate.commented.CommentedConfigurationNode;
import ninja.leaping.configurate.loader.ConfigurationLoader;
import ninja.leaping.configurate.yaml.YAMLConfigurationLoader;
import org.yaml.snakeyaml.DumperOptions;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* Handles loading and cacheing configuration settings from a configurable compatible config file
*/
//@ConfigSerializable
public abstract class Config implements VersionedConfig, Unload {
/* SETTINGS */
private boolean mergeNewKeys;
/* PATH VARS */
public final File DIRECTORY_DATA_FOLDER; //Directory that the file is in
public final String FILE_RELATIVE_PATH; //Relative Path to the file
protected final String DIRECTORY_DEFAULTS = "defaults";
/* LOADERS */
private YAMLConfigurationLoader defaultCopyLoader;
private YAMLConfigurationLoader userCopyLoader;
/* CONFIG FILES */
private File resourceConfigCopy; //Copy of the default config from the JAR (file is copied so that admins can easily compare to defaults)
private File resourceUserCopy; //File in the /$MCMMO_ROOT/mcMMO/ directory that may contain user edited settings
/* ROOT NODES */
private ConfigurationNode userRootNode = null;
private ConfigurationNode defaultRootNode = null;
/* CONFIG MANAGER */
private ConfigurationLoader<CommentedConfigurationNode> configManager;
public Config(String pathToParentFolder, String relativePath, boolean mergeNewKeys) {
//TODO: Check if this works...
this(new File(pathToParentFolder), relativePath, mergeNewKeys);
System.out.println("mcMMO Debug: Don't forget to check if loading config file by string instead of File works...");
}
public Config(File pathToParentFolder, String relativePath, boolean mergeNewKeys) {
/*
* These must be at the top
*/
this.mergeNewKeys = mergeNewKeys; //Whether or not we add new keys when they are found
mkdirDefaults(); // Make our default config dir
DIRECTORY_DATA_FOLDER = pathToParentFolder; //Data Folder for our plugin
FILE_RELATIVE_PATH = relativePath; //Relative path to config from a parent folder
//Attempt IO Operations
try {
//Makes sure we have valid Files corresponding to this config
initConfigFiles();
//Init MainConfig Loaders
initConfigLoaders();
//Load MainConfig Nodes
loadConfig();
//Attempt to update user file, and then load it into memory
readConfig();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Initializes the default copy File and the user config File
* @throws IOException
*/
private void initConfigFiles() throws IOException {
//Init our config copy
resourceConfigCopy = initDefaultConfig();
//Init the user file
resourceUserCopy = initUserConfig();
}
/**
* Loads the root node for the default config File and user config File
*/
private void loadConfig()
{
try {
final ConfigurationNode defaultConfig = this.defaultCopyLoader.load();
defaultRootNode = defaultConfig;
final ConfigurationNode userConfig = this.userCopyLoader.load();
userRootNode = userConfig;
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Initializes the YAMLConfigurationLoaders for this config
*/
private void initConfigLoaders()
{
this.defaultCopyLoader = YAMLConfigurationLoader.builder().setPath(resourceConfigCopy.toPath()).setFlowStyle(DumperOptions.FlowStyle.BLOCK).build();
this.userCopyLoader = YAMLConfigurationLoader.builder().setPath(resourceUserCopy.toPath()).setFlowStyle(DumperOptions.FlowStyle.FLOW).build();
}
/**
* Copies a new file from the JAR to the defaults directory and uses that new file to initialize our resourceConfigCopy
* @see Config#resourceConfigCopy
* @throws IOException
*/
private File initDefaultConfig() throws IOException {
return copyDefaultFromJar(getDefaultConfigCopyRelativePath(), true);
}
/**
* Attemps to load the config file if it exists, if it doesn't it copies a new one from within the JAR
* @return user config File
* @see Config#resourceUserCopy
* @throws IOException
*/
private File initUserConfig() throws IOException {
File userCopy = new File(DIRECTORY_DATA_FOLDER, FILE_RELATIVE_PATH); //Load the user file;
if(userCopy.exists())
{
// Yay
return userCopy;
}
else
{
//If it's gone we copy default files
//Note that we don't copy the values from the default copy put in /defaults/ that file exists only as a reference to admins and is unreliable
return copyDefaultFromJar(FILE_RELATIVE_PATH, false);
}
}
/**
* Used to make a new config file at a specified relative output path inside the data directory by copying the matching file found in that same relative path within the JAR
* @param relativeOutputPath the path to the output file
* @param deleteOld whether or not to delete the existing output file on disk
* @return a copy of the default config within the JAR
* @throws IOException
*/
private File copyDefaultFromJar(String relativeOutputPath, boolean deleteOld) throws IOException
{
/*
* Gen a Default config from inside the JAR
*/
McmmoCore.getLogger().info("Preparing to copy internal resource file (in JAR) - "+FILE_RELATIVE_PATH);
InputStream inputStream = McmmoCore.getResource(FILE_RELATIVE_PATH);
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
//This is a copy of the default file, which we will overwrite every time mcMMO loads
File targetFile = new File(DIRECTORY_DATA_FOLDER, relativeOutputPath);
//Wipe old default file on disk
if (targetFile.exists() && deleteOld)
{
McmmoCore.getLogger().info("Updating file " + relativeOutputPath);
targetFile.delete(); //Necessary?
}
if(!targetFile.exists())
{
targetFile.getParentFile().mkdirs();
targetFile.createNewFile(); //New File Boys
}
Files.write(buffer, targetFile);
McmmoCore.getLogger().info("Created config file - " + relativeOutputPath);
inputStream.close(); //Close the input stream
return targetFile;
}
/**
* The path to the defaults directory
* @return the path to the defaults directory
*/
private String getDefaultConfigCopyRelativePath() {
return DIRECTORY_DEFAULTS + File.separator + FILE_RELATIVE_PATH;
}
/**
* Creates the defaults directory
*/
private void mkdirDefaults() {
//Make Default Subdirectory
File defaultsDir = new File (DIRECTORY_DATA_FOLDER, "defaults");
if(!defaultsDir.exists())
defaultsDir.mkdir();
}
/**
* Configs are versioned based on when they had significant changes to keys
* @return current MainConfig Version String
*/
public String getVersion()
{
return String.valueOf(getConfigVersion());
}
/**
* Attempts to read the loaded config file
* MainConfig will have any necessary updates applied
* MainConfig will be compared to the default config to see if it is missing any nodes
* MainConfig will have any missing nodes inserted with their default value
*/
public void readConfig() {
McmmoCore.getLogger().info("Attempting to read " + FILE_RELATIVE_PATH + ".");
int version = this.userRootNode.getNode("ConfigVersion").getInt();
McmmoCore.getLogger().info(FILE_RELATIVE_PATH + " version is " + version);
//Update our config
updateConfig();
}
/**
* Compares the users config file to the default and adds any missing nodes and applies any necessary updates
*/
private void updateConfig()
{
McmmoCore.getLogger().info(defaultRootNode.getChildrenMap().size() +" items in default children map");
McmmoCore.getLogger().info(userRootNode.getChildrenMap().size() +" items in default root map");
// Merge Values from default
if(mergeNewKeys)
userRootNode = userRootNode.mergeValuesFrom(defaultRootNode);
removeOldKeys();
// Update config version
updateConfigVersion();
//Attempt to save
try {
saveUserCopy();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* Saves the current state information of the config to the users copy (which they may edit)
* @throws IOException
*/
private void saveUserCopy() throws IOException
{
McmmoCore.getLogger().info("Saving new node");
userCopyLoader.save(userRootNode);
}
/**
* Performs any necessary operations to update this config
*/
private void updateConfigVersion() {
// Set a version for our config
this.userRootNode.getNode("ConfigVersion").setValue(getConfigVersion());
McmmoCore.getLogger().info("Updated config to ["+getConfigVersion()+"] - " + FILE_RELATIVE_PATH);
}
/**
* Returns the root node of this config
* @return the root node of this config
*/
protected ConfigurationNode getUserRootNode() {
return userRootNode;
}
/**
* Grabs an int from the specified node
* @param path
* @return the int from the node, null references will zero initialize
*/
public int getIntValue(String... path)
{
return userRootNode.getNode(path).getInt();
}
/**
* Grabs a double from the specified node
* @param path
* @return the double from the node, null references will zero initialize
*/
public double getDoubleValue(String... path)
{
return userRootNode.getNode(path).getDouble();
}
/**
* Grabs a boolean from the specified node
* @param path
* @return the boolean from the node, null references will zero initialize
*/
public boolean getBooleanValue(String... path)
{
return userRootNode.getNode(path).getBoolean();
}
/**
* Grabs a string from the specified node
* @param path
* @return the string from the node, null references will zero initialize
*/
public String getStringValue(String... path)
{
return userRootNode.getNode(path).getString();
}
/**
* Checks to see if a node exists in the user's config file
* @param path path to the node
* @return true if the node exists
*/
public boolean hasNode(String... path) {
return (userRootNode.getNode(path) != null);
}
}

View File

@@ -1,7 +0,0 @@
package com.gmail.nossr50.core.config;
import java.util.Collection;
public interface ConfigCollection<T> {
Collection<T> getLoadedCollection();
}

View File

@@ -1,19 +0,0 @@
package com.gmail.nossr50.core.config;
import java.io.File;
/**
* Represents a config file that registers keys after its initialized
*/
public abstract class ConfigCollections extends Config implements RegistersKeys, ConfigCollection {
public ConfigCollections(String pathToParentFolder, String relativePath, boolean mergeNewKeys) {
super(pathToParentFolder, relativePath, mergeNewKeys);
loadKeys();
}
public ConfigCollections(File pathToParentFolder, String relativePath, boolean mergeNewKeys) {
super(pathToParentFolder, relativePath, mergeNewKeys);
loadKeys();
}
}

View File

@@ -1,44 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import java.io.File;
import java.util.List;
/**
* This class is used for config files that validate their entries
*/
public abstract class ConfigValidated extends Config implements DefaultKeys {
public ConfigValidated(String parentFolderPath, String relativePath, boolean mergeNewKeys)
{
super(parentFolderPath, relativePath, mergeNewKeys);
validateEntries();
}
public ConfigValidated(File parentFolderFile, String relativePath, boolean mergeNewKeys)
{
super(parentFolderFile, relativePath, mergeNewKeys);
validateEntries();
}
/**
* Prints all errors found when validating the config
*/
private void validateEntries()
{
/*
* Print Errors about Keys
*/
List<String> validKeyErrors = validateKeys(); // Validate Keys
if(validKeyErrors != null && validKeyErrors.size() > 0)
{
for(String error : validKeyErrors)
{
McmmoCore.getLogger().severe(error);
}
}
}
}

View File

@@ -1,61 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.core.util.StringUtils;
public class CoreSkillsConfig extends Config {
private static CoreSkillsConfig instance;
public CoreSkillsConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"coreskills.yml", true);
}
public static CoreSkillsConfig getInstance() {
if (instance == null)
return new CoreSkillsConfig();
return instance;
}
/**
* The version of this config
*
* @return
*/
@Override
public double getConfigVersion() {
return 1;
}
@Override
public void unload() {
instance = null;
}
/*
* Skill Settings
*/
/**
* Whether or not a skill is enabled
* Defaults true
*
* @param abstractSubSkill SubSkill definition to check
* @return true if subskill is enabled
*/
public boolean isSkillEnabled(AbstractSubSkill abstractSubSkill) {
return getBooleanValue(StringUtils.getCapitalized(abstractSubSkill.getPrimarySkill().toString()) + "." + abstractSubSkill.getConfigKeyName() + ".Enabled", true);
}
/**
* Whether or not this primary skill is enabled
*
* @param primarySkillType target primary skill
* @return true if enabled
*/
public boolean isPrimarySkillEnabled(PrimarySkillType primarySkillType) {
return getBooleanValue(StringUtils.getCapitalized(primarySkillType.toString()) + ".Enabled", true);
}
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.config;
import java.util.List;
/**
* This is for config validation
*/
public interface DefaultKeys {
List<String> validateKeys();
}

View File

@@ -1,11 +0,0 @@
package com.gmail.nossr50.core.config;
/**
* A class that registers keys
*/
public interface RegistersKeys {
/**
* Loads up keys
*/
void loadKeys();
}

View File

@@ -1,77 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.util.sounds.SoundType;
import java.util.ArrayList;
import java.util.List;
public class SoundConfig extends ConfigValidated {
private static SoundConfig instance;
public SoundConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "sounds.yml", true);
this.instance = this;
}
public static SoundConfig getInstance() {
if (instance == null)
return new SoundConfig();
return instance;
}
@Override
public void unload() {
instance = null;
}
/**
* The version of this config
*
* @return
*/
@Override
public double getConfigVersion() {
return 1;
}
@Override
public List<String> validateKeys() {
ArrayList<String> reasons = new ArrayList<>();
for (SoundType soundType : SoundType.values()) {
if (getDoubleValue("Sounds." + soundType.toString() + ".Volume") < 0) {
reasons.add("[mcMMO] Sound volume cannot be below 0 for " + soundType.toString());
}
//Sounds with custom pitching don't use pitch values
if (!soundType.usesCustomPitch()) {
if (getDoubleValue("Sounds." + soundType.toString() + ".Pitch") < 0) {
reasons.add("[mcMMO] Sound pitch cannot be below 0 for " + soundType.toString());
}
}
}
return reasons;
}
public float getMasterVolume() {
return (float) getDoubleValue("Sounds.MasterVolume", 1.0);
}
public float getVolume(SoundType soundType) {
String key = "Sounds." + soundType.toString() + ".Volume";
return (float) getDoubleValue(key);
}
public float getPitch(SoundType soundType) {
String key = "Sounds." + soundType.toString() + ".Pitch";
return (float) getDoubleValue(key);
}
public boolean getIsEnabled(SoundType soundType) {
String key = "Sounds." + soundType.toString() + ".Enabled";
return getBooleanValue(key, true);
}
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.config;
/**
* Unloads values, sort of like a constructor
*/
public interface Unload {
void unload();
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.config;
/**
* Represents a config that is version checked
*/
public interface VersionedConfig {
/**
* The version of this config
* @return
*/
double getConfigVersion();
}

View File

@@ -1,107 +0,0 @@
package com.gmail.nossr50.core.config.collectionconfigs;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.ConfigCollection;
import com.gmail.nossr50.core.config.ConfigCollections;
import com.gmail.nossr50.core.skills.child.salvage.salvageables.Salvageable;
import com.gmail.nossr50.core.skills.primary.repair.repairables.Repairable;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
/**
* Represents a collection of config files that serve a similar purpose
* For example, files named repair.*.yml are all loaded into memory, this lets admins keep their config files clean
*
* To be honest I'm not sure how many people make use of this system, but I'm keeping it since its been in mcMMO for like 6+ years
*/
public final class MultiConfigManager {
public static final String DEFAULT_MULTICONFIG_FILENAME_SUFFIX = ".vanilla.yml";
//Configs
public RepairConfig vanillaRepairConfig; //This is the main config file that mcMMO will copy out
public SalvageConfig vanillaSalvageConfig;
private static List<Repairable> repairables;
private static List<Salvageable> salvageables;
public MultiConfigManager(String fileNamePrefix)
{
//init Collections
repairables = new ArrayList<>();
salvageables = new ArrayList<>();
//init vanilla configs
vanillaRepairConfig = new RepairConfig(getVanillaConfigName("repair"));
vanillaSalvageConfig = new SalvageConfig(getVanillaConfigName("salvage"));
//add valid vanilla collections to main collection
repairables.addAll(vanillaRepairConfig.getLoadedCollection());
salvageables.addAll(vanillaSalvageConfig.getLoadedCollection());
//add valid custom collections to main collection
loadCustomCollections("repair", repairables, RepairConfig.class);
loadCustomCollections("salvage", salvageables, SalvageConfig.class);
}
/**
* mcMMO allows collection config files to be named things like repair.whatevernameyouwanthere.yml and so on,
* these files are treated in the same way as the vanilla file. They serve the purpose of organization
* @param configPrefix the prefix of the file name, for example "repair", "salvage", etc
* @param collection the collection that will be added to
*/
public void loadCustomCollections(String configPrefix, Collection<?> collection, Class<? extends ConfigCollection> configClass)
{
String vanillaConfigFileName = getVanillaConfigName(configPrefix);
//Find other files
Pattern pattern = Pattern.compile(configPrefix+"\\.(?:.+)\\.yml");
File dataFolder = McmmoCore.getDataFolderPath();
for (String fileName : dataFolder.list()) {
//Vanilla Config is already loaded
if(fileName.equalsIgnoreCase(vanillaConfigFileName))
continue;
//Find files that match the pattern
if (!pattern.matcher(fileName).matches()) {
continue;
}
//Init file
File currentFile = new File(dataFolder, fileName);
//Make sure its not a directory (needed?)
if(currentFile.isDirectory())
continue;
try {
ConfigCollections customConfig = configClass.getClass().getConstructor(fileName).newInstance();
collection.addAll(customConfig.getLoadedCollection());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
private String getVanillaConfigName(String configPrefix)
{
return configPrefix+DEFAULT_MULTICONFIG_FILENAME_SUFFIX;
}
}

View File

@@ -1,186 +0,0 @@
package com.gmail.nossr50.core.config.collectionconfigs;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.ConfigCollections;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
import com.gmail.nossr50.core.skills.ConfigItemCategory;
import com.gmail.nossr50.core.skills.MaterialType;
import com.gmail.nossr50.core.skills.primary.repair.repairables.Repairable;
import com.gmail.nossr50.core.skills.primary.repair.repairables.RepairableFactory;
import com.gmail.nossr50.core.util.InvalidItemException;
import com.gmail.nossr50.core.util.ItemUtils;
import com.gmail.nossr50.core.util.skills.SkillUtils;
import ninja.leaping.configurate.ConfigurationNode;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* This config
*/
public class RepairConfig extends ConfigCollections {
private List<Repairable> repairables;
public RepairConfig(String fileName) {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(), fileName, false);
}
@Override
public void unload() {
repairables = null;
}
@Override
public Collection getLoadedCollection() {
return repairables == null ? new ArrayList<Repairable>() : repairables;
}
/**
* The version of this config
*
* @return
*/
@Override
public double getConfigVersion() {
return 1;
}
@Override
public void loadKeys() {
repairables = new ArrayList<Repairable>();
ConfigurationNode repairablesNode = getUserRootNode().getNode("Repairables");
List<? extends ConfigurationNode> repairablesNodeChildrenList = repairablesNode.getChildrenList();
Iterator<? extends ConfigurationNode> configIter = repairablesNodeChildrenList.iterator();
for(Iterator<? extends ConfigurationNode> i = repairablesNodeChildrenList.iterator(); i.hasNext();)
{
ConfigurationNode iterNode = i.next();
//TODO: Verify that this is getting the key
String key = iterNode.getKey().toString(); //Get the String of the node
// Validate all the things!
List<String> reason = new ArrayList<String>();
try {
// ItemStack Material
ConfigItemCategory configItemCategory = ItemUtils.matchItemType(key);
} catch (InvalidItemException e) {
e.printStackTrace();
}
if (itemType == null) {
reason.add("Invalid material: " + key);
}
// Repair Material Type
MaterialType repairMaterialType = MaterialType.OTHER;
String repairMaterialTypeString = getStringValue("Repairables." + key + ".MaterialType", "OTHER");
if (!config.contains("Repairables." + key + ".MaterialType") && itemType != null) {
ItemStack repairItem = ItemStack.makeNew(itemType);
if (ItemUtils.isWoodTool(repairItem)) {
repairMaterialType = MaterialType.WOOD;
} else if (ItemUtils.isStoneTool(repairItem)) {
repairMaterialType = MaterialType.STONE;
} else if (ItemUtils.isStringTool(repairItem)) {
repairMaterialType = MaterialType.STRING;
} else if (ItemUtils.isLeatherArmor(repairItem)) {
repairMaterialType = MaterialType.LEATHER;
} else if (ItemUtils.isIronArmor(repairItem) || ItemUtils.isIronTool(repairItem)) {
repairMaterialType = MaterialType.IRON;
} else if (ItemUtils.isGoldArmor(repairItem) || ItemUtils.isGoldTool(repairItem)) {
repairMaterialType = MaterialType.GOLD;
} else if (ItemUtils.isDiamondArmor(repairItem) || ItemUtils.isDiamondTool(repairItem)) {
repairMaterialType = MaterialType.DIAMOND;
}
} else {
try {
repairMaterialType = MaterialType.valueOf(repairMaterialTypeString);
} catch (IllegalArgumentException ex) {
reason.add(key + " has an invalid MaterialType of " + repairMaterialTypeString);
}
}
// Repair Material
String repairMaterialName = getStringValue("Repairables." + key + ".RepairMaterial");
Material repairMaterial = (repairMaterialName == null ? repairMaterialType.getDefaultMaterial() : Material.matchMaterial(repairMaterialName));
if (repairMaterial == null) {
reason.add(key + " has an invalid repair material: " + repairMaterialName);
}
// Maximum Durability
short maximumDurability = (itemType != null ? itemType.getMaxDurability() : (short) getIntValue("Repairables." + key + ".MaximumDurability"));
if (maximumDurability <= 0) {
maximumDurability = (short) getIntValue("Repairables." + key + ".MaximumDurability");
}
if (maximumDurability <= 0) {
reason.add("Maximum durability of " + key + " must be greater than 0!");
}
// ItemStack Type
ConfigItemCategory repairConfigItemCategory = ConfigItemCategory.OTHER;
String repairItemTypeString = getStringValue("Repairables." + key + ".ItemType", "OTHER");
if (!config.contains("Repairables." + key + ".ItemType") && itemType != null) {
ItemStack repairItem = new ItemStack(itemType);
if (ItemUtils.isMinecraftTool(repairItem)) {
repairConfigItemCategory = ConfigItemCategory.TOOL;
} else if (ItemUtils.isArmor(repairItem)) {
repairConfigItemCategory = ConfigItemCategory.ARMOR;
}
} else {
try {
repairConfigItemCategory = ConfigItemCategory.valueOf(repairItemTypeString);
} catch (IllegalArgumentException ex) {
reason.add(key + " has an invalid ItemType of " + repairItemTypeString);
}
}
byte repairMetadata = (byte) getIntValue("Repairables." + key + ".RepairMaterialMetadata", -1);
int minimumLevel = getIntValue("Repairables." + key + ".MinimumLevel");
double xpMultiplier = getDoubleValue("Repairables." + key + ".XpMultiplier", 1);
if (minimumLevel < 0) {
reason.add(key + " has an invalid MinimumLevel of " + minimumLevel);
}
// Minimum Quantity
int minimumQuantity = (itemType != null ? SkillUtils.getRepairAndSalvageQuantities(new ItemStack(itemType), repairMaterial, repairMetadata) : getIntValue("Repairables." + key + ".MinimumQuantity", 2));
if (minimumQuantity <= 0 && itemType != null) {
minimumQuantity = getIntValue("Repairables." + key + ".MinimumQuantity", 2);
}
if (minimumQuantity <= 0) {
reason.add("Minimum quantity of " + key + " must be greater than 0!");
}
if (noErrorsInRepairable(reason)) {
Repairable repairable = RepairableFactory.getRepairable(itemType, repairMaterial, repairMetadata, minimumLevel, minimumQuantity, maximumDurability, repairConfigItemCategory, repairMaterialType, xpMultiplier);
repairables.add(repairable);
}
}
}
/**
* Check if there are any errors for this repairable and if there are reports them to console
* @param issues errors related to loading a repairable
* @return returns true if there are no errors for this repairable
*/
private boolean noErrorsInRepairable(List<String> issues) {
for (String issue : issues) {
McmmoCore.getLogger().warning(issue);
}
return issues.isEmpty();
}
}

View File

@@ -1,448 +0,0 @@
package com.gmail.nossr50.core.config.experience;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.ConfigValidated;
import com.gmail.nossr50.core.datatypes.experience.FormulaType;
import com.gmail.nossr50.core.mcmmo.BlockType;
import com.gmail.nossr50.core.mcmmo.bossbars.BarColor;
import com.gmail.nossr50.core.mcmmo.bossbars.BarStyle;
import com.gmail.nossr50.core.mcmmo.entity.EntityType;
import com.gmail.nossr50.core.skills.MaterialType;
import com.gmail.nossr50.core.skills.PotionStage;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class ExperienceConfig extends ConfigValidated {
public static final String EXPLOIT_FIX = "ExploitFix";
public static final String ENDERMAN_ENDERMITE_FARMS = "EndermanEndermiteFarms";
public static final String EXPERIENCE = "Experience";
public static final String EXPERIENCE_FORMULA = EXPERIENCE + "_Formula";
public static final String CURVE = "Curve";
public static final String VALUES = "_Values";
public static final String MULTIPLIER = "multiplier";
public static final String BASE = "base";
public static final String EXPONENT = "exponent";
public static final String MULTIPLIER1 = "Multiplier";
public static final String GLOBAL = "Global";
public static final String MOBSPAWNERS = "Mobspawners";
public static final String BREEDING = "Breeding";
public static final String MODIFIER = "Modifier";
public static final String CUSTOM_XP_PERK = "Custom_XP_Perk";
public static final String BOOST = "Boost";
public static final String DIMISHED_RETURNS = "Dimished_Returns";
public static final String GUARANTEED_MINIMUM_PERCENTAGE = "Guaranteed_Minimum_Percentage";
public static final String DIMINISHED_RETURNS = "Diminished_Returns";
public static final String ENABLE = "Enable";
public static final String ENABLED = ENABLE + "d";
public static final String TIME_INTERVAL = "Time_Interval";
public static final String CONVERSION = "Conversion";
public static final String EXP = "Exp_";
public static final String PVP = "PVP";
public static final String REWARDS = "Rewards";
public static final String COMBAT = "Combat";
public static final String ANIMALS = "Animals";
public static final String BARS = "_Bars";
public static final String UPDATE = "Update";
public static final String PASSIVE = "Passive";
public static final String THIS_MAY_CAUSE_LAG = "ThisMayCauseLag";
public static final String ALWAYS = "Always";
public static final String TITLES_WHEN_XPIS_GAINED = "TitlesWhenXPIsGained";
public static final String EXTRA_DETAILS = "ExtraDetails";
public static final String COLOR = "Color";
public static final String BAR_STYLE = "BarStyle";
public static final String ACROBATICS = "Acrobatics";
public static final String DODGE = "Dodge";
public static final String ROLL = "Roll";
public static final String FALL = "Fall";
public static final String FEATHER = "Feather";
public static final String ALCHEMY = "Alchemy";
public static final String POTION_STAGE = "Potion_Stage_";
public static final String ARCHERY = "Archery";
public static final String DISTANCE = "Distance_";
public static final String FISHING = "Fishing";
public static final String SHAKE = "Shake";
public static final String REPAIR = "Repair";
public static final String BASE1 = "Base";
public static final String TAMING = "Taming";
public static final String ANIMAL_TAMING = "Animal_Taming";
public static final String PARTY = "Party";
public static final String THRESHOLD = "Threshold";
public static final String CUMULATIVE = "Cumulative_";
public static final String OCELOT = "Ocelot";
public static final String WOLF = "Wolf";
public static final String FEATHER_FALL_MULTIPLIER = "FeatherFall_Multiplier";
private static ExperienceConfig instance;
//TODO: Should merge be false? Seems okay to leave it as true..
private ExperienceConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(), "experience.yml", true);
}
public static ExperienceConfig getInstance() {
if (instance == null) {
instance = new ExperienceConfig();
}
return instance;
}
/**
* The version of this config
*
* @return
*/
@Override
public double getConfigVersion() {
return 1;
}
@Override
public void unload() {
instance = null; //TODO: this might be a bit problematic
}
@Override
public List<String> validateKeys() {
List<String> reason = new ArrayList<String>();
/*
* FORMULA SETTINGS
*/
/* Curve values */
if (getMultiplier(FormulaType.EXPONENTIAL) <= 0) {
reason.add(EXPERIENCE_FORMULA + ".Exponential" + VALUES + "." + MULTIPLIER + " should be greater than 0!");
}
if (getMultiplier(FormulaType.LINEAR) <= 0) {
reason.add(EXPERIENCE_FORMULA + ".Linear" + VALUES + "." + MULTIPLIER + " should be greater than 0!");
}
if (getExponent(FormulaType.EXPONENTIAL) <= 0) {
reason.add(EXPERIENCE_FORMULA + ".Exponential" + VALUES + "." + EXPONENT + " should be greater than 0!");
}
/* Global modifier */
if (getExperienceGainsGlobalMultiplier() <= 0) {
reason.add(EXPERIENCE_FORMULA + "." + MULTIPLIER1 + "." + GLOBAL + " should be greater than 0!");
}
/* PVP modifier */
if (getPlayerVersusPlayerXP() < 0) {
reason.add(EXPERIENCE_FORMULA + "." + MULTIPLIER1 + "." + PVP + " should be at least 0!");
}
/* Spawned Mob modifier */
if (getSpawnedMobXpMultiplier() < 0) {
reason.add(EXPERIENCE_FORMULA + "." + MOBSPAWNERS + "." + MULTIPLIER1 + " should be at least 0!");
}
/* Bred Mob modifier */
if (getBredMobXpMultiplier() < 0) {
reason.add(EXPERIENCE_FORMULA + "." + BREEDING + "." + MULTIPLIER1 + " should be at least 0!");
}
/* Conversion */
if (getExpModifier() <= 0) {
reason.add(CONVERSION + "." + EXP + MODIFIER + " should be greater than 0!");
}
/*
* XP SETTINGS
*/
/* Alchemy */
for (PotionStage potionStage : PotionStage.values()) {
if (getPotionXP(potionStage) < 0) {
reason.add(EXPERIENCE + "." + ALCHEMY + "." + POTION_STAGE + potionStage.toNumerical() + " should be at least 0!");
}
}
/* Archery */
if (getArcheryDistanceMultiplier() < 0) {
reason.add(EXPERIENCE + "." + ARCHERY + "." + DISTANCE + MULTIPLIER1 + " should be at least 0!");
}
/* Combat XP Multipliers */
if (getAnimalsXP() < 0) {
reason.add(EXPERIENCE + "." + COMBAT + "." + MULTIPLIER1 + "." + ANIMALS + " should be at least 0!");
}
if (getDodgeXPModifier() < 0) {
reason.add("Skills." + ACROBATICS + "." + DODGE + "_XP_" + MODIFIER + " should be at least 0!");
}
if (getRollXPModifier() < 0) {
reason.add("Skills." + ACROBATICS + "." + ROLL + "_XP_" + MODIFIER + " should be at least 0!");
}
if (getFallXPModifier() < 0) {
reason.add("Skills." + ACROBATICS + "." + FALL + "_XP_" + MODIFIER + " should be at least 0!");
}
/* Fishing */
// TODO: Add validation for each fish type once enum is available.
if (getFishingShakeXP() <= 0) {
reason.add(EXPERIENCE + "." + FISHING + "." + SHAKE + " should be greater than 0!");
}
/* Repair */
if (getRepairXPBase() <= 0) {
reason.add(EXPERIENCE + "." + REPAIR + "." + BASE1 + " should be greater than 0!");
}
/* Taming */
if (getTamingXP(EntityType.WOLF) <= 0) {
reason.add(EXPERIENCE + "." + TAMING + "." + ANIMAL_TAMING + "." + WOLF + " should be greater than 0!");
}
if (getTamingXP(EntityType.OCELOT) <= 0) {
reason.add(EXPERIENCE + "." + TAMING + "." + ANIMAL_TAMING + "." + OCELOT + " should be greater than 0!");
}
return reason;
}
/*
* FORMULA SETTINGS
*/
/* EXPLOIT TOGGLES */
public boolean isEndermanEndermiteFarmingPrevented() {
return getBooleanValue(EXPLOIT_FIX, ENDERMAN_ENDERMITE_FARMS);
}
/* Curve settings */
public FormulaType getFormulaType() {
return FormulaType.getFormulaType(getStringValue(EXPERIENCE_FORMULA, CURVE));
}
public boolean getCumulativeCurveEnabled() {
return getBooleanValue(EXPERIENCE_FORMULA, CUMULATIVE + CURVE);
}
/* Curve values */
public double getMultiplier(FormulaType type) {
return getDoubleValue(EXPERIENCE_FORMULA, StringUtils.getCapitalized(type.toString()) + VALUES, MULTIPLIER);
}
public int getBase(FormulaType type) {
return getIntValue(EXPERIENCE_FORMULA, StringUtils.getCapitalized(type.toString()) + VALUES, BASE);
}
public double getExponent(FormulaType type) {
return getDoubleValue(EXPERIENCE_FORMULA, StringUtils.getCapitalized(type.toString()) + VALUES, EXPONENT);
}
/* Global modifier */
public double getExperienceGainsGlobalMultiplier() {
return getDoubleValue(EXPERIENCE_FORMULA, MULTIPLIER1, GLOBAL);
}
//TODO: Rewrite this
/*public void setExperienceGainsGlobalMultiplier(double value) {
config.set(EXPERIENCE_FORMULA, MULTIPLIER1, GLOBAL, value);
}*/
/* PVP modifier */
public double getPlayerVersusPlayerXP() {
return getDoubleValue(EXPERIENCE_FORMULA, MULTIPLIER1, PVP);
}
/* Spawned Mob modifier */
public double getSpawnedMobXpMultiplier() {
return getDoubleValue(EXPERIENCE_FORMULA, MOBSPAWNERS, MULTIPLIER1);
}
public double getBredMobXpMultiplier() {
return getDoubleValue(EXPERIENCE_FORMULA, BREEDING, MULTIPLIER1);
}
/* Skill modifiers */
public double getFormulaSkillModifier(PrimarySkillType skill) {
return getDoubleValue(EXPERIENCE_FORMULA, MODIFIER, StringUtils.getCapitalized(skill.toString()));
}
/* Custom XP perk */
public double getCustomXpPerkBoost() {
return getDoubleValue(EXPERIENCE_FORMULA, CUSTOM_XP_PERK, BOOST);
}
/* Diminished Returns */
public float getDiminishedReturnsCap() {
return (float) getDoubleValue(DIMISHED_RETURNS, GUARANTEED_MINIMUM_PERCENTAGE);
}
public boolean getDiminishedReturnsEnabled() {
return getBooleanValue(DIMINISHED_RETURNS, ENABLED);
}
public int getDiminishedReturnsThreshold(PrimarySkillType skill) {
return getIntValue(DIMINISHED_RETURNS, THRESHOLD, StringUtils.getCapitalized(skill.toString()));
}
public int getDiminishedReturnsTimeInterval() {
return getIntValue(DIMINISHED_RETURNS, TIME_INTERVAL);
}
/* Conversion */
public double getExpModifier() {
return getDoubleValue(CONVERSION, EXP + MODIFIER);
}
/*
* XP SETTINGS
*/
/* General Settings */
public boolean getExperienceGainsPlayerVersusPlayerEnabled() {
return getBooleanValue(EXPERIENCE, PVP, REWARDS);
}
/* Combat XP Multipliers */
public double getCombatXP(EntityType entity) {
return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
}
public double getAnimalsXP(EntityType entity) {
return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
}
public double getAnimalsXP() {
return getDoubleValue(EXPERIENCE, COMBAT, MULTIPLIER1, ANIMALS);
}
public boolean hasCombatXP(EntityType entity) {
return hasNode(EXPERIENCE, COMBAT, MULTIPLIER1, entity.getConfigName());
}
/* Materials */
/**
* Gets the raw XP given for breaking this block, this does not include modifiers
* @param skill The skill to give XP for
* @param blockType the type of block
* @return the raw amount of XP for this block before modifiers
*/
public int getXp(PrimarySkillType skill, BlockType blockType) {
//TODO: This is going to need to be changed, this code here is only placeholder
String[] path = new String[]{ EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.getConfigName() };
return getIntValue(path);
}
/**
* Checks if a block gives XP
* This is used to determine whether or not mcMMO should track a block that is placed by a user, among other things.
* Note: If the block has an entry in the config that will return true even if the XP is 0, this does not check the value of the XP
* @param skill The skill to check for
* @param blockType the type of block
* @return true if the block does give XP
*/
public boolean doesBlockGiveSkillXP(PrimarySkillType skill, BlockType blockType) {
//TODO: This used to support wildcard characters, seems a bit unnecessary to do so.
//TODO: This is going to need to be changed, this code here is only placeholder
String[] path = new String[] {EXPERIENCE, StringUtils.getCapitalized(skill.toString()), blockType.getConfigName()};
return hasNode(path);
}
/*
* Experience Bar Stuff
*/
public boolean isPartyExperienceBarsEnabled() {
return getBooleanValue(EXPERIENCE + BARS, UPDATE, PARTY);
}
public boolean isPassiveGainsExperienceBarsEnabled() {
return getBooleanValue(EXPERIENCE + BARS, UPDATE, PASSIVE);
}
public boolean getDoExperienceBarsAlwaysUpdateTitle() {
return getBooleanValue(EXPERIENCE + BARS, THIS_MAY_CAUSE_LAG, ALWAYS + UPDATE + TITLES_WHEN_XPIS_GAINED, ENABLE) || getAddExtraDetails();
}
public boolean getAddExtraDetails() {
return getBooleanValue(EXPERIENCE + BARS, THIS_MAY_CAUSE_LAG, ALWAYS + UPDATE + TITLES_WHEN_XPIS_GAINED, EXTRA_DETAILS);
}
public boolean isExperienceBarsEnabled() {
return getBooleanValue(EXPERIENCE + BARS, ENABLE);
}
public boolean isExperienceBarEnabled(PrimarySkillType primarySkillType) {
return getBooleanValue(EXPERIENCE + BARS, StringUtils.getCapitalized(primarySkillType.toString()), ENABLE);
}
public BarColor getExperienceBarColor(PrimarySkillType primarySkillType) {
String colorValueFromConfig = getStringValue(EXPERIENCE + BARS, StringUtils.getCapitalized(primarySkillType.toString()), COLOR);
for (BarColor barColor : BarColor.values()) {
if (barColor.toString().equalsIgnoreCase(colorValueFromConfig))
return barColor;
}
//In case the value is invalid
return BarColor.WHITE;
}
public BarStyle getExperienceBarStyle(PrimarySkillType primarySkillType) {
String colorValueFromConfig = getStringValue(EXPERIENCE + BARS, StringUtils.getCapitalized(primarySkillType.toString()), BAR_STYLE);
for (BarStyle barStyle : BarStyle.values()) {
if (barStyle.toString().equalsIgnoreCase(colorValueFromConfig))
return barStyle;
}
//In case the value is invalid
return BarStyle.SOLID;
}
/* Acrobatics */
public int getDodgeXPModifier() {
return getIntValue(EXPERIENCE, ACROBATICS, DODGE);
}
public int getRollXPModifier() {
return getIntValue(EXPERIENCE, ACROBATICS, ROLL);
}
public int getFallXPModifier() {
return getIntValue(EXPERIENCE, ACROBATICS, FALL);
}
public double getFeatherFallXPModifier() {
return getDoubleValue(EXPERIENCE, ACROBATICS, FEATHER_FALL_MULTIPLIER);
}
/* Alchemy */
public double getPotionXP(PotionStage stage) {
return getDoubleValue(EXPERIENCE, ALCHEMY, POTION_STAGE + stage.toNumerical());
}
/* Archery */
public double getArcheryDistanceMultiplier() {
return getDoubleValue(EXPERIENCE, ARCHERY, DISTANCE + MULTIPLIER1);
}
public int getFishingShakeXP() {
return getIntValue(EXPERIENCE, FISHING, SHAKE);
}
/* Repair */
public double getRepairXPBase() {
return getDoubleValue(EXPERIENCE, REPAIR, BASE1);
}
public double getRepairXP(MaterialType repairMaterialType) {
return getDoubleValue(EXPERIENCE, REPAIR, StringUtils.getCapitalized(repairMaterialType.toString()));
}
/* Taming */
public int getTamingXP(EntityType type) {
return getIntValue(EXPERIENCE, TAMING, ANIMAL_TAMING, type.getConfigName());
}
}

View File

@@ -1,124 +0,0 @@
package com.gmail.nossr50.core.data.blockmeta.chunkmeta;
import com.gmail.nossr50.core.mcmmo.block.Block;
import com.gmail.nossr50.core.mcmmo.block.BlockState;
import com.gmail.nossr50.core.mcmmo.entity.Entity;
import com.gmail.nossr50.core.mcmmo.world.World;
import java.io.IOException;
public class NullChunkManager implements ChunkManager {
@Override
public void closeAll() {
}
@Override
public ChunkStore readChunkStore(World world, int x, int z) throws IOException {
return null;
}
@Override
public void writeChunkStore(World world, int x, int z, ChunkStore data) {
}
@Override
public void closeChunkStore(World world, int x, int z) {
}
@Override
public void loadChunklet(int cx, int cy, int cz, World world) {
}
@Override
public void unloadChunklet(int cx, int cy, int cz, World world) {
}
@Override
public void loadChunk(int cx, int cz, World world, Entity[] entities) {
}
@Override
public void unloadChunk(int cx, int cz, World world) {
}
@Override
public void saveChunk(int cx, int cz, World world) {
}
@Override
public boolean isChunkLoaded(int cx, int cz, World world) {
return true;
}
@Override
public void chunkLoaded(int cx, int cz, World world) {
}
@Override
public void chunkUnloaded(int cx, int cz, World world) {
}
@Override
public void saveWorld(World world) {
}
@Override
public void unloadWorld(World world) {
}
@Override
public void loadWorld(World world) {
}
@Override
public void saveAll() {
}
@Override
public void unloadAll() {
}
@Override
public boolean isTrue(int x, int y, int z, World world) {
return false;
}
@Override
public boolean isTrue(Block block) {
return false;
}
@Override
public boolean isTrue(BlockState blockState) {
return false;
}
@Override
public void setTrue(int x, int y, int z, World world) {
}
@Override
public void setTrue(Block block) {
}
@Override
public void setTrue(BlockState blockState) {
}
@Override
public void setFalse(int x, int y, int z, World world) {
}
@Override
public void setFalse(Block block) {
}
@Override
public void setFalse(BlockState blockState) {
}
@Override
public void cleanUp() {
}
}

View File

@@ -1,370 +0,0 @@
package com.gmail.nossr50.core.datatypes.party;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.datatypes.experience.FormulaType;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.mcmmo.colors.ChatColor;
import com.gmail.nossr50.core.mcmmo.commands.CommandSender;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.party.PartyManager;
import com.gmail.nossr50.core.util.EventUtils;
import com.gmail.nossr50.core.util.sounds.SoundManager;
import com.gmail.nossr50.core.util.sounds.SoundType;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.UUID;
public class Party {
private final LinkedHashMap<UUID, String> members = new LinkedHashMap<UUID, String>();
private final List<Player> onlineMembers = new ArrayList<Player>();
private PartyLeader leader;
private String name;
private String password;
private boolean locked;
private Party ally;
private int level;
private float xp;
private ShareMode xpShareMode = ShareMode.NONE;
private ShareMode itemShareMode = ShareMode.NONE;
private boolean shareLootDrops = true;
private boolean shareMiningDrops = true;
private boolean shareHerbalismDrops = true;
private boolean shareWoodcuttingDrops = true;
private boolean shareMiscDrops = true;
public Party(String name) {
this.name = name;
}
public Party(PartyLeader leader, String name) {
this.leader = leader;
this.name = name;
this.locked = true;
this.level = 0;
}
public Party(PartyLeader leader, String name, String password) {
this.leader = leader;
this.name = name;
this.password = password;
this.locked = true;
this.level = 0;
}
public Party(PartyLeader leader, String name, String password, boolean locked) {
this.leader = leader;
this.name = name;
this.password = password;
this.locked = locked;
this.level = 0;
}
public LinkedHashMap<UUID, String> getMembers() {
return members;
}
public List<Player> getOnlineMembers() {
return onlineMembers;
}
public List<Player> getVisibleMembers(Player player) {
ArrayList<Player> visibleMembers = new ArrayList<>();
for (Player p : onlineMembers) {
if (player.canSee(p))
visibleMembers.add(p);
}
return visibleMembers;
}
public List<String> getOnlinePlayerNames(CommandSender sender) {
Player player = sender instanceof Player ? (Player) sender : null;
List<String> onlinePlayerNames = new ArrayList<String>();
for (Player onlinePlayer : getOnlineMembers()) {
if (player != null && player.canSee(onlinePlayer)) {
onlinePlayerNames.add(onlinePlayer.getName());
}
}
return onlinePlayerNames;
}
public boolean addOnlineMember(Player player) {
return onlineMembers.add(player);
}
public boolean removeOnlineMember(Player player) {
return onlineMembers.remove(player);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PartyLeader getLeader() {
return leader;
}
public void setLeader(PartyLeader leader) {
this.leader = leader;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isLocked() {
return locked;
}
public void setLocked(boolean locked) {
this.locked = locked;
}
public Party getAlly() {
return ally;
}
public void setAlly(Party ally) {
this.ally = ally;
}
public List<String> getItemShareCategories() {
List<String> shareCategories = new ArrayList<String>();
for (ItemShareType shareType : ItemShareType.values()) {
if (sharingDrops(shareType)) {
shareCategories.add(shareType.getLocaleString());
}
}
return shareCategories;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public float getXp() {
return xp;
}
public void setXp(float xp) {
this.xp = xp;
}
public void addXp(float xp) {
setXp(getXp() + xp);
}
protected float levelUp() {
float xpRemoved = getXpToLevel();
setLevel(getLevel() + 1);
setXp(getXp() - xpRemoved);
return xpRemoved;
}
public int getXpToLevel() {
FormulaType formulaType = ExperienceConfig.getInstance().getFormulaType();
return (mcMMO.getFormulaManager().getCachedXpToLevel(level, formulaType)) * (getOnlineMembers().size() + MainConfig.getInstance().getPartyXpCurveMultiplier());
}
public String getXpToLevelPercentage() {
DecimalFormat percent = new DecimalFormat("##0.00%");
return percent.format(this.getXp() / getXpToLevel());
}
/**
* Applies an experience gain
*
* @param xp Experience amount to add
*/
public void applyXpGain(float xp) {
if (!EventUtils.handlePartyXpGainEvent(this, xp)) {
return;
}
if (getXp() < getXpToLevel()) {
return;
}
int levelsGained = 0;
float xpRemoved = 0;
while (getXp() >= getXpToLevel()) {
if (hasReachedLevelCap()) {
setXp(0);
return;
}
xpRemoved += levelUp();
levelsGained++;
}
if (!EventUtils.handlePartyLevelChangeEvent(this, levelsGained, xpRemoved)) {
return;
}
if (!MainConfig.getInstance().getPartyInformAllMembers()) {
Player leader = mcMMO.p.getServer().getPlayer(this.leader.getUniqueId());
if (leader != null) {
leader.sendMessage(LocaleLoader.getString("Party.LevelUp", levelsGained, getLevel()));
if (MainConfig.getInstance().getLevelUpSoundsEnabled()) {
SoundManager.sendSound(leader, leader.getLocation(), SoundType.LEVEL_UP);
}
}
return;
}
PartyManager.informPartyMembersLevelUp(this, levelsGained, getLevel());
}
public boolean hasReachedLevelCap() {
return MainConfig.getInstance().getPartyLevelCap() < getLevel() + 1;
}
public ShareMode getXpShareMode() {
return xpShareMode;
}
public void setXpShareMode(ShareMode xpShareMode) {
this.xpShareMode = xpShareMode;
}
public ShareMode getItemShareMode() {
return itemShareMode;
}
public void setItemShareMode(ShareMode itemShareMode) {
this.itemShareMode = itemShareMode;
}
public boolean sharingDrops(ItemShareType shareType) {
switch (shareType) {
case HERBALISM:
return shareHerbalismDrops;
case LOOT:
return shareLootDrops;
case MINING:
return shareMiningDrops;
case MISC:
return shareMiscDrops;
case WOODCUTTING:
return shareWoodcuttingDrops;
default:
return false;
}
}
public void setSharingDrops(ItemShareType shareType, boolean enabled) {
switch (shareType) {
case HERBALISM:
shareHerbalismDrops = enabled;
break;
case LOOT:
shareLootDrops = enabled;
break;
case MINING:
shareMiningDrops = enabled;
break;
case MISC:
shareMiscDrops = enabled;
break;
case WOODCUTTING:
shareWoodcuttingDrops = enabled;
break;
default:
return;
}
}
public boolean hasMember(String memberName) {
return this.getMembers().values().contains(memberName);
}
public boolean hasMember(UUID uuid) {
return this.getMembers().keySet().contains(uuid);
}
public String createMembersList(Player player) {
StringBuilder memberList = new StringBuilder();
for (Player otherPlayer : this.getVisibleMembers(player)) {
String memberName = otherPlayer.getName();
if (this.getLeader().getUniqueId().equals(otherPlayer.getUniqueId())) {
memberList.append(ChatColor.GOLD);
if (otherPlayer == null) {
memberName = memberName.substring(0, 1) + ChatColor.GRAY + ChatColor.ITALIC + "" + memberName.substring(1);
}
} else if (otherPlayer != null) {
memberList.append(ChatColor.WHITE);
} else {
memberList.append(ChatColor.GRAY);
}
if (player.getName().equalsIgnoreCase(otherPlayer.getName())) {
memberList.append(ChatColor.ITALIC);
}
memberList.append(memberName).append(ChatColor.RESET).append(" ");
}
return memberList.toString();
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof Party)) {
return false;
}
Party other = (Party) obj;
if ((this.getName() == null) || (other.getName() == null)) {
return false;
}
return this.getName().equals(other.getName());
}
}

View File

@@ -1,15 +0,0 @@
package com.gmail.nossr50.core.events.chat;
/**
* Called when a chat is sent to the admin chat channel
*/
public class McMMOAdminChatEvent extends McMMOChatEvent {
public McMMOAdminChatEvent(String sender, String displayName, String message) {
super(sender, displayName, message);
}
public McMMOAdminChatEvent(String sender, String displayName, String message, boolean isAsync) {
super(sender, displayName, message, isAsync);
}
}

View File

@@ -1,24 +0,0 @@
package com.gmail.nossr50.core.mcmmo;
/**
* Custom Definitions for Block's Type
* Unlike Bukkit's Material system, this matches a block by its state information
* For example, an Oak Log in older versions of MC was simply a block with state information of being variant oak
* To account for all the differences between version we have our own custom constants that will match based on platform
*/
public enum BlockType {
//TODO: Fill in every block that has ever existed
AIR,
WATER;
//TODO: Wire this up
/**
* Gets the config name for a block type
* @return the config name for this block type
*/
public String getConfigName()
{
}
}

View File

@@ -1,23 +0,0 @@
package com.gmail.nossr50.core.mcmmo;
public interface Nameable extends Named {
/**
* Change the name for this entity
*
* @param newName the new name of this entity
*/
void setName(String newName);
/**
* Returns the original name for this entity before any renaming
*
* @return the original name of this entity
*/
String getOriginalName();
/**
* This is the name used for chat messages and other things
* @return the display name of this entity
*/
String getDisplayName();
}

View File

@@ -1,14 +0,0 @@
package com.gmail.nossr50.core.mcmmo;
/**
* A lot of Objects in MC have names
* This is what this class is for
*/
public interface Named {
/**
* Returns the name of this entity
*
* @return this entity
*/
String getName();
}

View File

@@ -1,11 +0,0 @@
package com.gmail.nossr50.core.mcmmo;
import java.util.UUID;
/**
* Many things in MC use UUID to be uniquely identified
*
*/
public interface Unique {
UUID getUUID();
}

View File

@@ -1,15 +0,0 @@
package com.gmail.nossr50.core.mcmmo.block;
/**
* Represents a container of properties and values for a Block
*
* @see Property
* @see BlockState
*/
public interface Block extends BlockPos {
/**
* Get the state for this block
* @return the block state
*/
BlockState getBlockState();
}

View File

@@ -1,21 +0,0 @@
package com.gmail.nossr50.core.mcmmo.block;
import com.gmail.nossr50.core.mcmmo.world.World;
/**
* Block positions are handled a bit differently than other locations
*/
public interface BlockPos {
int getX();
int getY();
int getZ();
/**
* Gets the world for this block
* @return this block's world
*/
World getWorld();
}

View File

@@ -1,46 +0,0 @@
package com.gmail.nossr50.core.mcmmo.block;
import com.google.common.collect.ImmutableMap;
import java.util.Collection;
/**
* Representation of the state for a Block
* This tries to mirror MC internals, but only the parts mcMMO cares about
*/
public interface BlockState {
//This is the immutable map of all properties for this block state
ImmutableMap<Property<?>, Comparable<?>> getImmutablePropertyMap();
//This will return the keyset for properties on this block state
Collection<Property<?>> getPropertyKeyset();
//TODO: I don't know if we need to mirror the cycling of properties
/**
* Get the value for the given property key
*
* @param property the property key
* @param <T> the type of property
* @return the value, can be null
*/
<T extends Comparable<T>> T getPropertyValue(Property<T> property);
/**
* This will attempt to find a matching property for this block state
*
* @param property the property we want to match
* @param value the value we are trying to match
* @param <T> the type of the property
* @param <V> the type of the value
* @return the matching property on this block state, can be null
*/
<T extends Comparable<T>, V extends T> BlockState findProperty(Property<T> property, V value);
/**
* This returns the block that this state belongs to
*
* @return the parent Block
*/
Block getBlock();
}

View File

@@ -1,40 +0,0 @@
package com.gmail.nossr50.core.mcmmo.block;
import java.util.Collection;
/**
* Properties are Comparable key value pairs for a blocks state
* In MC this exists in three forms, Integer, Booleans, and Enums
* <p>
* This class partially mirrors MC Internals
*/
public interface Property<T extends Comparable<T>> {
/**
* The name of the Property
*
* @return name of this property
*/
String getName();
/**
* A collection of allowed values for this property
*
* @return the allowed values for this property
*/
Collection<T> getAllowedValues();
/**
* The class of the value for this particular property
*
* @return the value's class
*/
Class<T> getValueClass();
/**
* The name for a specific value
*
* @param value the value to match
* @return the name of this value
*/
String getName(T value);
}

View File

@@ -1,15 +0,0 @@
package com.gmail.nossr50.core.mcmmo.bossbars;
/**
* Boss bars can only be specific colors
* Those colors are listed here
*/
public enum BarColor {
BLUE,
GREEN,
PINK,
PURPLE,
RED,
WHITE,
YELLOW
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.mcmmo.bossbars;
/**
* Represents the visual style for Boss Bar, these are hardcoded and only the following are available
*/
public enum BarStyle {
SEGMENTED_6,
SEGMENTED_10,
SEGMENTED_12,
SEGMENTED_20,
SOLID
}

View File

@@ -1,33 +0,0 @@
package com.gmail.nossr50.core.mcmmo.colors;
/**
* Represents special formatting codes in Minecraft
*
* Some of them apply colors, some of them apply stylized effects to the text.
*/
public enum ChatColor {
BLACK,
DARK_BLUE,
DARK_GREEN,
DARK_AQUA,
DARK_RED,
DARK_PURPLE,
GOLD,
GRAY,
DARK_GRAY,
BLUE,
GREEN,
AQUA,
RED,
LIGHT_PURPLE,
YELLOW,
WHITE,
OBFUSCATED,
BOLD,
STRIKETHROUGH,
UNDERLINE,
ITALIC,
RESET;
static final String formattingCharacter = "§";
}

View File

@@ -1,30 +0,0 @@
package com.gmail.nossr50.core.mcmmo.colors;
/**
* Colors used by MC for non-chat purposes
*/
public enum Color {
AQUA,
BLACK,
BLUE,
FUCHSIA,
GRAY,
GREEN,
LIME,
MAROON,
NAVY,
OLIVE,
ORANGE,
PURPLE,
RED,
SILVER,
TEAL,
WHITE,
YELLOW;
Color fromRGB(int r, int g, int b)
{
//TODO: Figure this out later
}
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.core.mcmmo.commands;
/**
* Command senders are either Players or the CLI
*/
public interface CommandSender {
/**
* Send a message to the CommandSender
* @param msg the message to send
*/
void sendMessage(String msg);
}

View File

@@ -1,20 +0,0 @@
package com.gmail.nossr50.core.mcmmo.entity;
import com.gmail.nossr50.core.mcmmo.Named;
import com.gmail.nossr50.core.mcmmo.Unique;
import com.gmail.nossr50.core.mcmmo.meta.MetadataHolder;
import com.gmail.nossr50.core.mcmmo.world.Location;
/**
* Entities can be a lot of things in MC
* Entities can be monsters, animals, players, etc...
*/
public interface Entity extends Location, Named, Unique, MetadataHolder {
/**
* The Location for this entity
*
* @return this entity's location
*/
Location getLocation();
}

View File

@@ -1,111 +0,0 @@
package com.gmail.nossr50.core.mcmmo.entity;
/**
* Used bukkit as a reference for this, should probably make sure nothing weird is in here
*/
public enum EntityType {
//TODO: Fill this out
AREA_EFFECT_CLOUD,
ARROW,
BAT,
BLAZE,
BOAT,
CAVE_SPIDER,
CHICKEN,
COD,
COMPLEX_PART,
COW,
CREEPER,
DOLPHIN,
DONKEY,
DRAGON_FIREBALL,
DROPPED_ITEM,
DROWNED,
EGG,
ELDER_GUARDIAN,
ENDER_CRYSTAL,
ENDER_DRAGON,
ENDER_PEARL,
ENDER_SIGNAL,
ENDERMAN,
ENDERMITE,
EVOKER,
EVOKER_FANGS,
EXPERIENCE_ORB,
FALLING_BLOCK,
FIREBALL,
FIREWORK,
FISHING_HOOK,
GHAST,
GIANT,
GUARDIAN,
HORSE,
HUSK,
ILLUSIONER,
IRON_GOLEM,
ITEM_FRAME,
LEASH_HITCH,
LIGHTNING,
LINGERING_POTION,
LLAMA,
LLAMA_SPIT,
MAGMA_CUBE,
MINECART,
MINECART_CHEST,
MINECART_COMMAND,
MINECART_FURNACE,
MINECART_HOPPER,
MINECART_MOB_SPAWNER,
MINECART_TNT,
MULE,
MUSHROOM_COW,
OCELOT,
PAINTING,
PARROT,
PHANTOM,
PIG,
PIG_ZOMBIE,
PLAYER,
POLAR_BEAR,
PRIMED_TNT,
PUFFERFISH,
RABBIT,
SALMON,
SHEEP,
SHULKER,
SHULKER_BULLET,
SILVERFISH,
SKELETON,
SKELETON_HORSE,
SLIME,
SMALL_FIREBALL,
SNOWBALL,
SNOWMAN,
SPECTRAL_ARROW,
SPIDER,
SPLASH_POTION,
SQUID,
STRAY,
THROWN_XP_BOTTLE,
TIPPED_ARROW,
TRIDENT,
TROPICAL_FISH,
TURTLE,
VEX,
VILLAGER,
VINDICATOR,
WEATHER,
WITCH,
WITHER,
WITHER_SKELETON,
WITHER_SKULL,
WOLF,
ZOMBIE,
ZOMBIE_HORSE,
ZOMBIE_VILLAGER;
//TODO: Wire this up
public String getConfigName() {
//return toString();
}
}

View File

@@ -1,43 +0,0 @@
package com.gmail.nossr50.core.mcmmo.entity;
/**
* Living means you can die, you have health, and you can be damaged
*/
public interface Living extends Entity {
/**
* Whether or not this entity is still alive
*
* @return true if the entity is alive
*/
Boolean isAlive();
/**
* Change the health of an entity
*
* @param newHealth the new health value for the entity
*/
void setHealth(int newHealth);
/**
* Damage an entity
* This damage will be reduced by any defensive modifiers such as armor
*
* @param damage the damage to deal to this entity
*/
void damage(int damage);
/**
* Damage an entity and attribute it to a source
* This damage will be reduced by any defensive modifiers such as armor
*
* @param source the source responsible for the damage
* @param damage the damage to deal to this entity
*/
void damage(Entity source, int damage);
/**
* Whether or not this entity still exists
* @return true if valid
*/
Boolean isValid();
}

View File

@@ -1,39 +0,0 @@
package com.gmail.nossr50.core.mcmmo.entity;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.mcmmo.Nameable;
import com.gmail.nossr50.core.mcmmo.inventory.InventoryHolder;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
import com.gmail.nossr50.core.mcmmo.permissions.Permissible;
/**
* Players
*/
public interface Player extends Living, Nameable, InventoryHolder, Permissible {
/**
* Players are not always online
*
* @return true if the player is online
*/
Boolean isOnline();
/**
* Gets the McMMOPlayer for this Player
*
* @return the associated McMMOPlayer, can be null
*/
McMMOPlayer getMcMMOPlayer();
/**
* Gets the item in the main hand of this player
* @return the item in the main hand
*/
ItemStack getItemInMainHand();
/**
* Sends a message to this player
* @param msg the message to send
*/
void sendMessage(String msg);
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.mcmmo.entity;
/**
* Represents an entity that can be tamed
*/
public interface Tameable extends Living {
}

View File

@@ -1,21 +0,0 @@
package com.gmail.nossr50.core.mcmmo.event;
/**
* This class handles cancellations for an event
*/
public interface Cancellable {
/**
* Whether or not the event is cancelled
*
* @return true if cancelled
*/
boolean isCancelled();
/**
* Sets an events cancellation to b
*
* @param b
*/
void setCancelled(boolean b);
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.mcmmo.event;
/**
* Represents an event for a given API
*/
public interface Event {
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.mcmmo.event;
public interface EventCommander {
/**
* Calls an event
* @param event the event to call
* @return the event after it has been passed around
*/
Event callEvent(Event event);
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.core.mcmmo.event;
/**
* Different platforms have different event systems
* These ENUMs will be the magic number for what kind of event we are targeting
*/
public enum EventType {
//TODO: These are being based on the bukkit events mcMMO has used, the values will most likely change
EVENT_BLOCK_PISTON_EXTEND,
EVENT_BLOCK_PISTON_RETRACT,
//Currently not sure I need this class, so I'll refrain from adding more events atm...
}

View File

@@ -1,17 +0,0 @@
package com.gmail.nossr50.core.mcmmo.inventory;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
public interface Inventory {
/**
* Grab the entire Inventory
* @return this inventory
*/
ItemStack[] getInventory();
/**
* Sets the inventory
* @param inventory new inventory
*/
void setInventory(ItemStack[] inventory);
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.mcmmo.inventory;
/**
* Represents something that has an inventory
*/
public interface InventoryHolder {
/**
* Gets the inventory for this entity
* @return this inventory
*/
Inventory getInventory();
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.mcmmo.inventory;
/**
* Definitions for item types
*
* items prefixed with LEGACY are items that are removed from current versions of the game
*/
public enum ItemType {
AIR,
}

View File

@@ -1,66 +0,0 @@
package com.gmail.nossr50.core.mcmmo.item;
import com.gmail.nossr50.core.mcmmo.nbt.NBT;
import java.util.ArrayList;
/**
* Represents an ItemStack in Minecraft
*/
public interface ItemStack {
/**
* Makes a new ItemStack for a given itemType with a size of 1 and default properties
* @param itemType the item type for the item stack
* @return a new item stack of size 1 with default properties
*/
ItemStack makeNew(ItemType itemType);
/**
* The maximum amount of this item allowed in a stack
* @return the maximum stack size of the item
*/
int getMaxStackSize();
/**
* The current amount of items in this stack
* @return the amount of items
*/
int getAmount();
/**
* Replaces the lore on an item stack
* @param replacementLore the new lore for this item
*/
void setItemLore(ArrayList<String> replacementLore);
/**
* Unlocalized name of this item
* @return the unlocalized name of this item (english)
*/
String getUnlocalizedName();
/**
* The maximum amount of damage this item can take before it breaks
* @return the maximum damage allowed on this item
*/
int getMaxDamage();
/**
* The id of this item
* @return this item's id
*/
int getItemId();
/**
* Returns the cooldown for an item
* @return this item's cooldown
*/
int getCoolDown();
/**
* Returns the compound NBT data for this item
* @return this item's NBT data
*/
NBT getNBT();
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.mcmmo.item;
/**
* Items are things that the player can pick up and hold in his hand
* Which includes item versions of blocks
*/
public enum ItemType {
//TODO: Fill this in
COOKED_BEEF,
CAKE;
}

View File

@@ -1,25 +0,0 @@
package com.gmail.nossr50.core.mcmmo.meta;
/**
* Represents custom state in the API
* Mostly provided by plugins
*/
public interface Metadata {
/**
* The metadata key for this metadata
* @return the metadata key
*/
String getKey();
/**
* The value for this metadata key
* @return the value of this metadata
*/
Object getValue();
/**
* Replace the value in this metadata
* @param newValue the replacement metadata value
*/
void setValue(Object newValue);
}

View File

@@ -1,5 +0,0 @@
package com.gmail.nossr50.core.mcmmo.meta;
public class MetadataDefinitions {
public static final String MCMMO_METADATA_PLAYERDATA_KEY = "mcMMO_PlayerDataKey";
}

View File

@@ -1,29 +0,0 @@
package com.gmail.nossr50.core.mcmmo.meta;
/**
* A metadataHolder is something that can hold metadata
* Both Bukkit and Sponge provide metadata APIs
*/
public interface MetadataHolder {
/**
* Gets the metadata for the appropriate key
* @param key the key for the metadata
* @return the metadata for this key
*/
Metadata getMetadata(String key);
/**
* Sets the metadata, will replace metadata with an existing key or add metadata if there was none
* @param metadata metadata to add
* @return a copy of the metadata
*/
Metadata setMetadata(Metadata metadata);
/**
* Sets the metadata, will replace metadata with a matching key or add metadata if there was none
* @param key metadata key
* @param value metadata value
* @return a copy of the metadata
*/
Metadata setMetadata(String key, Object value);
}

View File

@@ -1,7 +0,0 @@
package com.gmail.nossr50.core.mcmmo.nbt;
/**
* Represents compound NBT Data
*/
public interface NBT {
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.core.mcmmo.permissions;
/**
* A thing that can have Permissions is a Permissible
*/
public interface Permissible {
/**
* Returns whether or not this Permissible has this permission
* @param path the permission nodes full path
* @return true if the permissible has this permission
*/
boolean hasPermission(String path);
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.core.mcmmo.plugin;
/**
* Represents mcMMO as it is seen by various APIs
* In Bukkit, its useful to have a Plugin reference to schedule tasks etc, that is why this abstraction exists
* I'm actually not sure I need this though
*/
public interface Plugin {
/**
* In the event of some critical failure in mcMMO shut down the plugin
*/
void disablePlugin();
}

View File

@@ -1,34 +0,0 @@
package com.gmail.nossr50.core.mcmmo.server;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.mcmmo.world.World;
/**
* Represents the server and its state
*/
public interface Server {
/**
* Broadcasts a msg to every player on the server
* @param msg the message to broadcast
*/
void broadcast(String msg);
/**
* Broadcasts a message only to players with the appropriate permission node
* @param msg the message to broadcast
* @param permission the permission node required to hear the message
*/
void broadcast(String msg, String permission);
/**
* Gets the online players for this server
* @return the online players for this server
*/
Player[] getOnlinePlayers();
/**
* Gets the worlds for this server
* @return the worlds for this server
*/
World[] getWorlds();
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.mcmmo.tasks;
/**
* An ASync Task
* You have to be careful where you use these, a lot of things are not thread safe
*/
public interface ASyncTask extends PluginTask {
}

View File

@@ -1,29 +0,0 @@
package com.gmail.nossr50.core.mcmmo.tasks;
/**
* Represents a schedules task
* Bukkit and Sponge both have systems for this
*/
public interface PluginTask {
/**
* Kills the current task
*/
void killTask();
/**
* Schedule a delayed task in n ticks
* @param ticks ticks until the task should start
*/
void scheduleTask(int ticks);
/**
* Schedule this task (begins ASAP)
*/
void scheduleTask();
/**
* Get the ID of this task
* @return the id of this task
*/
int getTaskId();
}

View File

@@ -1,9 +0,0 @@
package com.gmail.nossr50.core.mcmmo.tasks;
/**
* Represents a SyncTask
* SyncTasks run on the main thread
*/
public interface SyncTask extends PluginTask {
}

View File

@@ -1,25 +0,0 @@
package com.gmail.nossr50.core.mcmmo.tasks;
/**
* Schedules tasks for a platform
*/
public interface TaskScheduler {
/**
* Schedules the specified task
* @param pluginTask the task to schedule
*/
PluginTask scheduleTask(PluginTask pluginTask);
/**
* Schedules the specified task
* @param runnable the runnable to schedule
*/
PluginTask scheduleTask(Runnable runnable);
/**
* Schedules the specified task
* @param runnable the runnable to schedule
* @param tickDelay the delay for this task in ticks
*/
PluginTask scheduleTask(Runnable runnable, int tickDelay);
}

View File

@@ -1,50 +0,0 @@
package com.gmail.nossr50.core.mcmmo.world;
import java.util.Objects;
/**
* A World in MC
* Stuff mcMMO does not require will not be in this class
*/
public abstract class AbstractWorld implements World {
private final String worldName;
public AbstractWorld(String worldName) {
this.worldName = worldName;
}
/**
* Gets the name of this World
*
* @return the name of this world
*/
@Override
public String getName() {
return worldName;
}
/**
* Compares this object to another to see if they are equal
*
* @param o the other object
* @return true if they are equal
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof AbstractWorld)) return false;
AbstractWorld that = (AbstractWorld) o;
return worldName.equals(that.worldName);
}
/**
* The hash code for the object, used for comparisons
*
* @return hash code for this object
*/
@Override
public int hashCode() {
return Objects.hash(worldName);
}
}

View File

@@ -1,44 +0,0 @@
package com.gmail.nossr50.core.mcmmo.world;
import com.flowpowered.math.vector.Vector3d;
/**
* This class represents a Location in MC
* Locations have a world and x, y, and z axis values
*/
public interface Location {
/**
* The Vector3d of this location
* @return this vector
*/
Vector3d getVector();
/**
* Returns the position of this location on the x-axis
*
* @return x-axis position
*/
default double getX() { return getVector().getX(); }
/**
* Returns the position of this location on the y-axis
*
* @return y-axis position
*/
default double getY() { return getVector().getY(); }
/**
* Returns the position of this location on the z-axis
*
* @return z-axis position
*/
default double getZ() { return getVector().getZ(); }
/**
* The world for this Location
*
* @return the world of this location
*/
World getWorld();
}

View File

@@ -1,30 +0,0 @@
package com.gmail.nossr50.core.mcmmo.world;
import com.gmail.nossr50.core.mcmmo.Unique;
import java.io.File;
/**
* Represents a world in MC
*/
public interface World extends Unique {
/**
* Gets the name of this World
*
* @return the name of this world
*/
String getName();
/**
* Gets the folder on disk for this world
*
* @return the folder on disk for this world
*/
File getWorldFolder();
/**
* Gets the max height for this world
* @return the max height
*/
int getMaxHeight();
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.platform;
/**
* This is the implementation of the Platform Interface
*/
public abstract class AbstractPlatform implements Platform {
}

View File

@@ -1,80 +0,0 @@
package com.gmail.nossr50.core.platform;
import com.gmail.nossr50.core.mcmmo.server.Server;
import com.gmail.nossr50.core.mcmmo.tasks.TaskScheduler;
import java.io.File;
/**
* Represents the current API Platform
* mcMMO supports multiple platforms, so that abstraction is handled through this interface
*/
public interface Platform {
/**
* Gets the MC Server implementation for this Platform
* @return the MC server object
*/
Server getServer();
/**
* Gets the name of the Platform
*
* @return name of this platform
*/
String getPlatformName();
/**
* Gets the version of this platform
*
* @return the current version of this platform
*/
String getPlatformVersion();
/**
* Gets the target version of Minecraft for this platform
*
* @return this platform's target minecraft version
*/
String getTargetMinecraftVersion();
/**
* Whether or not this platform has been loaded
*
* @return true if the platform is loaded
*/
boolean isPlatformLoaded();
/**
* Gets the PlatformSoftwareType for this platform
*
* @return this PlatformSoftwareType
*/
PlatformSoftwareType getPlatformSoftwareType();
/**
* Gets the task Scheduler
* @return the task scheduler
*/
TaskScheduler getScheduler();
/**
* Gets a resource stream from inside the JAR at a specified path
* @param path the path inside the JAR where the resource stream is found
* @return the resource stream
*/
java.io.InputStream getResource(String path);
/**
* Gets the path of the Data folder for this platform
* @return this platform's data folder
*/
File getDataFolderPath();
/**
* Gets the path of the mods config folder inside the Data folder for this platform
* @return this platform's mod config subdirectory
*/
String getModDataFolderPath();
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.platform;
/**
* ENUMs representing the software the platform belongs to
*/
public enum PlatformSoftwareType {
NMS,
BUKKIT,
SPONGE
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.platform;
/**
* Constants for targeted versions of MC
*
* @see Platform#getTargetMinecraftVersion()
*/
public class TargetMinecraftVersion {
public static final String MC_VERSION_1_8_8 = "1_8_8";
public static final String MC_VERSION_1_12_2 = "1_12_2";
public static final String MC_VERSION_1_13_2 = "1_13_2";
}

View File

@@ -1,22 +0,0 @@
package com.gmail.nossr50.core.platform.drivers;
import com.gmail.nossr50.core.platform.Platform;
/**
* Platform Drivers will handled translating our abstraction into instructions for various APIs
*/
public interface PlatformDriver {
/**
* Return the platform for this Driver
*
* @return this platform
*/
Platform getPlatform();
/**
* Gets the target MC Version for this driver
*
* @return the target MC Version for this driver
*/
String getTargetMinecraftVersion();
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.platform.drivers;
/**
* This driver handles instructions for events for a platform
*/
public interface PlatformEventDriver extends PlatformDriver {
}

View File

@@ -1,21 +0,0 @@
package com.gmail.nossr50.core.runnables.database;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.MainConfig;
import java.util.concurrent.locks.ReentrantLock;
public class UserPurgeTask implements Runnable {
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
lock.lock();
McmmoCore.getDatabaseManager().purgePowerlessUsers();
if (MainConfig.getInstance().getOldUsersCutoff() != -1) {
McmmoCore.getDatabaseManager().purgeOldUsers();
}
lock.unlock();
}
}

View File

@@ -1,18 +0,0 @@
package com.gmail.nossr50.core.runnables.skills;
import com.gmail.nossr50.core.mcmmo.entity.Living;
public class BleedContainer {
public int bleedTicks;
public int bleedRank;
public Living target;
public Living damageSource;
public BleedContainer(Living target, int bleedTicks, int bleedRank, Living damageSource) {
this.target = target;
this.bleedTicks = bleedTicks;
this.bleedRank = bleedRank;
this.damageSource = damageSource;
}
}

View File

@@ -1,117 +0,0 @@
package com.gmail.nossr50.core.runnables.skills;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.datatypes.interactions.NotificationType;
import com.gmail.nossr50.core.mcmmo.entity.Living;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.util.MobHealthbarUtils;
import com.gmail.nossr50.core.util.player.NotificationManager;
import com.gmail.nossr50.core.util.skills.CombatUtils;
import com.gmail.nossr50.core.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.core.util.sounds.SoundManager;
import com.gmail.nossr50.core.util.sounds.SoundType;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.UUID;
public class BleedTimerTask extends BukkitRunnable {
private static Map<UUID, BleedContainer> bleedList = new HashMap<UUID, BleedContainer>();
public static BleedContainer copyContainer(BleedContainer container) {
Living target = container.target;
Living source = container.damageSource;
int bleedTicks = container.bleedTicks;
int bleedRank = container.bleedRank;
BleedContainer newContainer = new BleedContainer(target, bleedTicks, bleedRank, source);
return newContainer;
}
/**
* Instantly Bleed out a Living
*
* @param entity Living to bleed out
*/
public static void bleedOut(Living entity) {
/*
* Don't remove anything from the list outside of run()
*/
if (bleedList.containsKey(entity)) {
CombatUtils.dealNoInvulnerabilityTickDamage(entity, bleedList.get(entity).bleedTicks * 2, bleedList.get(entity).damageSource);
}
}
/**
* Add a Living to the bleedList if it is not in it.
*
* @param entity Living to add
* @param ticks Number of bleeding ticks
*/
public static void add(Living entity, Living attacker, int ticks, int bleedRank) {
BleedContainer newBleedContainer = new BleedContainer(entity, ticks, bleedRank, attacker);
bleedList.put(entity, newBleedContainer);
}
public static boolean isBleeding(Living entity) {
return bleedList.containsKey(entity);
}
@Override
public void run() {
Iterator<Entry<Living, BleedContainer>> bleedIterator = bleedList.entrySet().iterator();
while (bleedIterator.hasNext()) {
Entry<Living, BleedContainer> containerEntry = bleedIterator.next();
Living target = containerEntry.getKey();
int bleedTicks = containerEntry.getValue().bleedTicks;
if (containerEntry.getValue().bleedTicks <= 0 || !target.isValid()) {
bleedIterator.remove();
continue;
}
double damage;
if (target instanceof Player) {
damage = AdvancedConfig.getInstance().getRuptureDamagePlayer();
//Above Bleed Rank 3 deals 50% more damage
if (containerEntry.getValue().bleedRank >= 3)
damage = damage * 1.5;
Player player = (Player) target;
if (!player.isOnline()) {
continue;
}
NotificationManager.sendPlayerInformation(player, NotificationType.SUBSKILL_MESSAGE, "Swords.Combat.Bleeding.Stopped");
} else {
damage = AdvancedConfig.getInstance().getRuptureDamageMobs();
//Above Bleed Rank 3 deals 50% more damage
if (containerEntry.getValue().bleedRank >= 3)
damage = damage * 1.5;
MobHealthbarUtils.handleMobHealthbars(target, damage, mcMMO.p); //Update health bars
}
CombatUtils.dealNoInvulnerabilityTickDamage(target, damage, containerEntry.getValue().damageSource);
//Play Bleed Sound
SoundManager.worldSendSound(target.getWorld(), target.getLocation(), SoundType.BLEED);
ParticleEffectUtils.playBleedEffect(target);
//Lower Bleed Ticks
BleedContainer loweredBleedContainer = copyContainer(containerEntry.getValue());
loweredBleedContainer.bleedTicks -= 1;
containerEntry.setValue(loweredBleedContainer);
}
}
}

View File

@@ -1,7 +0,0 @@
package com.gmail.nossr50.core.skills;
public enum ConfigItemCategory {
ARMOR,
TOOL,
OTHER;
}

View File

@@ -1,20 +0,0 @@
package com.gmail.nossr50.core.skills;
public enum ModConfigType {
BLOCKS,
TOOLS,
ARMOR,
UNKNOWN;
public static ModConfigType getModConfigType(String materialName) {
if (materialName.contains("HELM") || (materialName.contains("CHEST") && !materialName.contains("CHESTNUT")) || materialName.contains("LEGS") || materialName.contains("LEGGINGS") || materialName.contains("BOOT")) {
return ARMOR;
} else if (materialName.contains("PICKAXE") || materialName.contains("AXE") || (materialName.contains("BOW") && !materialName.contains("BOWL")) || materialName.contains("HOE") || materialName.contains("SHOVEL") || materialName.contains("SWORD")) {
return TOOLS;
} else if (materialName.contains("LOG") || materialName.contains("LEAVES") || materialName.contains("FLOWER") || materialName.contains("PLANT") || materialName.contains("CROP") || materialName.contains("ORE") || materialName.contains("DIRT") || materialName.contains("SAND") || materialName.contains("GRASS")) {
return BLOCKS;
}
return UNKNOWN;
}
}

View File

@@ -1,235 +0,0 @@
package com.gmail.nossr50.core.skills;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.mcmmo.colors.Color;
import com.gmail.nossr50.core.mcmmo.entity.Entity;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.mcmmo.entity.Tameable;
import com.gmail.nossr50.core.skills.child.salvage.SalvageManager;
import com.gmail.nossr50.core.skills.child.smelting.SmeltingManager;
import com.gmail.nossr50.core.skills.primary.acrobatics.AcrobaticsManager;
import com.gmail.nossr50.core.skills.primary.alchemy.AlchemyManager;
import com.gmail.nossr50.core.skills.primary.archery.ArcheryManager;
import com.gmail.nossr50.core.skills.primary.axes.AxesManager;
import com.gmail.nossr50.core.skills.primary.excavation.ExcavationManager;
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.RepairManager;
import com.gmail.nossr50.core.skills.primary.swords.SwordsManager;
import com.gmail.nossr50.core.skills.primary.taming.TamingManager;
import com.gmail.nossr50.core.skills.primary.unarmed.UnarmedManager;
import com.gmail.nossr50.core.skills.primary.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.StringUtils;
import com.gmail.nossr50.core.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public enum PrimarySkillType {
ACROBATICS(AcrobaticsManager.class, Color.WHITE, ImmutableList.of(SubSkillType.ACROBATICS_DODGE, SubSkillType.ACROBATICS_ROLL)),
ALCHEMY(AlchemyManager.class, Color.FUCHSIA, ImmutableList.of(SubSkillType.ALCHEMY_CATALYSIS, SubSkillType.ALCHEMY_CONCOCTIONS)),
ARCHERY(ArcheryManager.class, Color.MAROON, ImmutableList.of(SubSkillType.ARCHERY_DAZE, SubSkillType.ARCHERY_ARROW_RETRIEVAL, SubSkillType.ARCHERY_SKILL_SHOT)),
AXES(AxesManager.class, Color.AQUA, SuperAbilityType.SKULL_SPLITTER, ToolType.AXE, ImmutableList.of(SubSkillType.AXES_SKULL_SPLITTER, SubSkillType.AXES_ARMOR_IMPACT, SubSkillType.AXES_AXE_MASTERY, SubSkillType.AXES_CRITICAL_STRIKES, SubSkillType.AXES_GREATER_IMPACT)),
EXCAVATION(ExcavationManager.class, Color.fromRGB(139, 69, 19), SuperAbilityType.GIGA_DRILL_BREAKER, ToolType.SHOVEL, ImmutableList.of(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, SubSkillType.EXCAVATION_ARCHAEOLOGY)),
FISHING(FishingManager.class, Color.NAVY, ImmutableList.of(SubSkillType.FISHING_FISHERMANS_DIET, SubSkillType.FISHING_TREASURE_HUNTER, SubSkillType.FISHING_ICE_FISHING, SubSkillType.FISHING_MAGIC_HUNTER, SubSkillType.FISHING_MASTER_ANGLER, SubSkillType.FISHING_SHAKE)),
HERBALISM(HerbalismManager.class, Color.GREEN, SuperAbilityType.GREEN_TERRA, ToolType.HOE, ImmutableList.of(SubSkillType.HERBALISM_GREEN_TERRA, SubSkillType.HERBALISM_FARMERS_DIET, SubSkillType.HERBALISM_GREEN_THUMB, SubSkillType.HERBALISM_DOUBLE_DROPS, SubSkillType.HERBALISM_HYLIAN_LUCK, SubSkillType.HERBALISM_SHROOM_THUMB)),
MINING(MiningManager.class, Color.GRAY, SuperAbilityType.SUPER_BREAKER, ToolType.PICKAXE, ImmutableList.of(SubSkillType.MINING_SUPER_BREAKER, SubSkillType.MINING_DEMOLITIONS_EXPERTISE, SubSkillType.MINING_BIGGER_BOMBS, SubSkillType.MINING_BLAST_MINING, SubSkillType.MINING_DOUBLE_DROPS)),
REPAIR(RepairManager.class, Color.SILVER, ImmutableList.of(SubSkillType.REPAIR_ARCANE_FORGING, SubSkillType.REPAIR_REPAIR_MASTERY, SubSkillType.REPAIR_SUPER_REPAIR)),
SALVAGE(SalvageManager.class, Color.ORANGE, ImmutableList.of(SubSkillType.SALVAGE_ADVANCED_SALVAGE, SubSkillType.SALVAGE_ARCANE_SALVAGE)),
SMELTING(SmeltingManager.class, Color.YELLOW, ImmutableList.of(SubSkillType.SMELTING_UNDERSTANDING_THE_ART, SubSkillType.SMELTING_FLUX_MINING, SubSkillType.SMELTING_FUEL_EFFICIENCY, SubSkillType.SMELTING_SECOND_SMELT)),
SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), SuperAbilityType.SERRATED_STRIKES, ToolType.SWORD, ImmutableList.of(SubSkillType.SWORDS_SERRATED_STRIKES, SubSkillType.SWORDS_RUPTURE, SubSkillType.SWORDS_COUNTER_ATTACK)),
TAMING(TamingManager.class, Color.PURPLE, ImmutableList.of(SubSkillType.TAMING_BEAST_LORE, SubSkillType.TAMING_CALL_OF_THE_WILD, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE, SubSkillType.TAMING_FAST_FOOD_SERVICE, SubSkillType.TAMING_GORE, SubSkillType.TAMING_HOLY_HOUND, SubSkillType.TAMING_SHARPENED_CLAWS, SubSkillType.TAMING_SHOCK_PROOF, SubSkillType.TAMING_THICK_FUR, SubSkillType.TAMING_PUMMEL)),
UNARMED(UnarmedManager.class, Color.BLACK, SuperAbilityType.BERSERK, ToolType.FISTS, ImmutableList.of(SubSkillType.UNARMED_BERSERK, SubSkillType.UNARMED_BLOCK_CRACKER, SubSkillType.UNARMED_ARROW_DEFLECT, SubSkillType.UNARMED_DISARM, SubSkillType.UNARMED_IRON_ARM_STYLE, SubSkillType.UNARMED_IRON_GRIP)),
WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, SuperAbilityType.TREE_FELLER, ToolType.AXE, ImmutableList.of(SubSkillType.WOODCUTTING_LEAF_BLOWER, SubSkillType.WOODCUTTING_TREE_FELLER, SubSkillType.WOODCUTTING_HARVEST_LUMBER));
public static final List<String> SKILL_NAMES;
public static final List<String> SUBSKILL_NAMES;
public static final List<PrimarySkillType> CHILD_SKILLS;
public static final List<PrimarySkillType> NON_CHILD_SKILLS;
public static final List<PrimarySkillType> COMBAT_SKILLS = ImmutableList.of(ARCHERY, AXES, SWORDS, TAMING, UNARMED);
public static final List<PrimarySkillType> GATHERING_SKILLS = ImmutableList.of(EXCAVATION, FISHING, HERBALISM, MINING, WOODCUTTING);
public static final List<PrimarySkillType> MISC_SKILLS = ImmutableList.of(ACROBATICS, ALCHEMY, REPAIR, SALVAGE, SMELTING);
static {
List<PrimarySkillType> childSkills = new ArrayList<PrimarySkillType>();
List<PrimarySkillType> nonChildSkills = new ArrayList<PrimarySkillType>();
ArrayList<String> names = new ArrayList<String>();
ArrayList<String> subSkillNames = new ArrayList<>();
for (PrimarySkillType skill : values()) {
if (skill.isChildSkill()) {
childSkills.add(skill);
} else {
nonChildSkills.add(skill);
}
for (SubSkillType subSkillType : skill.subSkillTypes) {
subSkillNames.add(subSkillType.getNiceNameNoSpaces(subSkillType));
}
names.add(skill.getName());
}
Collections.sort(names);
SKILL_NAMES = ImmutableList.copyOf(names);
SUBSKILL_NAMES = ImmutableList.copyOf(subSkillNames);
CHILD_SKILLS = ImmutableList.copyOf(childSkills);
NON_CHILD_SKILLS = ImmutableList.copyOf(nonChildSkills);
}
private Class<? extends SkillManager> managerClass;
private Color runescapeColor;
private SuperAbilityType ability;
private ToolType tool;
private List<SubSkillType> subSkillTypes;
private PrimarySkillType(Class<? extends SkillManager> managerClass, Color runescapeColor, List<SubSkillType> subSkillTypes) {
this(managerClass, runescapeColor, null, null, subSkillTypes);
}
private PrimarySkillType(Class<? extends SkillManager> managerClass, Color runescapeColor, SuperAbilityType ability, ToolType tool, List<SubSkillType> subSkillTypes) {
this.managerClass = managerClass;
this.runescapeColor = runescapeColor;
this.ability = ability;
this.tool = tool;
this.subSkillTypes = subSkillTypes;
}
public static PrimarySkillType getSkill(String skillName) {
if (!MainConfig.getInstance().getLocale().equalsIgnoreCase("en_US")) {
for (PrimarySkillType type : values()) {
if (skillName.equalsIgnoreCase(LocaleLoader.getString(StringUtils.getCapitalized(type.name()) + ".SkillName"))) {
return type;
}
}
}
for (PrimarySkillType type : values()) {
if (type.name().equalsIgnoreCase(skillName)) {
return type;
}
}
if (!skillName.equalsIgnoreCase("all")) {
McmmoCore.getLogger().warning("Invalid mcMMO skill (" + skillName + ")"); //TODO: Localize
}
return null;
}
public static PrimarySkillType bySecondaryAbility(SubSkillType subSkillType) {
for (PrimarySkillType type : values()) {
if (type.getSkillAbilities().contains(subSkillType)) {
return type;
}
}
return null;
}
public static PrimarySkillType byAbility(SuperAbilityType ability) {
for (PrimarySkillType type : values()) {
if (type.getAbility() == ability) {
return type;
}
}
return null;
}
public Class<? extends SkillManager> getManagerClass() {
return managerClass;
}
public SuperAbilityType getAbility() {
return ability;
}
/**
* Get the max level of this skill.
*
* @return the max level of this skill
*/
public int getMaxLevel() {
return MainConfig.getInstance().getLevelCap(this);
}
public boolean isSuperAbilityUnlocked(Player player) {
return RankUtils.getRank(player, getAbility().getSubSkillTypeDefinition()) >= 1;
}
public boolean getPVPEnabled() {
return MainConfig.getInstance().getPVPEnabled(this);
}
public boolean getPVEEnabled() {
return MainConfig.getInstance().getPVEEnabled(this);
}
public boolean getDoubleDropsDisabled() {
return MainConfig.getInstance().getDoubleDropsDisabled(this);
}
public boolean getHardcoreStatLossEnabled() {
return MainConfig.getInstance().getHardcoreStatLossEnabled(this);
}
public void setHardcoreStatLossEnabled(boolean enable) {
MainConfig.getInstance().setHardcoreStatLossEnabled(this, enable);
}
public boolean getHardcoreVampirismEnabled() {
return MainConfig.getInstance().getHardcoreVampirismEnabled(this);
}
public void setHardcoreVampirismEnabled(boolean enable) {
MainConfig.getInstance().setHardcoreVampirismEnabled(this, enable);
}
public ToolType getTool() {
return tool;
}
public List<SubSkillType> getSkillAbilities() {
return subSkillTypes;
}
public double getXpModifier() {
return ExperienceConfig.getInstance().getFormulaSkillModifier(this);
}
// TODO: This is a little "hacky", we probably need to add something to distinguish child skills in the enum, or to use another enum for them
public boolean isChildSkill() {
switch (this) {
case SALVAGE:
case SMELTING:
return true;
default:
return false;
}
}
public String getName() {
return MainConfig.getInstance().getLocale().equalsIgnoreCase("en_US") ? StringUtils.getCapitalized(this.toString()) : StringUtils.getCapitalized(LocaleLoader.getString(StringUtils.getCapitalized(this.toString()) + ".SkillName"));
}
public boolean getPermissions(Player player) {
return Permissions.skillEnabled(player, this);
}
public void celebrateLevelUp(Player player) {
ParticleEffectUtils.fireworkParticleShower(player, runescapeColor);
}
public boolean shouldProcess(Entity target) {
return (target instanceof Player || (target instanceof Tameable && ((Tameable) target).isTamed())) ? getPVPEnabled() : getPVEEnabled();
}
}

View File

@@ -1,25 +0,0 @@
package com.gmail.nossr50.core.skills.child.smelting;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.skills.RankUtils;
public class Smelting {
public static int burnModifierMaxLevel = AdvancedConfig.getInstance().getBurnModifierMaxLevel();
public static double burnTimeMultiplier = AdvancedConfig.getInstance().getBurnTimeMultiplier();
public static int fluxMiningUnlockLevel = RankUtils.getUnlockLevel(SubSkillType.SMELTING_FLUX_MINING);
public static double fluxMiningChance = AdvancedConfig.getInstance().getFluxMiningChance();
public static int getRank(Player player) {
return RankUtils.getRank(player, SubSkillType.SMELTING_UNDERSTANDING_THE_ART);
}
protected static int getResourceXp(ItemStack smelting) {
return mcMMO.getModManager().isCustomOre(smelting.getType()) ? mcMMO.getModManager().getBlock(smelting.getType()).getSmeltingXpGain() : ExperienceConfig.getInstance().getXp(PrimarySkillType.SMELTING, smelting.getType());
}
}

View File

@@ -1,18 +0,0 @@
package com.gmail.nossr50.core.skills.primary.acrobatics;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
public final class Acrobatics {
public static double dodgeDamageModifier = AdvancedConfig.getInstance().getDodgeDamageModifier();
public static int dodgeXpModifier = ExperienceConfig.getInstance().getDodgeXPModifier();
public static boolean dodgeLightningDisabled = MainConfig.getInstance().getDodgeLightningDisabled();
private Acrobatics() {
}
protected static double calculateModifiedDodgeDamage(double damage, double damageModifier) {
return Math.max(damage / damageModifier, 1.0);
}
}

Some files were not shown because too many files have changed in this diff Show More