mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2026-02-18 09:43:00 +01:00
Compare commits
148 Commits
1.12
...
1.13-suppo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b41637fbf8 | ||
|
|
7506646862 | ||
|
|
227fb49dec | ||
|
|
78fdfc1c35 | ||
|
|
0b26d6c72c | ||
|
|
cae722e8c7 | ||
|
|
0eed1a6c5a | ||
|
|
bbf7ce9c57 | ||
|
|
1fa21823a4 | ||
|
|
4b34299648 | ||
|
|
45841218e6 | ||
|
|
c509daff9f | ||
|
|
ce92329705 | ||
|
|
817b5364cf | ||
|
|
820c3260c8 | ||
|
|
54a1475fef | ||
|
|
bd0204a09e | ||
|
|
31c1bd52bc | ||
|
|
0f8c0f97d9 | ||
|
|
5a56b27ea8 | ||
|
|
273dfbbdce | ||
|
|
138b109ff5 | ||
|
|
908ac7c541 | ||
|
|
e7e13d990a | ||
|
|
ea9f79291e | ||
|
|
4b13cbeb43 | ||
|
|
d542098f8a | ||
|
|
f6e01ea910 | ||
|
|
2a053a0be2 | ||
|
|
b5cbfc7f66 | ||
|
|
8c0076ff80 | ||
|
|
6e3c2fcb76 | ||
|
|
33a68daa9c | ||
|
|
00cc5f0845 | ||
|
|
8b0a580505 | ||
|
|
87bf3a5b40 | ||
|
|
426b1304e2 | ||
|
|
f1204f8a2a | ||
|
|
f7b07899c1 | ||
|
|
e5de240eb4 | ||
|
|
0ba3d7bd68 | ||
|
|
79d5c6192f | ||
|
|
b8ae8438de | ||
|
|
974106f983 | ||
|
|
d599db2897 | ||
|
|
3f89f91f42 | ||
|
|
2fca0963d7 | ||
|
|
b63db1981c | ||
|
|
af744fa088 | ||
|
|
8538ac4e50 | ||
|
|
cabc5977d9 | ||
|
|
43dd382541 | ||
|
|
cdb81e961e | ||
|
|
51ced83301 | ||
|
|
09bca96af3 | ||
|
|
f1d9f787f4 | ||
|
|
b8b0be71b1 | ||
|
|
ac10261803 | ||
|
|
dc018be6bb | ||
|
|
832b653a88 | ||
|
|
1fddaf15cc | ||
|
|
b68feb6992 | ||
|
|
f3837265db | ||
|
|
ae551e17cd | ||
|
|
c6d055cb48 | ||
|
|
68e34d682c | ||
|
|
b125600dac | ||
|
|
57b31b60b3 | ||
|
|
7757e187be | ||
|
|
5ce360d443 | ||
|
|
d44b6e0afb | ||
|
|
629d882831 | ||
|
|
947018c0f1 | ||
|
|
ca2e1c11e6 | ||
|
|
69e5d3e1b5 | ||
|
|
b7d33f0227 | ||
|
|
28c7fdd4e2 | ||
|
|
53534e0f1d | ||
|
|
8d477a5cf5 | ||
|
|
74908cdcf5 | ||
|
|
39b22d0ee8 | ||
|
|
74e62ab08c | ||
|
|
f1cc745de8 | ||
|
|
7654e78fbe | ||
|
|
558c727136 | ||
|
|
18097fa1a5 | ||
|
|
e2b8d940d3 | ||
|
|
5093c37efb | ||
|
|
610e1a6bf4 | ||
|
|
99843f2735 | ||
|
|
732726bbd3 | ||
|
|
65687ca603 | ||
|
|
658382dba2 | ||
|
|
404a876d6b | ||
|
|
c4a383c4fb | ||
|
|
e0341f7ae7 | ||
|
|
018c6fc96b | ||
|
|
d324aa9589 | ||
|
|
cc1c73cb17 | ||
|
|
d6dc8bb04c | ||
|
|
88ef6b0984 | ||
|
|
624299602d | ||
|
|
8fe8db2353 | ||
|
|
159cf7c0d4 | ||
|
|
947cdc91a4 | ||
|
|
ff55cbb946 | ||
|
|
fdb151083d | ||
|
|
7a3d608f36 | ||
|
|
719283177e | ||
|
|
55fb3ed74f | ||
|
|
363ea66335 | ||
|
|
7ee65a7e65 | ||
|
|
aa25ba6338 | ||
|
|
b68bbad766 | ||
|
|
6d19239db7 | ||
|
|
faab64864a | ||
|
|
b1f4ea8cba | ||
|
|
df6315dd62 | ||
|
|
255f7bf335 | ||
|
|
ce6553d857 | ||
|
|
df1497924c | ||
|
|
aeed0cf6ad | ||
|
|
e40a7bb4e1 | ||
|
|
d59dbe7630 | ||
|
|
dece43429d | ||
|
|
14f900aa83 | ||
|
|
53848d3fd3 | ||
|
|
c8d95dc711 | ||
|
|
bb118607ce | ||
|
|
2d849f55e5 | ||
|
|
fef9058e16 | ||
|
|
e3d2526939 | ||
|
|
2f0a58b968 | ||
|
|
8994594ed4 | ||
|
|
bb46b2a6ac | ||
|
|
7296deb149 | ||
|
|
ef5cd3ec60 | ||
|
|
f9f6d1550e | ||
|
|
68e43e3641 | ||
|
|
93458aa355 | ||
|
|
e80e771e9d | ||
|
|
af9b631ee2 | ||
|
|
ca5a46508d | ||
|
|
7703cafa34 | ||
|
|
437fe29112 | ||
|
|
28b71804a2 | ||
|
|
6f15cd4005 | ||
|
|
ba88831c88 |
350
.gitignore
vendored
350
.gitignore
vendored
@@ -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
|
||||
|
||||
268
Changelog.txt
268
Changelog.txt
@@ -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
|
||||
|
||||
47
README.md
47
README.md
@@ -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
|
||||
[](https://github.com/com.gmail.nossr50)
|
||||
[](https://github.com/nossr50)
|
||||
|
||||
### Former Lead
|
||||
Other mcMMO Projects
|
||||
|
||||
### Classic Maintainer
|
||||
[](https://github.com/t00thpick1)
|
||||
|
||||
## Former Team Members
|
||||
|
||||
### Former Lead & Awesome guy
|
||||
[](https://github.com/gmcferrin)
|
||||
|
||||
### Developers
|
||||
### Former team members
|
||||
[](https://github.com/bm01)
|
||||
[](https://github.com/Glitchfinder)
|
||||
[](https://github.com/NuclearW)
|
||||
[](https://github.com/shatteredbeam)
|
||||
[](https://github.com/TfT-02)
|
||||
[](https://github.com/t00thpick1)
|
||||
[](https://github.com/riking)
|
||||
|
||||
### Special thanks
|
||||
[](https://github.com/EasyMFnE)
|
||||
Added the Alchemy skill
|
||||
[](https://github.com/TheYeti)
|
||||
|
||||
## Compiling
|
||||
|
||||
@@ -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/
|
||||
|
||||
139
build.gradle.kts
139
build.gradle.kts
@@ -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)
|
||||
@@ -1,8 +0,0 @@
|
||||
plugins {
|
||||
`kotlin-dsl`
|
||||
}
|
||||
|
||||
repositories {
|
||||
jcenter()
|
||||
}
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
@file:Suppress("MayBeConstant", "unused")
|
||||
|
||||
import org.gradle.api.Project
|
||||
|
||||
object Plugins {
|
||||
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
|
||||
|
||||
object FG2_3 {
|
||||
const val classpath = "net.minecraftforge.gradle:ForgeGradle:${Versions.fg23}"
|
||||
const val extensionName = "minecraft"
|
||||
const val id = "net.minecraftforge.gradle.forge"
|
||||
}
|
||||
}
|
||||
|
||||
object Repos {
|
||||
const val sk89q = "https://maven.sk89q.com/repo"
|
||||
// bStats
|
||||
const val bstats = "https://repo.codemc.org/repository/maven-public"
|
||||
// configurate
|
||||
const val sponge = "https://repo.spongepowered.org/maven/"
|
||||
const val spigot = "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
|
||||
const val sonatype = "https://oss.sonatype.org/content/repositories/snapshots"
|
||||
const val forge = "https://files.minecraftforge.net/maven/"
|
||||
}
|
||||
|
||||
object Config {
|
||||
|
||||
object Libs {
|
||||
const val configurate = "${Deps.Groups.sponge}:${Deps.Modules.configurate_yaml}:${Versions.configurate}"
|
||||
const val jdbc = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}:${Versions.jdbc}"
|
||||
const val juli = "${Deps.Groups.tomcat}:${Deps.Modules.juli}:${Versions.jdbc}"
|
||||
const val junitDep = "${Deps.Groups.junit}:${Deps.Modules.junit}:${Versions.junit}"
|
||||
const val flowmath = "${Deps.Groups.flowpowered}:${Deps.Modules.flowmath}:${Versions.flowmath}"
|
||||
|
||||
object Bukkit {
|
||||
object `1_8` {
|
||||
const val api = "$bukkit:${Versions.bukkit18}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit18}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit18}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit18}"
|
||||
// only legacy existed at this point, no core.
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg18}"
|
||||
}
|
||||
|
||||
object `1_12` {
|
||||
const val api = "$bukkit:${Versions.bukkit112}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit112}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit112}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit112}"
|
||||
// only legacy existed at this point, no core.
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg112}"
|
||||
}
|
||||
|
||||
object `1_13` {
|
||||
const val api = "$bukkit:${Versions.bukkit113}"
|
||||
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit113}"
|
||||
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit113}"
|
||||
const val nms = "$craftbukkit:${Versions.bukkit113}"
|
||||
const val wgCore = "${Bukkit.wgCore}:${Versions.wg113}"
|
||||
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg113}"
|
||||
}
|
||||
|
||||
const val bukkit = "${Deps.Groups.bukkit}:${Deps.Modules.bukkit}"
|
||||
const val craftbukkit = "${Deps.Groups.bukkit}:${Deps.Modules.craftbukkit}"
|
||||
const val wgCore = "${Deps.Groups.worldguard}:${Deps.Modules.wgCore}"
|
||||
const val wgLegacy = "${Deps.Groups.worldguard}:${Deps.Modules.wgLegacy}"
|
||||
const val spigotApi = "${Deps.Groups.spigot}:${Deps.Modules.spigotApi}"
|
||||
const val spigot = "${Deps.Groups.spigot}:${Deps.Modules.spigot}"
|
||||
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsBukit}:${Versions.bstats}"
|
||||
}
|
||||
|
||||
object Sponge {
|
||||
object API7 { // All of these are specific to the API7 module, API8 will change
|
||||
const val forgeGradleId = "net.minecraftforge.gradle.forge"
|
||||
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
|
||||
const val spongeGradleVersion = "0.9.0"
|
||||
const val api = "${Sponge.api}:${Versions.sapi7}"
|
||||
const val common = "${Sponge.common}:${Versions.spongeImpl7}"
|
||||
const val forge_version = "14.23.5.2768"
|
||||
const val minecraftVersion = "1.12.2-$forge_version"
|
||||
const val mappings = "snapshot_20180808"
|
||||
}
|
||||
|
||||
object Exclude {
|
||||
const val group = Deps.Groups.sponge
|
||||
const val module = Deps.Modules.spongeAPI
|
||||
}
|
||||
|
||||
const val api = "${Deps.Groups.sponge}:${Deps.Modules.spongeAPI}"
|
||||
const val common = "${Deps.Groups.sponge}:${Deps.Modules.spongecommon}"
|
||||
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsSponge}:${Versions.bstats}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
object Deps {
|
||||
object Groups {
|
||||
const val nossr = "com.gmail.nossr50"
|
||||
const val google = "com.google"
|
||||
const val guava = "com.google.guava"
|
||||
const val gson = "com.google.code.gson"
|
||||
const val yaml = "org.yaml"
|
||||
const val sk89q = "com.sk89q"
|
||||
const val apache = "org.apache"
|
||||
const val worldguard = "$sk89q.worldguard"
|
||||
const val worldedit = "$sk89q.worldedit"
|
||||
const val sponge = "org.spongepowered"
|
||||
const val spigot = "org.spigotmc"
|
||||
const val md5 = "net.md_5"
|
||||
const val bukkit = "org.bukkit"
|
||||
const val bstats = "org.bstats"
|
||||
const val tomcat = "org.apache.tomcat"
|
||||
const val junit = "junit"
|
||||
const val checker = "org.checkerframework"
|
||||
const val flowpowered = "com.flowpowered"
|
||||
}
|
||||
|
||||
object Modules {
|
||||
const val guava = "guava"
|
||||
const val gson = "gson"
|
||||
const val snakeyaml = "snakeyaml"
|
||||
const val wgCore = "worldguard-core"
|
||||
const val wgLegacy = "worldguard-legacy"
|
||||
const val bungeecordChat = "bungeecord-chat"
|
||||
const val spongeAPI = "spongeapi"
|
||||
const val spongecommon = "spongecommon"
|
||||
const val spongeforge = "spongeforge"
|
||||
const val spongevanilla = "spongevanilla"
|
||||
const val bukkit = "bukkit"
|
||||
const val craftbukkit = "craftbukkit"
|
||||
const val bstatsBukit = "bstats-bukkit"
|
||||
const val bstatsSponge = "bstats-sponge"
|
||||
const val spigotApi = "spigot-api"
|
||||
const val spigot = "spigot"
|
||||
const val configurate = "configurate"
|
||||
const val configurate_core = "${configurate}-core"
|
||||
const val configurate_yaml = "${configurate}-yaml"
|
||||
const val jdbc = "tomcat-jdbc"
|
||||
const val juli = "tomcat-juli"
|
||||
const val junit = "junit"
|
||||
const val checker = "checker-qual"
|
||||
const val flowmath = "flow-math"
|
||||
}
|
||||
}
|
||||
|
||||
object Projects {
|
||||
var core: Project? = null
|
||||
var bukkit: Project? = null
|
||||
var sponge: Project? = null
|
||||
}
|
||||
|
||||
object Shadow {
|
||||
object Origin {
|
||||
const val juli = "${Deps.Groups.apache}.juli"
|
||||
const val tomcat = "${Deps.Groups.apache}.tomcat"
|
||||
const val apache = "${Deps.Groups.apache}.commons.logging"
|
||||
const val bstatsBukkit = "${Deps.Groups.bstats}.bukkit"
|
||||
const val configurate = "ninja.leaping.configurate"
|
||||
const val checker = "org.checkerframework"
|
||||
}
|
||||
|
||||
object Target {
|
||||
const val juli = "${Deps.Groups.nossr}.database.tomcat.juli"
|
||||
const val tomcat = "${Deps.Groups.nossr}.database.tomcat"
|
||||
const val apache = "${Deps.Groups.nossr}.commons.logging"
|
||||
const val bstatsBukkit = "${Deps.Groups.nossr}.metrics.bstat"
|
||||
const val configurate = "${Deps.Groups.nossr}.${Deps.Modules.configurate}"
|
||||
const val checker = "${Deps.Groups.nossr}.${Deps.Modules.configurate}.checkerframework"
|
||||
}
|
||||
|
||||
object Exclude {
|
||||
const val tomcat = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}"
|
||||
const val juli = "${Deps.Groups.apache}:${Deps.Modules.juli}"
|
||||
const val guava = "${Deps.Groups.guava}:${Deps.Modules.guava}"
|
||||
const val snakeyaml = "${Deps.Groups.yaml}:${Deps.Modules.snakeyaml}"
|
||||
const val bukkit = Deps.Groups.bukkit
|
||||
const val spigot = Deps.Groups.spigot
|
||||
const val sk89q = "com.sk89q"
|
||||
const val wg = "$sk89q.worldguard"
|
||||
const val intake = "$sk89q.intake"
|
||||
const val flyway = "com.flywaydb"
|
||||
const val khelekore = "org.khelekore"
|
||||
const val findbugs = "com.google.code.findbugs"
|
||||
const val bstats = "${Deps.Groups.bstats}"
|
||||
|
||||
object ForgeGradle {
|
||||
const val dummyThing = "dummyThing"
|
||||
const val template = "Version.java.template"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
object Versions {
|
||||
const val configurate = "3.6" // Latest configurate
|
||||
const val flowmath = "1.0.4-SNAPSHOT"
|
||||
const val bukkit18 = "1.8.8-R0.1-SNAPSHOT" // Last bukkit 1.8.8
|
||||
const val bukkit112 = "1.12.2-R0.1-SNAPSHOT" // Last bukkit 1.12.2
|
||||
const val bukkit113 = "1.13.2-R0.1-SNAPSHOT" // Latest bukkit
|
||||
const val sapi7 = "7.1.0" // Latest SpongeAPI stable
|
||||
const val spongeImpl7 = "7.1.5" // Latest SpongeCommon stable
|
||||
const val jdbc = "7.0.52"
|
||||
const val junit = "4.12"
|
||||
const val fg23 = "2.3-SNAPSHOT" // ForgeGradle to support MC 1.12.2
|
||||
const val wg18 = "6.1.2" // Bukkit/CraftBukkit/Spigot 1.8.8 supported build, works on newer, but last one to support 1.8.8
|
||||
const val wg112 = "6.2" // Last WorldGuard to support 1.12
|
||||
const val wg113 = "7.0.0-SNAPSHOT" // Latest WorldGuard to support 1.13.2
|
||||
const val bstats = "1.4" // Supports all backwards compatible. Always relocated
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_12` as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts.
|
||||
|
||||
plugins {
|
||||
java // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.12.2
|
||||
compileOnly(Bukkit.nms) // CraftBukkit for 1.12.2
|
||||
compileOnly(Bukkit.wgLegacy) // WorldGuard for 1.12.2 bukkit
|
||||
|
||||
}
|
||||
@@ -1,106 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_12;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_12_R1.Chunk;
|
||||
import net.minecraft.server.v1_12_R1.EntityTypes;
|
||||
import net.minecraft.server.v1_12_R1.IBlockData;
|
||||
import net.minecraft.server.v1_12_R1.IBlockState;
|
||||
import net.minecraft.server.v1_12_R1.MinecraftKey;
|
||||
import net.minecraft.server.v1_12_R1.RegistryBlocks;
|
||||
import net.minecraft.server.v1_12_R1.RegistryMaterials;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.CraftChunk;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlockState;
|
||||
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
/**
|
||||
* Static reference to the block registry. Don't really care about the fact that
|
||||
* it is being stored as a reference here, but for imports reasons, it's smaller
|
||||
* line length makes it optimal to read for method usages.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_12_R1.Block> BLOCK_REGISTRY = net.minecraft.server.v1_12_R1.Block.REGISTRY;
|
||||
/**
|
||||
* We can keep track of block state id's by generating them on demand, i.e., when
|
||||
* they're being requested from Blocks, or BlockDatas.
|
||||
*/
|
||||
private static final RegistryMaterials<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final Chunk chunk = ((CraftChunk) block.getChunk()).getHandle();
|
||||
// Get the block state from the underlying chunk (stored by reference in CraftBlock)
|
||||
final IBlockData blockState = chunk.a(block.getX(), block.getY(), block.getZ());
|
||||
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
|
||||
final MinecraftKey key = BLOCK_REGISTRY.b(blockState.getBlock());
|
||||
return key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
|
||||
final net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
|
||||
// And then... well. we get the string id from the registry, based on the entity class to id mapping in EntityTypes.
|
||||
final MinecraftKey key = EntityTypes.a(nmsEntity);
|
||||
// If the key is null, well, we've got bigger problems...
|
||||
return key == null ? "minecraft:slime" : key.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Since we don't really want to trust what "BlockState" gives us, and the API doesn't give us anything but
|
||||
// what the API wants to give us, we have to dig into internals to get the true BlockState representation
|
||||
final CraftBlockState craftState = (CraftBlockState) block;
|
||||
// Because CraftBlock also stores the chunk reference, we can short cut in to use the chunk, instead of pinging
|
||||
// the chunk map on WorldServer
|
||||
final CraftChunk craftChunk = (CraftChunk) craftState.getChunk();
|
||||
// Then query for the block state from the chunk.
|
||||
final IBlockData nmsState = craftChunk.getHandle().a(block.getX(), block.getY(), block.getZ());
|
||||
// And then we're gucci
|
||||
final net.minecraft.server.v1_12_R1.Block nmsBlock = nmsState.getBlock();
|
||||
final MinecraftKey blockKey = BLOCK_REGISTRY.b(nmsBlock);
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.b(nmsState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.getKey();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.t();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
|
||||
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_13` as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import allows us to "import as" for shorthand
|
||||
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.13.2 - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.nms) // CraftBukkit-1.13.2-R0.1-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgCore) // WorldGuard-core - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgLegacy) // WorldGuard-legacy - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
}
|
||||
@@ -1,101 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_13;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_13_R2.EntityTypes;
|
||||
import net.minecraft.server.v1_13_R2.IBlockData;
|
||||
import net.minecraft.server.v1_13_R2.IBlockState;
|
||||
import net.minecraft.server.v1_13_R2.IRegistry;
|
||||
import net.minecraft.server.v1_13_R2.MinecraftKey;
|
||||
import net.minecraft.server.v1_13_R2.RegistryMaterials;
|
||||
import net.minecraft.server.v1_13_R2.WorldServer;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlockState;
|
||||
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
|
||||
private static final IRegistry<net.minecraft.server.v1_13_R2.Block> BLOCK_REGISTRY = IRegistry.BLOCK;
|
||||
private static final IRegistry<EntityTypes<?>> ENTITY_REGISTRY = IRegistry.ENTITY_TYPE;
|
||||
/**
|
||||
* We use {@link RegistryMaterials} because we don't want to default to another block state,
|
||||
* if a {@link IBlockData} is not registered, we need to generate an ID and register that key to
|
||||
* that {@link IBlockData}. By default, this should be populated during plugin startup by
|
||||
* calling some init method, but that will be determined later.
|
||||
*/
|
||||
private static final IRegistry<IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final WorldServer world = ((CraftBlock) block).getCraftWorld().getHandle();
|
||||
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
|
||||
final IBlockData blockState = world.getType(((CraftBlock) block).getPosition());
|
||||
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
|
||||
final MinecraftKey key = BLOCK_REGISTRY.getKey(blockState.getBlock());
|
||||
// Sometimes, there's a rare case with mods where the key is going to be null, but should never happen in bukkit/spigot.
|
||||
return key == null ? "minecraft:air" : key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
|
||||
final EntityTypes<?> entityType = ((CraftEntity) entity).getHandle().P();
|
||||
// And then... well. we get the string id from the registry!
|
||||
final MinecraftKey key = ENTITY_REGISTRY.getKey(entityType);
|
||||
// If the key is null, well, we've got bigger problems...
|
||||
return key == null ? "minecraft:slime" : key.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("Duplicates")
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
|
||||
// the world.
|
||||
final CraftBlockState craftState = (CraftBlockState) block;
|
||||
final IBlockData nmsState = craftState.getHandle();
|
||||
final net.minecraft.server.v1_13_R2.Block nmsBlock = nmsState.getBlock();
|
||||
final MinecraftKey blockKey = BLOCK_REGISTRY.getKey(nmsBlock);
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.getKey(nmsState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.getKey();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.getStateMap();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
|
||||
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
import Config.Libs.Bukkit.`1_8` as Bukkit
|
||||
|
||||
plugins {
|
||||
java
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Dependency inheritance is as follows
|
||||
- ":core", which provides
|
||||
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
|
||||
dependencies like guava and apache commons lang.
|
||||
- ":bukkit", which provides nothing on it's own, except the
|
||||
core bukkit classes that can be built on 1.13.2 API (which may change).
|
||||
It also defines all subprojects to depend on ":core", and ":bukkit",
|
||||
and bstats-bukkit.
|
||||
*/
|
||||
dependencies {
|
||||
compileOnly(Bukkit.api) // Bukkit API for 1.8.8 - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.nms) // CraftBukkit-1.8.8-R0.3-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
compileOnly(Bukkit.wgLegacy) // Old worldguard - Defined in <root>/buildSrc/src/main/java/Config.kt
|
||||
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
package com.gmail.nossr50.bukkit.v1_8;
|
||||
|
||||
import com.gmail.nossr50.VersionedHandler;
|
||||
import com.gmail.nossr50.mcMMO;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import net.minecraft.server.v1_8_R3.Blocks;
|
||||
import net.minecraft.server.v1_8_R3.EntityTypes;
|
||||
import net.minecraft.server.v1_8_R3.IBlockData;
|
||||
import net.minecraft.server.v1_8_R3.IBlockState;
|
||||
import net.minecraft.server.v1_8_R3.MinecraftKey;
|
||||
import net.minecraft.server.v1_8_R3.RegistryBlocks;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@SuppressWarnings({"unused", "Duplicates"}) // We use reflection to load this handler on 1.8 versions
|
||||
public class NmsHandler extends VersionedHandler {
|
||||
|
||||
/**
|
||||
* Static reference to the block registry. Don't really care about the fact that
|
||||
* it is being stored as a reference here, but for imports reasons, it's smaller
|
||||
* line length makes it optimal to read for method usages.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_8_R3.Block> BLOCK_REGISTRY = net.minecraft.server.v1_8_R3.Block.REGISTRY;
|
||||
/**
|
||||
* We can keep track of block state id's by generating them on demand, i.e., when
|
||||
* they're being requested from Blocks, or BlockDatas.
|
||||
*/
|
||||
private static final RegistryBlocks<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryBlocks<>(BLOCK_REGISTRY.c(Blocks.AIR)); // Default to AIR
|
||||
|
||||
NmsHandler(mcMMO plugin) {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Block block) {
|
||||
// We have to get the underlying nms block by the block, which might as well just be the type id.
|
||||
final net.minecraft.server.v1_8_R3.Block block1 = CraftMagicNumbers.getBlock(block);
|
||||
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
|
||||
final MinecraftKey key = BLOCK_REGISTRY.c(block1);
|
||||
return key.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(Entity entity) {
|
||||
// EntityTypes maintains the maps of Class<? extends nms.Entity> to String for id's and to numerical id numbers.
|
||||
// We of course are using the method that gets us the String id of the entity, such as "minecraft:creeper"
|
||||
return EntityTypes.b(((CraftEntity) entity).getHandle());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getIdFor(BlockState block) {
|
||||
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
|
||||
// the world.
|
||||
final net.minecraft.server.v1_8_R3.Block nmsBlock = net.minecraft.server.v1_8_R3.Block.REGISTRY.a(block.getTypeId());
|
||||
final MinecraftKey blockKey = net.minecraft.server.v1_8_R3.Block.REGISTRY.c(nmsBlock);
|
||||
final IBlockData blockState = nmsBlock.fromLegacyData(block.getRawData());
|
||||
// Now we can check if our blockstate registry actually has the block state.
|
||||
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.c(blockState);
|
||||
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
|
||||
return stateKey.toString();
|
||||
}
|
||||
// If not, well, it needs to have a key generated and registered.
|
||||
final String nameSpace = blockKey.a();
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append(blockKey.a()); // We only want to get the block id, not the domain id, since that's going to be appended later
|
||||
|
||||
// Get the full Property -> Value mapping for the block state
|
||||
final ImmutableMap<IBlockState, Comparable> properties = blockState.b();
|
||||
if (!properties.isEmpty()) {
|
||||
builder.append('[');
|
||||
Joiner joiner = Joiner.on(',');
|
||||
List<String> propertyValues = new ArrayList<>();
|
||||
for (Map.Entry<IBlockState, Comparable> entry : properties.entrySet()) {
|
||||
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
|
||||
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
|
||||
}
|
||||
builder.append(joiner.join(propertyValues));
|
||||
builder.append(']');
|
||||
}
|
||||
// Now we can make the MinecraftKey...
|
||||
final MinecraftKey newKey = new MinecraftKey(builder.toString());
|
||||
BLOCK_STATE_REGISTRY.a(newKey, blockState);
|
||||
return newKey.toString();
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.gmail.nossr50.platform.bukkit;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.craftbukkit.v1_8_R3.block.CraftBlock;
|
||||
|
||||
public class Testing18 {
|
||||
|
||||
Material material;
|
||||
|
||||
CraftBlock block;
|
||||
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import Config.Libs.Bukkit as Bukkit
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import as allows for shorthand.
|
||||
|
||||
val bukkit: Project = Projects.bukkit!! // Static project references
|
||||
val core: Project = Projects.core!! // Stored by Config.kt and created in <root>/build.gradle.kts
|
||||
|
||||
/* This configures ":bukkit" and it's dependent projects:
|
||||
- ":bukkit:1_8_8"
|
||||
- ":bukkit:1_12"
|
||||
- ":bukkit:1_13"
|
||||
Basically sets up all projects to depend on ":core" and
|
||||
bstats-bukkit. Also sets up shadow to relocate bukkit related
|
||||
packages to limit platform interference
|
||||
*/
|
||||
allprojects {
|
||||
|
||||
dependencies {
|
||||
compile(core) // includes junit for tests
|
||||
implementation(Bukkit.bstats) // Bukkit bstats
|
||||
}
|
||||
|
||||
// TODO dunno if this works yet... project needs to compile.
|
||||
val shadowJar by tasks.getting(ShadowJar::class) {
|
||||
// Relocate bstats for bukkit, as per requirement for bstats
|
||||
relocate(Shadow.Origin.bstatsBukkit, Shadow.Target.bstatsBukkit)
|
||||
// Relocate the bukkit platform classes of mcmmo so we don't
|
||||
// interfere with other platform classes (or core)
|
||||
relocate(Deps.Groups.nossr, "${Deps.Groups.nossr}.bukkit") {
|
||||
exclude("${Deps.Groups.nossr}.core")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Tells all subprojects of ":bukkit" (":bukkit:1_8_8", ":bukkit:1_12",etc.)
|
||||
// to depend on this project (":bukkit") to inherit the dependencies, and
|
||||
// does NOT inherit the same configurations (anything configured outside
|
||||
// here does not persist to child projects).
|
||||
subprojects {
|
||||
dependencies {
|
||||
// Provide the base bukkit plugin dependency for plugin classloading.
|
||||
// All "versioned" implementations will be properly classloaded by the bukkit parent
|
||||
compileOnly(bukkit)
|
||||
}
|
||||
}
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
dependencies {
|
||||
// Temporary dependencies while things are being moved.
|
||||
compileOnly(Bukkit.`1_13`.spigotApi) { // Spigot API for generic usage. Based on 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.api) { // Bukkit API for generic usage. Based on 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.wgCore) { // WorldGuard dependency, again, for 1.13.2
|
||||
isTransitive = true // We don't want the dependencies
|
||||
exclude(group = Shadow.Exclude.sk89q)
|
||||
exclude(group = Shadow.Exclude.intake, module = "intake")
|
||||
exclude(group = Shadow.Exclude.sk89q, module = "squirrelid")
|
||||
exclude(group = Shadow.Exclude.flyway)
|
||||
exclude(group = Shadow.Exclude.khelekore)
|
||||
exclude(group = Shadow.Exclude.findbugs)
|
||||
}
|
||||
compileOnly(Bukkit.`1_13`.wgLegacy) {
|
||||
isTransitive = true // We don't want the dependencies
|
||||
exclude(group = Shadow.Exclude.bukkit)
|
||||
exclude(group = Shadow.Exclude.sk89q, module = "commandbook")
|
||||
exclude(group = Shadow.Exclude.bstats)
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.gmail.nossr50;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
|
||||
public class BukkitBlockType {
|
||||
|
||||
private Material material;
|
||||
|
||||
private BlockData blockData;
|
||||
|
||||
}
|
||||
@@ -1,74 +0,0 @@
|
||||
package com.gmail.nossr50;
|
||||
|
||||
import com.sk89q.worldedit.extension.platform.NoCapablePlatformException;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.Entity;
|
||||
|
||||
public abstract class VersionedHandler {
|
||||
private static VersionedHandler instance;
|
||||
|
||||
private final mcMMO plugin;
|
||||
|
||||
protected VersionedHandler(mcMMO plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the string value id of the BlockType, note that this is not the
|
||||
* blockstate.
|
||||
*
|
||||
* Examples include: "minecraft:stone", "minecraft:chest", "thaumcraft:log2"
|
||||
* BlockStates are more specific like "minecraft:log[variant=oak,axis=x]"
|
||||
*
|
||||
* This should be casting down and retrieving the id from the block registry maintained by vanilla.
|
||||
*
|
||||
* @param block The block instance (holds byte/numerical id or sometimes block state in newer versions)
|
||||
* @return The string id of the block type
|
||||
*/
|
||||
public abstract String getIdFor(Block block);
|
||||
|
||||
/**
|
||||
* Gets the string value id of the Entity, much like blocks, this is not
|
||||
* the full string representation of the entity, just the string id of the
|
||||
* TYPE.
|
||||
*
|
||||
* Examples include: "minecraft:creeeper", "minecraft:sheep", "thaumcraft:wisp"
|
||||
*
|
||||
* @param entity The entity instance
|
||||
* @return The string id of the entity's registered type.
|
||||
*/
|
||||
public abstract String getIdFor(Entity entity);
|
||||
|
||||
// Technically can be TileEntity snapshot references as well.
|
||||
public abstract String getIdFor(BlockState block);
|
||||
|
||||
/**
|
||||
* Gets the {@link VersionedHandler} instance for this running platform.
|
||||
* Note that all the handler does is perform various operations necessitated
|
||||
* by either a lack of, or bridging an implementation of some API/core aspects
|
||||
* that are not available through Bukkit API (like getting BlockType id's, or
|
||||
* BlockState id's).
|
||||
*
|
||||
* @param plugin The mcmmo plugin
|
||||
* @return The version handler instance
|
||||
*/
|
||||
public VersionedHandler getInstance(mcMMO plugin) {
|
||||
if (instance == null) {
|
||||
final String serverPackage = mcMMO.p.getServer().getClass().getPackage().getName();
|
||||
final String serverVersion = serverPackage.substring(serverPackage.lastIndexOf(".") + 1);
|
||||
try {
|
||||
final Class<?> clazz = Class.forName("com.gmail.nossr50.bukkit." + serverVersion + ".NmsHandler");
|
||||
if (VersionedHandler.class.isAssignableFrom(clazz)) {
|
||||
instance = (VersionedHandler) clazz.getConstructor(mcMMO.class).newInstance(plugin);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
throw new NoCapablePlatformException("Could not discover a valid mcMMO VersionedHandler for version:" + serverVersion);
|
||||
}
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -1,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
|
||||
@@ -1,938 +0,0 @@
|
||||
# de locale file v0.1
|
||||
# -----------------
|
||||
# Setting up a new standard for string names, for easier localization.
|
||||
# SkillName.SubType.LocalEffect.Increment
|
||||
# Skill name, such as ACROBATICS, MINING.
|
||||
# Sub-type, such as EFFECT, ABILITY, COMBAT.
|
||||
# Local Effect, local text for Skill Name; ACROBATICS_ROLL, IGNITIONTIME,GRACECHANCE.
|
||||
# Increment, for multi-line or array-like lists.
|
||||
# ######
|
||||
#
|
||||
# EXAMPLES:
|
||||
#
|
||||
# Acrobatics.Ability.Proc
|
||||
# Axes.Ability.Refresh.1
|
||||
#
|
||||
#Changelog to locale_de:
|
||||
#-Added Alchemy Skill
|
||||
#-Added Archery Effect 3
|
||||
#-Added Axes.Combat.SS.Struck
|
||||
#-Added multiple Fishing-Skill translations
|
||||
#-Added multiple Herbalism-Skill translations
|
||||
#-Added Mining.Blast.Effect
|
||||
#-Salvage aus Repair herausgenommen
|
||||
#-Added missing Swords.Effect skills
|
||||
#-Added horses and holy hound to taming
|
||||
#-Added Unarmed.SubSkillType.IronGrip.Description
|
||||
#-Added Smelting
|
||||
#Commands.addlevels
|
||||
#Everything except parties translated to German
|
||||
#Giga Bohrhammer in Giga Bohrer umbenannt.
|
||||
#Added Guides.Smelting.Section.1
|
||||
# --Lumis31
|
||||
#ACROBATICS
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**Grazi\u00f6s Abgerollt**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Ausgewichen**
|
||||
Acrobatics.DodgeChance=Ausweich-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.Name=Rolle
|
||||
Acrobatics.SubSkill.Roll.Description=Reduziert oder negiert Fall-Schaden
|
||||
Acrobatics.SubSkill.GracefulRoll.Name=Grazi\u00f6se Rolle
|
||||
Acrobatics.SubSkill.GracefulRoll.Description=Doppelte Effektivit\u00e4t der Rolle
|
||||
Acrobatics.SubSkill.Dodge.Name=Ausweichen
|
||||
Acrobatics.SubSkill.Dodge.Description=Halbiert Angriffschaden
|
||||
Acrobatics.Listener=Akrobatik:
|
||||
Acrobatics.SubSkill.Roll.Chance=Rolle-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.SubSkill.Roll.GraceChance=Grazi\u00f6se Rolle-Chance: [[YELLOW]]{0}
|
||||
Acrobatics.Roll.Text=**Abgerollt**
|
||||
Acrobatics.SkillName=AKROBATIK
|
||||
Acrobatics.Skillup=Akrobatik Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ALCHEMY
|
||||
Alchemy.SubSkill.Catalysis.Name=Katalyse
|
||||
Alchemy.SubSkill.Catalysis.Description=Erh\u00F6ht die Braugeschwindigkeit
|
||||
Alchemy.SubSkill.Concoctions.Name=Braukunst
|
||||
Alchemy.SubSkill.Concoctions.Description=Braue Tr\u00E4nke mit mehr Zutaten
|
||||
Alchemy.Listener=Alchemie:
|
||||
Alchemy.Ability.Locked.0=GESPERRT bis Skill {0}+ (KATALYSE)
|
||||
Alchemy.Catalysis.Speed=Braugeschwindigkeit: [[YELLOW]]{0}
|
||||
Alchemy.Concoctions.Rank=Braukunst Rang: [[YELLOW]]{0}/{1}
|
||||
Alchemy.Concoctions.Ingredients=Zutaten [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
|
||||
Alchemy.SkillName=ALCHEMIE
|
||||
Alchemy.Skillup=Alchemie Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ARCHERY
|
||||
Archery.Combat.DazeChance=Chance auf Bet\u00e4ubung: [[YELLOW]]{0}
|
||||
Archery.Combat.RetrieveChance=Chance auf Pfeil-R\u00fcckgewinnung: [[YELLOW]]{0}
|
||||
Archery.Combat.SkillshotBonus=Kunstschuss Zusatzschaden: [[YELLOW]]{0}
|
||||
Archery.SubSkill.SkillShot.Name=Kunstschuss
|
||||
Archery.SubSkill.SkillShot.Description=Erh\u00f6ht Schaden vom Bogen
|
||||
Archery.SubSkill.Daze.Name=Bet\u00e4ubung (Spieler)
|
||||
Archery.SubSkill.Daze.Description=Verwirrt Feinde und f\u00FCgt {0} Schaden zu
|
||||
Archery.SubSkill.ArrowRetrieval.Name=Pfeil-R\u00fcckgewinnung
|
||||
Archery.SubSkill.ArrowRetrieval.Description=Chance auf Pfeil-R\u00fcckgewinnung von Leichen
|
||||
Archery.Listener=Bogen:
|
||||
Archery.SkillName=BOGEN
|
||||
Archery.Skillup=Bogenschie\u00DFen Fertigkeit ist um {0} gestiegen. Gesamt ({1})
|
||||
#AXES
|
||||
Axes.Ability.Bonus.0=Axt-Beherrschung
|
||||
Axes.Ability.Bonus.1={0} Zusatz-Schaden
|
||||
Axes.Ability.Bonus.2=Wucht
|
||||
Axes.Ability.Bonus.3=Verursacht {0} Zusatz-Schaden gegen R\u00fcstung
|
||||
Axes.Ability.Bonus.4=Wucht-Schlag
|
||||
Axes.Ability.Bonus.5=Verursacht {0} Zusatz-Schaden gegen ungepanzerte Feinde
|
||||
Axes.Ability.Lower=[[GRAY]]**Du senkst deine Axt**
|
||||
Axes.Ability.Ready=[[GREEN]]**Deine Axt ist bereit**
|
||||
Axes.Combat.CritStruck=[[DARK_RED]]Du wurdest KRITISCH getroffen!
|
||||
Axes.Combat.CritChance=Chance auf kritischen Treffer: [[YELLOW]]{0}
|
||||
Axes.Combat.CriticalHit=KRITISCHER TREFFER!
|
||||
Axes.Combat.GI.Proc=[[GREEN]]**AUSGESCHALTET durch GEWALT SCHLAG**
|
||||
Axes.Combat.GI.Struck=**Von WUCHT-SCHLAG getroffen**
|
||||
Axes.Combat.SS.Struck=[[DARK_RED]]vom Sch\u00E4delspalter getroffen!
|
||||
Axes.Combat.SS.Length=Sch\u00e4del-Spalter Dauer: [[YELLOW]]{0}s
|
||||
Axes.SubSkill.SkullSplitter.Name=Sch\u00e4del-Spalter (F\u00e4higkeit)
|
||||
Axes.SubSkill.SkullSplitter.Description=Verursacht Umgebungsschaden
|
||||
Axes.SubSkill.CriticalStrikes.Name=Kritische Treffer
|
||||
Axes.SubSkill.CriticalStrikes.Description=Doppelter Schaden
|
||||
Axes.SubSkill.AxeMastery.Name=Axt-Beherrschung
|
||||
Axes.SubSkill.AxeMastery.Description=Verursacht Bonus-Schaden
|
||||
Axes.SubSkill.ArmorImpact.Name=Wucht
|
||||
Axes.SubSkill.ArmorImpact.Description=Treffe mit gen\u00fcgend Gewalt zum R\u00fcstung zerschmettern
|
||||
Axes.SubSkill.GreaterImpact.Name=Wucht-Schlag
|
||||
Axes.SubSkill.GreaterImpact.Description=Zusatz-Schaden gegen ungepanzerte Feinde
|
||||
Axes.Listener=Axt:
|
||||
Axes.SkillName=AXT
|
||||
Axes.Skills.SS.Off=**Sch\u00e4del-Spalter abgenutzt**
|
||||
Axes.Skills.SS.On=[[GREEN]]**Sch\u00e4del-Spalter AKTIVIERT**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]Dein [[YELLOW]]Sch\u00e4del-Spalter [[GREEN]]ist wieder bereit!
|
||||
Axes.Skills.SS.Other.Off={0}s [[RED]]Sch\u00e4del-Spalter[[GREEN]] ist [[GREEN]]abgenutzt
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Sch\u00e4del-Spalter!
|
||||
Axes.Skillup=Axt Skill um {0} gestiegen. Gesamt ({1})
|
||||
#EXCAVATION
|
||||
Excavation.Ability.Lower=[[GRAY]]**Du senkst deine SCHAUFEL**
|
||||
Excavation.Ability.Ready=[[GREEN]]**Deine SCHAUFEL ist bereit**
|
||||
Excavation.SubSkill.GigaDrillBreaker.Name=Giga Bohrhammer (F\u00e4higkeit)
|
||||
Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Geschwindigkeit
|
||||
Excavation.SubSkill.TreasureHunter.Name=Schatz-J\u00e4ger
|
||||
Excavation.SubSkill.TreasureHunter.Description=F\u00e4higkeit nach Sch\u00e4tzen zu graben
|
||||
Excavation.Effect.Length=Giga Bohrhammer Dauer: [[YELLOW]]{0}s
|
||||
Excavation.Listener=Graben:
|
||||
Excavation.SkillName=GRABEN
|
||||
Excavation.Skills.GigaDrillBreaker.Off=**Giga Bohrer ausgelaufen**
|
||||
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**Giga Bohrer AKTIVIERT**
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Dein [[YELLOW]]Giga Bohrer [[GREEN]]ist wieder bereit!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.Off={0}s [[RED]]Giga Bohrer[[GREEN]] ist [[GREEN]]ausgelaufen
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Giga Bohrer!
|
||||
Excavation.Skillup=Graben Skill um {0} gestiegen. Gesamt ({1})
|
||||
#FISHING
|
||||
Fishing.Ability.Chance=Anbei\u00DFwahrscheinlichkeit: [[YELLOW]]{0}
|
||||
Fishing.Ability.Info=Zauber-J\u00e4ger: [[GRAY]] **Verbessert sich mit Schatz-J\u00e4ger Rang**
|
||||
Fishing.Ability.Locked.0=GESPERRT bis Skill {0}+ (Rei\u00DFen)
|
||||
Fishing.Ability.Locked.1=GESPERRT bis Skill {0}+ (Eisangeln)
|
||||
Fishing.Ability.Locked.2=GESPERRT bis Skill {0}+ (Profiangel)
|
||||
Fishing.Ability.Rank=Schatz-J\u00e4ger Rang: [[YELLOW]]{0}/{1}
|
||||
Fishing.Ability.TH.DropRate=Drop Rate: [[DARK_RED]]Falle: [[YELLOW]]{0} [[GRAY]]Oft: [[YELLOW]]{1} [[GREEN]]Gelegentlich: [[YELLOW]]{2}\n[[BLUE]]Au\u00DFergew\u00F6hnlich: [[YELLOW]]{3} [[LIGHT_PURPLE]]Selten: [[YELLOW]]{4} [[GOLD]]Schatz: [[YELLOW]]{5} [[AQUA]]Schallplatte: [[YELLOW]]{6}
|
||||
Fishing.Ability.TH.MagicRate=Zauber-J\u00e4ger Chance: [[YELLOW]]{0}
|
||||
Fishing.Ability.Shake=Rei\u00DFen-Chance: [[YELLOW]]{0}
|
||||
Fishing.Ability.IceFishing=Eisangeln: Angeln im Eis
|
||||
Fishing.Ability.FD=Fischer-Mahlzeit Rang: [[YELLOW]]{0}
|
||||
Fishing.SubSkill.TreasureHunter.Name=Schatz-J\u00e4ger (Passiv)
|
||||
Fishing.SubSkill.TreasureHunter.Description=Angle verschiedene Objekte
|
||||
Fishing.SubSkill.MagicHunter.Name=Zauber-J\u00e4ger
|
||||
Fishing.SubSkill.MagicHunter.Description=Finde verzauberte Gegenst\u00e4nde
|
||||
Fishing.SubSkill.Shake.Name=Rei\u00DFen
|
||||
Fishing.SubSkill.Shake.Description=Rei\u00DFe per Angel Gegenst\u00e4nde aus den Mobs
|
||||
Fishing.SubSkill.FishermansDiet.Name=Fischer-Mahlzeit
|
||||
Fishing.SubSkill.FishermansDiet.Description=Verbessert Effizienz von geangelter Nahrung
|
||||
Fishing.SubSkill.MasterAngler.Name=Profiangel
|
||||
Fishing.SubSkill.MasterAngler.Description=Erh\u00F6ht die Chance des Anbei\u00DFens
|
||||
Fishing.SubSkill.IceFishing.Name=Eisangeln
|
||||
Fishing.SubSkill.IceFishing.Description=Erm\u00F6glicht dir in Eisbiomen angeln zu gehen
|
||||
Fishing.Chance.Raining=[[BLUE]] Regen Bonus
|
||||
Fishing.Listener=Angeln:
|
||||
Fishing.Ability.TH.MagicFound=[[AQUA]]Dich ber\u00fchrt ein leichter Zauber bei diesem Fang...
|
||||
Fishing.Ability.TH.Boom=[[GRAY]]KARPADOR SETZT PLATSCHER EIN!!!
|
||||
Fishing.Ability.TH.Poison=[[GRAY]]Hier stinkt etwas...
|
||||
Fishing.SkillName=ANGELN
|
||||
Fishing.Skillup=Angel Skill um {0} gestiegen. Gesamt ({1})
|
||||
#HERBALISM
|
||||
Herbalism.Ability.DoubleDropChance=Chance auf Doppel-Drops: [[YELLOW]]{0}
|
||||
Herbalism.Ability.FD=Bauernfr\u00fchst\u00fcck: [[YELLOW]]Stufe {0}
|
||||
Herbalism.Ability.GTe.Length=Gr\u00fcnes Land Dauer: [[YELLOW]]{0}s
|
||||
Herbalism.Ability.GTe.NeedMore=Du brauchst mehr Samen um Gr\u00FCnes Land zu verbreiten.
|
||||
Herbalism.Ability.GTh.Chance=Gr\u00fcner Daumen Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.GTh.Fail=**Gr\u00fcner Daumen GESCHEITERT**
|
||||
Herbalism.Ability.GTh.Stage=Gr\u00fcner Daumen Stufe: [[YELLOW]] Weizen w\u00e4chst auf Stufe {0}
|
||||
Herbalism.Ability.GTh=[[GREEN]]**GR\u00dcNER DAUMEN**
|
||||
Herbalism.Ability.HylianLuck=Hylians Gl\u00fccks Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.Lower=[[GRAY]]**Du senkst deine HARKE**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**Deine HARKE ist bereit**
|
||||
Herbalism.Ability.ShroomThumb.Chance=Gr\u00FCne Zehe Chance: [[YELLOW]]{0}
|
||||
Herbalism.Ability.ShroomThumb.Fail=**GR\u00DCNE ZEHE GESCHEITERT**
|
||||
Herbalism.SubSkill.GreenTerra.Name=Gr\u00fcnes Land (F\u00e4higkeit)
|
||||
Herbalism.SubSkill.GreenTerra.Description=Erte das Land ab, 3x Drops
|
||||
Herbalism.SubSkill.GreenThumb.Name=Gr\u00fcner Daumen (Weizen)
|
||||
Herbalism.SubSkill.GreenThumb.Description=Auto-Saat, s\u00e4ht Weizen wenn abgeerntet
|
||||
Herbalism.SubSkill.GreenThumb.Description.2=Bemoost Steinziegel , l\u00e4sst Gras wachsen
|
||||
Herbalism.SubSkill.FarmersDiet.Name=Bauernfr\u00fchst\u00fcck
|
||||
Herbalism.SubSkill.FarmersDiet.Description=Erh\u00f6ht Effektivit\u00e4t von geernteter Nahrung
|
||||
Herbalism.SubSkill.DoubleDrops.Name=Doppel Drops (Alle Pflanzen)
|
||||
Herbalism.SubSkill.DoubleDrops.Description=Verdoppelt die normale Ausbeute (Loot)
|
||||
Herbalism.SubSkill.HylianLuck.Name=Hylian Gl\u00fcck
|
||||
Herbalism.SubSkill.HylianLuck.Description=Gibt eine kleine M\u00f6glichkeit, seltene Gegenst\u00e4nde zu finden
|
||||
Herbalism.SubSkill.ShroomThumb.Name=Pilz Zehe
|
||||
Herbalism.SubSkill.ShroomThumb.Description=Verbreite Myzel auf Gras und Erde
|
||||
Herbalism.HylianLuck=[[GREEN]]Heute ist das Gl\u00fcck von Hyrule mit dir!
|
||||
Herbalism.Listener=Pflanzenkunde:
|
||||
Herbalism.SkillName=PFLANZENKUNDE
|
||||
Herbalism.Skills.GTe.Off=**Gr\u00fcnes Land ist ausgelaufen**
|
||||
Herbalism.Skills.GTe.On=[[GREEN]]**Gr\u00fcnes Land AKTIVIERT**
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]Deine [[YELLOW]]Gr\u00fcnes Land [[GREEN]]F\u00e4higkeit ist wieder bereit!
|
||||
Herbalism.Skills.GTe.Other.Off={0}s [[RED]]Gr\u00fcnes Land[[GREEN]] ist [[GREEN]]ausgelaufen.
|
||||
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Gr\u00fcnes Land!
|
||||
Herbalism.Skillup=Pflanzenkunde Skill um {0} gestiegen. Gesamt ({1})
|
||||
#MINING
|
||||
Mining.Ability.Length=Super-Brecher Dauer: [[YELLOW]]{0}s
|
||||
Mining.Ability.Locked.0=GESPERRT bis Skill {0}+ (Z\u00fcndstoff)
|
||||
Mining.Ability.Locked.1=GESPERRT bis Skill {0}+ (Sprengmeister)
|
||||
Mining.Ability.Locked.2=GESPERRT bis Skill {0}+ (Explosions-Experte)
|
||||
Mining.Ability.Lower=[[GRAY]]**Du senkst deine SPITZHACKE**
|
||||
Mining.Ability.Ready=[[GREEN]]**Deine SPITZHACKE ist bereit**
|
||||
Mining.SubSkill.SuperBreaker.Name=Super-Brecher (F\u00e4higkeit)
|
||||
Mining.SubSkill.SuperBreaker.Description=Abbaugeschwindigkeit+, Dreifach-Drop Chance
|
||||
Mining.SubSkill.DoubleDrops.Name=Doppel Drops
|
||||
Mining.SubSkill.DoubleDrops.Description=Verdoppelt die normale Ausbeute
|
||||
Mining.SubSkill.BlastMining.Name=Z\u00fcndstoff
|
||||
Mining.SubSkill.BlastMining.Description=Bonus beim Abbaue mit TNT
|
||||
Mining.SubSkill.BiggerBombs.Name=Sprengmeister
|
||||
Mining.SubSkill.BiggerBombs.Description=Erh\u00f6ht den Explosions-Radius
|
||||
Mining.SubSkill.DemolitionsExpertise.Name=Explosions-Experte
|
||||
Mining.SubSkill.DemolitionsExpertise.Description=Reduziert die Verletzung durch TNT Explosionen
|
||||
Mining.Effect.Decrease=Explosions-Experte Schadensreduzierung: [[YELLOW]]{0}
|
||||
Mining.Effect.DropChance=Doppel Drop Chance: [[YELLOW]]{0}
|
||||
Mining.Listener=Bergbau:
|
||||
Mining.SkillName=BERGBAU
|
||||
Mining.Skills.SuperBreaker.Off=**Super-Brecher ist ausgelaufen**
|
||||
Mining.Skills.SuperBreaker.On=[[GREEN]]**Super-Brecher AKTIVIERT**
|
||||
Mining.Skills.SuperBreaker.Other.Off={0}s [[RED]]Super-Brecher[[GREEN]] ist [[GREEN]]ausgelaufen.
|
||||
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Super-Brecher!
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Dein [[YELLOW]]Super-Brecher [[GREEN]]ist wieder bereit!
|
||||
Mining.Skillup=Bergbau Fertigkeit ist um {0} gestiegen. Gesamt ({1})
|
||||
#Blast Mining
|
||||
Mining.Blast.Boom=[[GRAY]]**BOOM**
|
||||
Mining.Blast.Effect=+{0} Erze -{1} Schutt, {2}x Drops
|
||||
Mining.Blast.Radius.Increase=Z\u00fcndstoff Radius Erh\u00f6hung: [[YELLOW]]+{0}
|
||||
Mining.Blast.Rank=Z\u00fcndstoff Rang:[[YELLOW]] {0}/8 [[GRAY]]({1})
|
||||
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Z\u00fcndstoff!
|
||||
Mining.Blast.Refresh=[[GREEN]]Dein [[YELLOW]]Z\u00fcndstoff [[GREEN]]ist wieder bereit!
|
||||
#REPAIR
|
||||
Repair.SubSkill.Repair.Name=Reparatur
|
||||
Repair.SubSkill.Repair.Description=Repariere Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.GoldRepair.Name=Gold Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.GoldRepair.Description=Repariere Gold-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.IronRepair.Name=Eisen Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.IronRepair.Description=Repariere Eisen-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.StoneRepair.Name=Stein Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.StoneRepair.Description=Repariere Stein-Werkzeuge
|
||||
Repair.SubSkill.RepairMastery.Name=Reparatur Meister
|
||||
Repair.SubSkill.RepairMastery.Description=Erh\u00f6ht den Reparatur-Wert
|
||||
Repair.SubSkill.SuperRepair.Name=Super-Reparatur
|
||||
Repair.SubSkill.SuperRepair.Description=Doppelte Effektivit\u00e4t
|
||||
Repair.SubSkill.DiamondRepair.Name=Diamant Reparatur ({0}+ SKILL)
|
||||
Repair.SubSkill.DiamondRepair.Description=Repariere Diamant-Werkzeuge & R\u00fcstung
|
||||
Repair.SubSkill.ArcaneForging.Name=Arkanes Schmieden
|
||||
Repair.SubSkill.ArcaneForging.Description=Repariere magische Gegenst\u00e4nde
|
||||
Repair.Error=[[DARK_RED]]mcMMO ist beim Versuch dieses Item zu reparieren auf einen Fehler gesto\u00DFen!
|
||||
Repair.Listener.Anvil=[[DARK_RED]]Du hast einen Amboss platziert, Ambosse k\u00f6nnen Waffen und R\u00fcstung reparieren.
|
||||
Repair.Listener=Reparatur:
|
||||
Repair.SkillName=REPARATUR
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Diamant zu reparieren.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Gold zu reparieren.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Eisen zu reparieren
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Du hast nicht gen\u00fcgend Level um Stein zu reparieren
|
||||
Repair.Skills.Adept=Du ben\u00f6tigst Level [[YELLOW]]{0}[[RED]] um [[YELLOW]]{1} zu reparieren.
|
||||
Repair.Skills.FeltEasy=[[GRAY]]Das f\u00fchlte sich einfach an.
|
||||
Repair.Skills.FullDurability=[[GRAY]]Dieser Gegenstand hat volle Haltbarkeit.
|
||||
Repair.Skills.Mastery=Reparatur-Meister: [[YELLOW]]{0} Zusatz-Haltbarkeit.
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]Du kannst keine gestapelten Gegenst\u00e4nde reparieren.
|
||||
Repair.Skills.Super.Chance=Super-Reparatur Chance: [[YELLOW]]{0}
|
||||
Repair.Skillup=Reparatur Skill um {0} gestiegen. Gesamt ({1})
|
||||
Repair.Pretty.Name=Reparatur
|
||||
#Arcane Forging
|
||||
Repair.Arcane.Chance.Downgrade=[[GRAY]]AS Verminderungs Chance: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]AS Erfolgs-Rate: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Downgrade=Zauber-Wert des Gegenstands vermindert.
|
||||
Repair.Arcane.Fail=Der Gegenstands wurde entzaubert.
|
||||
Repair.Arcane.Lost=Du hast nicht gen\u00fcgend Skill um Verzauberungen zu erhalten.
|
||||
Repair.Arcane.Perfect=[[GREEN]]Du hast den Zauber-Wert des Gegenstands erhalten.
|
||||
Repair.Arcane.Rank=Arkanes Schmieden Rang: [[YELLOW]]{0}/{1}
|
||||
#SALVAGE
|
||||
Salvage.Pretty.Name=Verwerten
|
||||
Salvage.SubSkill.AdvancedSalvage.Name=Fortgeschrittenes Verwerten
|
||||
Salvage.SubSkill.AdvancedSalvage.Description=Verwerte besch\u00E4digte Items
|
||||
Salvage.SubSkill.ArcaneSalvaging.Name=Arkanes Verwerten
|
||||
Salvage.SubSkill.ArcaneSalvaging.Description=Extra Verzauberung aus Items
|
||||
Salvage.Ability.Locked.0=GESPERRT bis Skill {0}+ (Fortgeschrittenes Verwerten)
|
||||
Salvage.Ability.Bonus.0=Fortgeschrittenes Verwerten
|
||||
Salvage.Ability.Bonus.1=Max Ertrag {0} Item zerst\u00F6rt
|
||||
Salvage.Arcane.Rank=Arkanes Verwerten: [[YELLOW]]Rang {0}/{1}
|
||||
Salvage.Arcane.ExtractFull=[[GRAY]]Verwerten: Gesamte Verzauberung Wahrscheinlichkeit
|
||||
Salvage.Arcane.ExtractPartial=[[GRAY]]Verwerten: Teil-Verzauberung Wahrscheinlichkeit
|
||||
Salvage.Skills.Success=[[GREEN]]Item verwertet!
|
||||
Salvage.Skills.Adept.Damaged=[[DARK_RED]]Deine F\u00E4higkeit ist nicht hoch genug um besch\u00E4digte Items zu verwerten.
|
||||
Salvage.Skills.Adept.Level=Du musst Level [[YELLOW]]{0}[[RED]] sein um [[YELLOW]]{1} [[RED]] zu verwerten.
|
||||
Salvage.Skills.TooDamaged=[[DARK_RED]]Das Item ist zu besch\u00E4digt um verwertet zu werden.
|
||||
Salvage.Skills.ArcaneFailed=Es ist dir nicht gelungen das Wissen aus diesem Item zu extrahieren.
|
||||
Salvage.Skills.ArcanePartial=Es ist dir gelungen ein bisschen Wissen zu extrahieren.
|
||||
Salvage.Skills.ArcaneSuccess=[[GREEN]]Du konntest alles Wissen aus diesem Item extrahieren!
|
||||
Salvage.Listener.Anvil=[[DARK_RED]]Du hast einen Verwertungs-Amboss platziert, benutze ihn um Werkzeuge und R\u00FCstung zu verwerten.
|
||||
Salvage.Listener=Verwerten:
|
||||
Salvage.SkillName=VERWERTEN
|
||||
#SWORDS
|
||||
Swords.Ability.Lower=[[GRAY]]**Du senkst dein SCHWERT**
|
||||
Swords.Ability.Ready=[[GREEN]]**Dein SCHWERT ist bereit**
|
||||
Swords.Combat.Bleed.Chance=Blutungs Chance: [[YELLOW]]{0}
|
||||
Swords.Combat.Bleed.Length=Blutungs Dauer: [[YELLOW]]{0} Ticks
|
||||
Swords.Combat.Bleed.Note=[[GRAY]]Info: [[YELLOW]]1 Tick tritt alle 2 Sekunden ein.
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] Du blutest!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]Das Bluten hat [[GREEN]]aufgeh\u00f6rt[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**GEGNER BLUTET**
|
||||
Swords.Combat.Counter.Chance=Gegenangriff Chance: [[YELLOW]]{0}
|
||||
Swords.Combat.Counter.Hit=[[DARK_RED]]Treffer durch Gegenangriff!
|
||||
Swords.Combat.Countered=[[GREEN]]**GEGENANGRIFF**
|
||||
Swords.Combat.SS.Struck=[[DARK_RED]]Getroffen von S\u00c4GEZAHNSCHLAG!
|
||||
Swords.SubSkill.CounterAttack.Name=Gegenangriff
|
||||
Swords.SubSkill.CounterAttack.Description=Reflektiere {0} des Schadens w\u00E4hrend du blockierst
|
||||
Swords.SubSkill.SerratedStrikes.Name=S\u00e4gezahnschlag (F\u00e4higkeit)
|
||||
Swords.SubSkill.SerratedStrikes.Description={0} Fl\u00E4chenschaden, Fl\u00E4chenblutung+
|
||||
Swords.Effect.4=S\u00e4gezahnschlag, Blutung+
|
||||
Swords.Effect.5={0} Ticks Blutung
|
||||
Swords.SubSkill.Bleed.Name=Blutung
|
||||
Swords.SubSkill.Bleed.Description=Verursacht Blutungsschaden \u00fcber Zeit
|
||||
Swords.Listener=Schwert:
|
||||
Swords.SkillName=SCHWERT
|
||||
Swords.Skills.SS.Off=**S\u00e4gezahnschlag abgenutzt**
|
||||
Swords.Skills.SS.On=[[GREEN]]**S\u00e4gezahnschlag AKTIVIERT**
|
||||
Swords.Skills.SS.Refresh=[[GREEN]]Dein [[YELLOW]]S\u00e4gezahnschlag [[GREEN]]ist wieder bereit!
|
||||
Swords.Skills.SS.Other.Off={0}s [[RED]]S\u00e4gezahnschlag[[GREEN]] ist [[GREEN]]abgenutzt.
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]S\u00e4gezahnschlag!
|
||||
Swords.Skillup=Schwert Skill um {0} gestiegen. Gesamt ({1})
|
||||
Swords.SS.Length=S\u00e4gezahnschlag Dauer: [[YELLOW]]{0}s
|
||||
#TAMING
|
||||
Taming.Ability.Bonus.0=Umweltbewusst
|
||||
Taming.Ability.Bonus.1=W\u00f6lfe weichen Gefahren aus
|
||||
Taming.Ability.Bonus.2=Dicker Pelz
|
||||
Taming.Ability.Bonus.3=1/{0} Schaden, Feuer-Resistent
|
||||
Taming.Ability.Bonus.4=Schock-Sicher
|
||||
Taming.Ability.Bonus.5=Explosionen f\u00FCgen 1/{0} des normalen Schadens zu
|
||||
Taming.Ability.Bonus.6=Gesch\u00e4rfte Krallen
|
||||
Taming.Ability.Bonus.7=+{0} Schaden
|
||||
Taming.Ability.Bonus.8=Schnell-Imbiss
|
||||
Taming.Ability.Bonus.9={0} Chance auf Heilung bei einer Attacke
|
||||
Taming.Ability.Bonus.10=Heiliger Hund
|
||||
Taming.Ability.Bonus.11=Regenerierung auch mit Tr\u00E4nken und Zaubern m\u00F6glich
|
||||
Taming.Ability.Locked.0=GESPERRT bis Skill {0}+ (Umweltbewusst)
|
||||
Taming.Ability.Locked.1=GESPERRT bis Skill {0}+ (Dicker Pelz)
|
||||
Taming.Ability.Locked.2=GESPERRT bis Skill {0}+ (Schock-Sicher)
|
||||
Taming.Ability.Locked.3=GESPERRT bis Skill {0}+ (Gesch\u00e4rfte Krallen)
|
||||
Taming.Ability.Locked.4=GESPERRT bis Skill {0}+ (Schnell-Imbiss)
|
||||
Taming.Ability.Locked.5=GESPERRT bis Skill {0}+ (Heiliger Hund)
|
||||
Taming.Combat.Chance.Gore=Aufschlitzen Chance: [[YELLOW]]{0}
|
||||
Taming.SubSkill.BeastLore.Name=Bestienkunde
|
||||
Taming.SubSkill.BeastLore.Description=Knochenschlag inspiziert W\u00f6lfe und Ozelots
|
||||
Taming.SubSkill.ShockProof.Name=Schock-Sicher
|
||||
Taming.SubSkill.ShockProof.Description=Reduktion von Explosions-Schaden
|
||||
Taming.SubSkill.CallOfTheWild.Name=Ruf der Wildnis
|
||||
Taming.SubSkill.CallOfTheWild.Description=Beschw\u00f6re ein Tier an deine Seite
|
||||
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]RdW: B\u00fccken und Linksklick mit {0} {1} (Ozelot), {2} {3} (Wolf), {4} {5} (Pferd)
|
||||
Taming.SubSkill.FastFoodService.Name=Schnell-Imbiss
|
||||
Taming.SubSkill.FastFoodService.Description=Chance auf Heilung bei Attacke (Wolf)
|
||||
Taming.SubSkill.HolyHound.Name=Heiliger Hund
|
||||
Taming.SubSkill.HolyHound.Description=Heilung durch Magie und Tr\u00E4nke
|
||||
Taming.SubSkill.Gore.Name=Aufschlitzen
|
||||
Taming.SubSkill.Gore.Description=Kritische Treffer verursachen Blutung
|
||||
Taming.SubSkill.SharpenedClaws.Name=Gesch\u00e4rfte Krallen
|
||||
Taming.SubSkill.SharpenedClaws.Description=Schadens-Bonus
|
||||
Taming.SubSkill.EnvironmentallyAware.Name=Umweltbewusst
|
||||
Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lava-Furcht, Immun gegen Fall-Schaden
|
||||
Taming.SubSkill.ThickFur.Name=Dicker Pelz
|
||||
Taming.SubSkill.ThickFur.Description=Verminderter Schaden, Feuer-Resistent
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]Dein Wolf hastet zu dir zur\u00fcck...
|
||||
Taming.Listener=Z\u00e4hmen:
|
||||
Taming.SkillName=Z\u00c4HMEN
|
||||
Taming.Skillup=Z\u00e4hhmen Skill um {0} gestiegen. Gesamt ({1})
|
||||
Taming.Summon.Complete=[[GREEN]]Beschw\u00f6rung abgeschlossen
|
||||
Taming.Summon.Lifespan=(Lebenszeit: {0}s)
|
||||
Taming.Summon.Fail.Ocelot=Du hast zu viele Ozelots um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.Wolf=Du hast zu viele W\u00f6lfe um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.Horse=Du hast zu viele Pferde um dich, um weitere zu beschw\u00f6ren.
|
||||
Taming.Summon.Fail.TooMany=Du hast das Maximum an beschworenen Tieren erreicht [[YELLOW]]({0})
|
||||
Taming.Summon.Name.Format={0}''s {1}
|
||||
#UNARMED
|
||||
Unarmed.Ability.Berserk.Length=Berserker Dauer: [[YELLOW]]{0}s
|
||||
Unarmed.Ability.Bonus.0=Eiserner Arm
|
||||
Unarmed.Ability.Bonus.1=+{0} Schadens-Bonus
|
||||
Unarmed.Ability.Chance.ArrowDeflect=Pfeile ablenken Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.Disarm=Entwaffnen Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.Chance.IronGrip=Eisen Griff Chance: [[YELLOW]]{0}
|
||||
Unarmed.Ability.IronGrip.Attacker=Dein Gegner hat einen eisernen Griff!
|
||||
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Dein eiserner Griff hat dich vor Entwaffnung gesch\u00FCtzt!
|
||||
Unarmed.Ability.Lower=[[GRAY]]**Du senkst deine F\u00c4USTE**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**Deine F\u00c4USTE sind bereit**
|
||||
Unarmed.SubSkill.Berserk.Name=Berserker (F\u00e4higkeit)
|
||||
Unarmed.SubSkill.Berserk.Description=+50% Schaden, Zerbricht weiche Materialien
|
||||
Unarmed.SubSkill.Disarm.Name=Entwaffnen (Spieler)
|
||||
Unarmed.SubSkill.Disarm.Description=L\u00E4sst Gegenstand aus der Hand des Feindes fallen
|
||||
Unarmed.SubSkill.IronArmStyle.Name=Eiserner Arm
|
||||
Unarmed.SubSkill.IronArmStyle.Description=Erh\u00f6ht kurzfristig deine Schlagkraft
|
||||
Unarmed.SubSkill.ArrowDeflect.Name=Pfeil-Ablenkung
|
||||
Unarmed.SubSkill.ArrowDeflect.Description=Lenkt Pfeile ab
|
||||
Unarmed.SubSkill.IronGrip.Name=Eisen Griff
|
||||
Unarmed.SubSkill.IronGrip.Description=Sch\u00FCtzt dich davor, entwaffnet zu werden
|
||||
Unarmed.Listener=Unbewaffnet:
|
||||
Unarmed.SkillName=UNBEWAFFNET
|
||||
Unarmed.Skills.Berserk.Off=**Berserker ausgelaufen**
|
||||
Unarmed.Skills.Berserk.On=[[GREEN]]**Berserker AKTIVIERT**
|
||||
Unarmed.Skills.Berserk.Other.Off={0}s [[RED]]Berserker[[GREEN]] ist [[GREEN]]ausgelaufen
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Berserker!
|
||||
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Dein [[YELLOW]]Berserker [[GREEN]]ist wieder bereit!
|
||||
Unarmed.Skillup=Unbewaffnet Skill um {0} gestiegen. Gesamt ({1})
|
||||
#WOODCUTTING
|
||||
Woodcutting.Ability.0=Bl\u00e4ttersturm
|
||||
Woodcutting.Ability.1=Bl\u00e4st Bl\u00e4tter davon
|
||||
Woodcutting.Ability.Chance.DDrop=Doppel Drop Chance: [[YELLOW]]{0}
|
||||
Woodcutting.Ability.Length=Baumf\u00e4ller Dauer: [[YELLOW]]{0}s
|
||||
Woodcutting.Ability.Locked.0=GESPERRT bis Skill {0}+ (Bl\u00e4ttersturm)
|
||||
Woodcutting.SubSkill.TreeFeller.Name=Baumf\u00e4ller (F\u00e4higkeit)
|
||||
Woodcutting.SubSkill.TreeFeller.Description=L\u00e4sst B\u00e4ume explodieren
|
||||
Woodcutting.SubSkill.LeafBlower.Name=Bl\u00e4ttersturm
|
||||
Woodcutting.SubSkill.LeafBlower.Description=Bl\u00e4st Bl\u00e4tter davon
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=Doppel Drops
|
||||
Woodcutting.SubSkill.HarvestLumber.Description=Verdoppelt die Ausbeute
|
||||
Woodcutting.Listener=Holzf\u00e4ller:
|
||||
Woodcutting.SkillName=HOLZF\u00c4LLER
|
||||
Woodcutting.Skills.TreeFeller.Off=**Baumf\u00e4ller abgelaufen**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**Baumf\u00e4ller AKTIVIERT**
|
||||
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Dein [[YELLOW]]Baumf\u00e4ller [[GREEN]]ist wieder bereit!
|
||||
Woodcutting.Skills.TreeFeller.Other.Off={0}s [[RED]]Baumf\u00e4ller[[GREEN]] ist [[GREEN]]abgelaufen
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] benutzte [[RED]]Baumf\u00e4ller!
|
||||
Woodcutting.Skills.TreeFeller.Splinter=Deine Axt zersplittert in tausend kleine Teile!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Dieser Baum ist zu gro\u00DF!
|
||||
Woodcutting.Skillup=Holzf\u00e4ller Skill um {0} gestiegen. Gesamt ({1})
|
||||
#ABILITIY
|
||||
##generic
|
||||
Ability.Generic.Refresh=[[GREEN]]**F\u00e4higkeit wieder BEREIT!**
|
||||
Ability.Generic.Template.Lock=[[GRAY]]{0}
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
#COMBAT
|
||||
Combat.ArrowDeflect=[[WHITE]]**Pfeil ABGELENKT**
|
||||
Combat.BeastLore=[[GREEN]]**BESTIENKUNDE**
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]Gesundheit ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Besitzer ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]**AUFGESCHLITZT**
|
||||
Combat.StruckByGore=**du wurdest AUFGESCHLITZT**
|
||||
Combat.TargetDazed=Ziel wurde [[DARK_RED]]BET\u00c4UBT
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Ungl\u00fccklich ber\u00fchrt. Schwindelgef\u00fchl.
|
||||
#COMMANDS
|
||||
##generic
|
||||
mcMMO.Description=[[DARK_AQUA]]\u00DCber das [[YELLOW]]mcMMO[[DARK_AQUA]] Projekt: [[GOLD]]mcMMO ist ein [[RED]]open source[[GOLD]] RPG mod der im Februar 2011,[[GOLD]]von [[BLUE]]com.gmail.nossr50[[GOLD]] erstellt wurde. Ziel ist es eine gute RPG Erfahrung zu vermitteln.,[[DARK_AQUA]]Tipps:,[[GOLD]] - [[GREEN]]Benutz [[RED]]/mcmmo help[[GREEN]] um Befehle zu sehen,[[GOLD]] - [[GREEN]]Tippe [[RED]]/SKILLNAME[[GREEN]] um detaillierte Skillinformationen zu sehen,[[DARK_AQUA]]Entwickler:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Gr\u00FCnder),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Projektleitung),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Entwickler),[[GOLD]] - [[GREEN]]lumis31 [[BLUE]](Deutsche \u00DCbersetzung), [[DARK_AQUA]]N\u00FCtzliche Links:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Bug Reporting,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]Dir wurden {0} Level in allen Skills gutgeschrieben!
|
||||
Commands.addlevels.AwardAll.2=Alle Skills wurden um {0} ge\u00E4ndert.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]Dir wurden {0} Level in {1} gutgeschrieben!
|
||||
Commands.addlevels.AwardSkill.2={0} wurde um {1} ge\u00E4ndert.
|
||||
Commands.addxp.AwardAll=[[GREEN]]Dir wurden {0} Erfahrungspunkte in Skills gutgeschrieben!
|
||||
Commands.addxp.AwardSkill=[[GREEN]Dir wurde {0} Erfahrung in {1} gutgeschrieben!
|
||||
Commands.Ability.Off=F\u00e4higkeiten [[RED]]deaktiviert
|
||||
Commands.Ability.On=F\u00e4higkeiten [[GREEN]]aktiviert
|
||||
Commands.Ability.Toggle=Benutzung von F\u00E4higkeiten wurde f\u00FCr [[YELLOW]]{0} ge\u00E4ndert
|
||||
Commands.AdminChat.Off=Nur Admin Chat [[RED]] deaktiviert
|
||||
Commands.AdminChat.On=Nur Admin Chat [[GREEN]] aktiviert
|
||||
Commands.AdminToggle=[[GREEN]]- Schalte den Adminchat um
|
||||
Commands.Chat.Console=*Konsole*
|
||||
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO F\u00E4higkeiten Abk\u00FChlzeit[[GOLD]] =--
|
||||
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} Sekunden verbleiben
|
||||
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Bereit!
|
||||
Commands.Database.Cooldown=Du musst 1 Sekunde warten bevor du diesen Befehl erneut verwenden darfst.
|
||||
Commands.Database.Processing=Dein vorheriger Befehl wird noch verarbeitet. Bitte warten.
|
||||
Commands.Disabled=Dieser Befehl ist deaktiviert.
|
||||
Commands.DoesNotExist=[[RED]]Spieler in Datenbank nicht vorhanden!
|
||||
Commands.GodMode.Disabled=mcMMO Godmode deaktiviert
|
||||
Commands.GodMode.Enabled=mcMMO Godmode aktiviert
|
||||
Commands.GodMode.Forbidden=[mcMMO] Der Godmode ist in dieser Welt nicht erlaubt(Siehe Permissions)
|
||||
Commands.GodMode.Toggle=Godmode wurde f\u00FCr [[YELLOW]]{0} aktiviert
|
||||
Commands.Healthbars.Changed.HEARTS=[mcMMO]Deine Lebensanzeige wurde zu [[RED]]Herzen[[WHITE]] ge\u00E4ndert.
|
||||
Commands.Healthbars.Changed.BAR=[mcMMO] Deine Lebensanzeige wurde zu [[YELLOW]]K\u00E4stchen[[WHITE]] ge\u00E4ndert.
|
||||
Commands.Healthbars.Changed.DISABLED=[mcMMO] Die Mob-Lebensanzeige wurde [[GRAY]]deaktiviert[[WHITE]].
|
||||
Commands.Healthbars.Invalid=Ung\u00FCltiger Lebensanzeige Typ!
|
||||
Commands.Inspect=<player> [[GREEN]]- Siehe detaillierte Spielerinformationen
|
||||
Commands.Invite.Success=[[GREEN]]Einladung erfolgreich gesendet.
|
||||
Commands.Leaderboards=<skill> <page> [[GREEN]]- Bestenlisten
|
||||
Commands.mcc.Header=---[][[GREEN]]mcMMO Befehle[[RED]][]---
|
||||
Commands.mcgod=[[GREEN]]- Schalte Godmode um
|
||||
Commands.mchud.Invalid=Das ist kein g\u00FCltiger HUD Typ.
|
||||
Commands.mcpurge.Success=[[GREEN]]Die Datenbank wurde erfolgreich ges\u00E4ubert!
|
||||
Commands.mcrank.Heading=[[GOLD]]-=PERS\u00D6NLICHE STATISTIKEN=-
|
||||
Commands.mcrank.Overall=Insgesamt[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{0}
|
||||
Commands.mcrank.Player=ZIEL: [[WHITE]]{0}
|
||||
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{1}
|
||||
Commands.mcrank.Unranked=[[WHITE]]Ohne Rang
|
||||
Commands.mcrefresh.Success={0}''s Abk\u00FChlzeiten wurden erneuert.
|
||||
Commands.mcremove.Success=[[GREEN]]{0} wurde erfolgreich von der Datenbank entfernt!
|
||||
Commands.mctop.Tip=[[GOLD]]Tipp: Benutze [[RED]]/mcrank[[GOLD]] um deine pers\u00F6nlichen Statistiken zu sehen!
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[GREEN]] - Ziel modifizieren
|
||||
Commands.mmoedit.AllSkills.1=[[GREEN]]Dein Level wurde in allen F\u00E4higkeiten zu {0} gesetzt!
|
||||
Commands.mmoedit.Modified.1=[[GREEN]]Dein Level in {0} wurde zu {1} gesetzt!
|
||||
Commands.mmoedit.Modified.2={0} wurde bei {1} modifiziert.
|
||||
Commands.mcconvert.Database.Same=Du benutzt bereits die {0} Datenbank!
|
||||
Commands.mcconvert.Database.InvalidType={0} ist kein g\u00FCltiger Datenbanktyp.
|
||||
Commands.mcconvert.Database.Start=[[GRAY]]Beginne Konvertierung von {0} zu {1}...
|
||||
Commands.mcconvert.Database.Finish=[[GRAY]]Datenbanken Migration vollendet; die {1} Datenbank hat nun alle Daten von der {0} Datenbank.
|
||||
Commands.mmoshowdb=Die zurzeit verwendete Datenbank ist [[GREEN]]{0}
|
||||
Commands.mcconvert.Experience.Invalid=Unbekannter Formeltyp! G\u00FCltige Typen sind: [[GREEN]]LINEAR [[RED]]und [[GREEN]]EXPONENTIAL.
|
||||
Commands.mcconvert.Experience.Same=Formeltyp {0} wird bereits verwendet
|
||||
Commands.mcconvert.Experience.Start=[[GRAY]]Beginne Konvertierung von Kurve {0} zu Kurve {1}
|
||||
Commands.mcconvert.Experience.Finish=[[GRAY]]Konvertierung vollendet; jetzt wird die {0} XP Kurve verwendet.
|
||||
Commands.ModDescription=[[GREEN]]- Kurze Modbeschreibung
|
||||
Commands.NoConsole=Dieser Befehl kann nicht aus der Konsole verwendet werden.
|
||||
Commands.Notifications.Off=F\u00E4higkeiten Hinweise wurden [[RED]]deaktiviert
|
||||
Commands.Notifications.On=F\u00E4higkeiten Hinweise wurden [[GREEN]]aktiviert
|
||||
Commands.Offline=Dieser Befehl funktioniert nur bei eingeloggten Spielern.
|
||||
Commands.NotLoaded=Spielerprofil wurde noch nicht geladen.
|
||||
Commands.Other=---[][[GREEN]]ANDERE BEFEHLE[[RED]][]---
|
||||
Commands.Party.Header=-----[][[GREEN]]PARTY[[RED]][]-----
|
||||
Commands.Party.Features.Header=-----[][[GREEN]]FEATURES[[RED]][]-----
|
||||
Commands.Party.Status=[[DARK_GRAY]]NAME: [[WHITE]]{0} {1} [[DARK_GRAY]]LEVEL: [[DARK_AQUA]]{2}
|
||||
Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLY: [[WHITE]]{0}
|
||||
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Freigeschaltete Features: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.ShareMode=[[DARK_GRAY]]TEILEN MODUS:
|
||||
Commands.Party.ItemShare=[[GRAY]]ITEM [[DARK_AQUA]]({0})
|
||||
Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0})
|
||||
Commands.Party.ItemShareCategories=[[DARK_GRAY]]Teile Items: [[GRAY]][[ITALIC]]{0}
|
||||
Commands.Party.MembersNear=[[DARK_GRAY]]IN DER N\u00C4HE [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
|
||||
Commands.Party.Accept=[[GREEN]]- Nimm Party-Einladung an
|
||||
Commands.Party.Chat.Off=Nur Party Chat [[RED]]Aus
|
||||
Commands.Party.Chat.On=Nur Party Chat [[GREEN]]AN
|
||||
Commands.Party.Commands=---[][[GREEN]]PARTY BEFEHLE[[RED]][]---
|
||||
Commands.Party.Invite.0=ALERT: [[GREEN]]Du hast eine Party Einladung f\u00FCr {0} von {1} erhalten.
|
||||
Commands.Party.Invite.1=Benutze [[GREEN]]/party accept[[YELLOW]] um die Einladung anzunehmen
|
||||
Commands.Party.Invite=[[GREEN]]- Sende eine Party Einladung
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]Einladung angenommen. Du bist der {0} Party beigetreten.
|
||||
Commands.Party.Join=[[GRAY]]Beigetretene Party: {0}
|
||||
Commands.Party.Create=[[GRAY]]Erstellte Party: {0}
|
||||
Commands.Party.Rename=[[GRAY]]Party Name wurde zu: [[WHITE]]{0} [[GRAY]]ge\u00E4ndert
|
||||
Commands.Party.SetSharing=[[GRAY]]Party {0} teilen: [[DARK_AQUA]]{1}
|
||||
Commands.Party.ToggleShareCategory=[[GRAY]]Party item Teilen f\u00FCr[[GOLD]]{0} [[GRAY]]wurde [[DARK_AQUA]]{1}
|
||||
Commands.Party.AlreadyExists=[[DARK_RED]]Party {0} ist bereits vorhanden!
|
||||
Commands.Party.Kick=Du wurdest von {0} Party entfernt!
|
||||
Commands.Party.Leave=Du hast die Party verlassen
|
||||
Commands.Party.Members.Header=-----[][[GREEN]]MITGLIEDER[[RED]][]-----
|
||||
Commands.Party.None=Du bist in keiner Party.
|
||||
Commands.Party.Quit=[[GREEN]]- Verlasse deine aktuelle Party.
|
||||
Commands.Party.Teleport=[[GREEN]]- Teleportiere dich zu Partymitgliedern.
|
||||
Commands.Party.Toggle=[[GREEN]]- Schalte den Party Chat.
|
||||
Commands.Party1=[[GREEN]]- Erstelle eine neue Party
|
||||
Commands.Party2=[[GREEN]]- Tritt der Party eines Spielers bei.
|
||||
Commands.Party.Alliance.Header=-----[][[GREEN]]PARTY ALLIANZEN[[RED]][]-----
|
||||
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]IS MIT FOLGENDEN VERB\u00DCNDET: [[WHITE]]{1}
|
||||
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]ALLIANZEN MITGLIEDER[[RED]][]-----
|
||||
Commands.Party.Alliance.Invite.0=ALERT: [[GREEN]]Du hast eine B\u00FCndnis Anfrage f\u00FCr {0} von {1} erhalten
|
||||
Commands.Party.Alliance.Invite.1=Tippe [[GREEN]]/party alliance accept[[YELLOW]] um die Anfrage anzunehmen
|
||||
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]B\u00FCndnis Anfrage angenommen
|
||||
Commands.Party.Alliance.None=Deine Party hat keine Verb\u00FCndeten.
|
||||
Commands.Party.Alliance.AlreadyAllies=Deine Party ist bereits in einem B\u00FCndnis. Trenne mit[[DARK_AQUA]]/party alliance disband
|
||||
Commands.Party.Alliance.Help.0=Diese Party ist in keinem B\u00FCndnis. Lade einen Party Anf\u00FChrer an.
|
||||
Commands.Party.Alliance.Help.1=um zu verb\u00FCnden [[DARK_AQUA]]/party alliance invite <Spieler>[[RED]].
|
||||
Commands.ptp.Enabled=Party Teleport [[GREEN]]aktiviert
|
||||
Commands.ptp.Disabled=Party Teleport [[RED]]deaktiviert
|
||||
Commands.ptp.NoRequests=Du hast aktuell keine teleportanfragen.
|
||||
Commands.ptp.NoWorldPermissions=[mcMMO] Du hast nicht die Rechte um in die Welt {0} zu teleportieren.
|
||||
Commands.ptp.Request1={0} [[GREEN]]m\u00F6chte sich zu dir teleportieren.
|
||||
Commands.ptp.Request2=[[GREEN]]Um zu teleportieren tippe[[YELLOW]]/ptp accept[[GREEN]]. Die Anfrage l\u00E4uft in[[RED]]{0} [[GREEN]]Sekunden aus.
|
||||
Commands.ptp.AcceptAny.Enabled=Party Teleport Anfragenbest\u00E4tigung[[GREEN]]aktiviert
|
||||
Commands.ptp.AcceptAny.Disabled=Party Teleport Anfragenbest\u00E4tigung[[RED]]deaktiviert
|
||||
Commands.ptp.RequestExpired=Party Teleport Anfrage ist ausgelaufen.
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Power Level [[YELLOW]]Bestenliste--
|
||||
Commands.PowerLevel.Capped=[[DARK_RED]]GESAMT LEVEL: [[GREEN]]{0} [[DARK_RED]]MAX LEVEL: [[YELLOW]]{1}
|
||||
Commands.PowerLevel=[[DARK_RED]]GESAMT LEVEL: [[GREEN]]{0}
|
||||
Commands.Reset.All=[[GREEN]]Alles Skilllevel wurden erfolgreich zur\u00FCckgesetzt.
|
||||
Commands.Reset.Single=[[GREEN]]Dein {0} Skilllevel wurde erfolgreich zur\u00FCckgesetzt.
|
||||
Commands.Reset=[[GREEN]]- Setze ein Skilllevel auf 0
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]Die Stats \u00DCbersicht wurde ausgeblendet.
|
||||
Commands.Scoreboard.NoBoard=Die Stats Anzeige ist nicht sichtbar.
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]Die Stats \u00DCbersicht bleibt sichtbar bis du [[GREEN]]/mcscoreboard clear[[DARK_AQUA]] verwendest.
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]Die Stats \u00DCbersicht wird nach [[GOLD]]{0}[[DARK_AQUA]] Sekunden verschwinden.
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Hilfe f\u00FCr[[RED]]/mcscoreboard[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - blende die \u00DCbersicht aus
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - behalte die \u00DCbersicht offen
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - blende die \u00DCbersicht nach [[LIGHT_PURPLE]]n[[WHITE]] Sekunden aus
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]Tipp: Benutze [[RED]]/mcscoreboard keep[[GOLD]] um deine Stats sichtbar zu lassen
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]Tipp: Benutze [[RED]]/mcscoreboard clear[[GOLD]] um die \u00DCbersicht auszublenden
|
||||
Commands.Skill.Invalid=Das ist kein g\u00FCltiger Skillname!
|
||||
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Bestenliste--
|
||||
Commands.SkillInfo=[[GREEN]]-Detaillierte Informationen zu einem Skill
|
||||
Commands.Stats.Self=DEINE STATS
|
||||
Commands.Stats=[[GREEN]]- Sieh deine McMMO Stats
|
||||
Commands.ToggleAbility=[[GREEN]]- Schalte auf F\u00E4higkeiten Aktivierung mit Rechtsklick
|
||||
Commands.Usage.0=Korrekte Verwendung ist /{0}
|
||||
Commands.Usage.1=Korrekte Verwendung ist /{0} {1}
|
||||
Commands.Usage.2=Korrekte Verwendung ist /{0} {1} {2}
|
||||
Commands.Usage.3=Korrekte Verwendung ist /{0} {1} {2} {3}
|
||||
Commands.Usage.FullClassName=classname
|
||||
Commands.Usage.Level=Level
|
||||
Commands.Usage.Message=Message
|
||||
Commands.Usage.Page=Seite
|
||||
Commands.Usage.PartyName=Name
|
||||
Commands.Usage.Password=Passwort
|
||||
Commands.Usage.Player=Spieler
|
||||
Commands.Usage.Rate=Eate
|
||||
Commands.Usage.Skill=Skill
|
||||
Commands.Usage.XP=xp
|
||||
mcMMO.NoInvites=Du hast zurzeit keine Einladungen
|
||||
mcMMO.NoPermission=[[DARK_RED]]Unzureichende Berechtigungen.
|
||||
mcMMO.NoSkillNote=[[DARK_GRAY]]Wenn du keinen Zugriff auf einen Skill hast wird er hier nicht angezeigt.
|
||||
##party
|
||||
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
|
||||
Party.Help.0=Proper usage is [[DARK_AQUA]]{0} <player> [password].
|
||||
Party.Help.1=To create a party, use [[DARK_AQUA]]{0} <name> [password].
|
||||
Party.Help.2=Consult [[DARK_AQUA]]{0} [[RED]]for more information
|
||||
Party.Help.3=Use [[DARK_AQUA]]{0} <player> [password] [[RED]]to join or [[DARK_AQUA]]{1} [[RED]]to quit
|
||||
Party.Help.4=To lock or unlock your party, use [[DARK_AQUA]]{0}
|
||||
Party.Help.5=To password protect your party, use [[DARK_AQUA]]{0} <password>
|
||||
Party.Help.6=To kick a player from your party, use [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.7=To transfer ownership of your party, use [[DARK_AQUA]]{0} <player>
|
||||
Party.Help.8=To disband your party, use [[DARK_AQUA]]{0}
|
||||
Party.Help.9=Use [[DARK_AQUA]]{0} [[RED]]to share items with party members
|
||||
Party.Help.10=Use [[DARK_AQUA]]{0} [[RED]]to enable XP sharing with party members
|
||||
Party.InformedOnJoin={0} [[GREEN]]has joined your party
|
||||
Party.InformedOnQuit={0} [[GREEN]]has left your party
|
||||
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]has set the party name to [[WHITE]]{1}
|
||||
Party.InvalidName=[[DARK_RED]]That is not a valid party name.
|
||||
Party.Invite.Self=You can't invite yourself!
|
||||
Party.IsLocked=This party is already locked!
|
||||
Party.IsntLocked=This party is not locked!
|
||||
Party.Locked=Party is locked, only party leader may invite.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} is not in your party
|
||||
Party.NotOwner=[[DARK_RED]]You are not the party leader.
|
||||
Party.Target.NotOwner=[[DARK_RED]]{0} is not the party leader.
|
||||
Party.Owner.New=[[GREEN]]{0} is the new party leader.
|
||||
Party.Owner.NotLeader=[[DARK_RED]]You are no longer the party leader.
|
||||
Party.Owner.Player=[[GREEN]]You are now the party leader.
|
||||
Party.Password.None=This party is password protected. Please provide a password to join.
|
||||
Party.Password.Incorrect=Party password is incorrect.
|
||||
Party.Password.Set=[[GREEN]]Party password set to {0}
|
||||
Party.Password.Removed=[[GREEN]]Party password has been cleared.
|
||||
Party.Player.Invalid=That is not a valid player.
|
||||
Party.NotOnline=[[DARK_RED]]{0} is not online!
|
||||
Party.Player.InSameParty={0} already is in your party!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} is not in a party
|
||||
Party.Specify=You must specify a party.
|
||||
Party.Teleport.Dead=You can't teleport to a dead player.
|
||||
Party.Teleport.Hurt=You have been hurt in the last {0} seconds and cannot teleport.
|
||||
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
|
||||
Party.Teleport.Self=You can't teleport to yourself!
|
||||
Party.Teleport.Target=[[GREEN]]{0} has teleported to you.
|
||||
Party.Teleport.Disabled={0} doesn't allow party teleportation.
|
||||
Party.Rename.Same=That is already the name of your party!
|
||||
Party.Join.Self=You can't join yourself!
|
||||
Party.Unlocked=[[GRAY]]Party is unlocked
|
||||
Party.Disband=[[GRAY]]The party has been disbanded
|
||||
Party.Alliance.Formed=[[GRAY]]Your party is now allies with [[GREEN]]{0}
|
||||
Party.Alliance.Disband=[[GRAY]]Your party is no longer allies with [[RED]]{0}
|
||||
Party.Status.Locked=[[DARK_RED]](INVITE-ONLY)
|
||||
Party.Status.Unlocked=[[DARK_GREEN]](OPEN)
|
||||
Party.LevelUp=Party level increased by {0}. Total ({1})
|
||||
Party.Feature.Chat=Party Chat
|
||||
Party.Feature.Teleport=Party Teleport
|
||||
Party.Feature.Alliance=Alliances
|
||||
Party.Feature.ItemShare=Item Sharing
|
||||
Party.Feature.XpShare=XP Sharing
|
||||
Party.Feature.Locked.Chat=LOCKED UNTIL {0}+ (PARTY CHAT)
|
||||
Party.Feature.Locked.Teleport=LOCKED UNTIL {0}+ (PARTY TELEPORT)
|
||||
Party.Feature.Locked.Alliance=LOCKED UNTIL {0}+ (ALLIANCES)
|
||||
Party.Feature.Locked.ItemShare=LOCKED UNTIL {0}+ (ITEM SHARING)
|
||||
Party.Feature.Locked.XpShare=LOCKED UNTIL {0}+ (XP SHARING)
|
||||
Party.Feature.Disabled.1=Party chat is not unlocked yet.
|
||||
Party.Feature.Disabled.2=Party teleport is not unlocked yet.
|
||||
Party.Feature.Disabled.3=Party alliances are not unlocked yet.
|
||||
Party.Feature.Disabled.4=Party item sharing is not unlocked yet.
|
||||
Party.Feature.Disabled.5=Party XP sharing is not unlocked yet.
|
||||
Party.ShareType.Xp=XP
|
||||
Party.ShareType.Item=ITEM
|
||||
Party.ShareMode.None=NONE
|
||||
Party.ShareMode.Equal=EQUAL
|
||||
Party.ShareMode.Random=RANDOM
|
||||
Party.ItemShare.Category.Loot=Loot
|
||||
Party.ItemShare.Category.Mining=Mining
|
||||
Party.ItemShare.Category.Herbalism=Herbalism
|
||||
Party.ItemShare.Category.Woodcutting=Woodcutting
|
||||
Party.ItemShare.Category.Misc=Misc
|
||||
##xp
|
||||
Commands.XPGain.Acrobatics=Fallen
|
||||
Commands.XPGain.Alchemy=Tr\u00E4nke brauen
|
||||
Commands.XPGain.Archery=Monster angreifen
|
||||
Commands.XPGain.Axes=Monster angreifen
|
||||
Commands.XPGain.Child=Levelerhalt durch Verbesserung der Eltern-Skills
|
||||
Commands.XPGain.Excavation=Graben und Sch\u00E4tze finden
|
||||
Commands.XPGain.Fishing=Angeln
|
||||
Commands.XPGain.Herbalism=Ernten
|
||||
Commands.XPGain.Mining=Erze und Steine abbauen
|
||||
Commands.XPGain.Repair=Reparieren
|
||||
Commands.XPGain.Swords=Monster angreifen
|
||||
Commands.XPGain.Taming=Monster z\u00E4hmen, mit dem Wolf k\u00E4mpfen
|
||||
Commands.XPGain.Unarmed=Monster angreifen
|
||||
Commands.XPGain.Woodcutting=B\u00E4ume f\u00E4llen
|
||||
Commands.XPGain=[[DARK_GRAY]]XP ZUWACHS: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]Deine XP Anzeige ist nun auf {0} festgesetzt!
|
||||
Commands.xplock.unlocked=[[GOLD]]Deine XP Anzeige ist nun wieder [[GREEN]]FREIGEGEBEN[[GOLD]]!
|
||||
Commands.xprate.modified=The XP RATE wurde auf {0} gesetzt!
|
||||
Commands.xprate.over=Das mcMMO XP Rate Event ist vor\u00fcber!!
|
||||
Commands.xprate.proper.0=Korrekte Eingabe f\u00fcr XP Rate Wechsel: /xprate <integer> <true/false>
|
||||
Commands.xprate.proper.1=Korrekte Eingabe f\u00fcr R\u00fccksetzung auf Standard XP Rate: /xprate reset
|
||||
Commands.xprate.proper.2=Bitte spezifiziere mit true/false ob dies ein XP-Event ist oder nicht.
|
||||
Commands.xprate.started.0=[[GOLD]]Das XP EVENT f\u00fcr mcMMO hat BEGONNEN!
|
||||
Commands.xprate.started.1=[[GOLD]]Die mcMMO XP RATE liegt nun bei {0}x!
|
||||
XPRate.Event=[[GOLD]]mcMMO hat gerade ein XP-RATE Event. Derzeitige XP Rate: {0}x!
|
||||
#EFFECTS
|
||||
##generic
|
||||
Effects.Effects=EFFEKTE
|
||||
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
|
||||
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
|
||||
Effects.Parent=[[GOLD]]{0} -
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
#GUIDES
|
||||
Guides.Available=[[GRAY]]Anleitung f\u00FCr {0} vorhanden - tippe /{1} ? [Seite]
|
||||
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Anleitung[[GOLD]]=-
|
||||
Guides.Page.Invalid=Keine g\u00FCltige Seitenzahl!
|
||||
Guides.Page.OutOfRange=Es gibt nur insgesamt {0} Seiten.
|
||||
Guides.Usage=Der Befehl ist /{0} ? [Seite]
|
||||
##Acrobatics
|
||||
Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u00DCber Akrobatik:\n[[YELLOW]]Akrobatik ist die Kunst sich grazi\u00F6s fortzubewegen.\n[[YELLOW]]Fall- und Kampfschaden werden reduziert\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP sammelst du indem du in K\u00E4mpfen\n[[YELLOW]]ausweichst, oder St\u00FCrze aus gro\u00DFen H\u00F6hen \u00FCberlebst.
|
||||
Guides.Acrobatics.Section.1=[[DARK_AQUA]]Wie funktioniert Rollen?\n[[YELLOW]]Ab und zu rollst du beim Fallen ab und der Fallschaden wird\n[[YELLOW]]reduziert. Wenn du den Schleichen Knopf w\u00E4hrend dem Fallen\n[[YELLOW]]h\u00E4ltst, verdoppelt sich die Wahrscheinlichkeit abzurollen.\n[[YELLOW]]In dem Fall rollst du grazi\u00F6s ab.\n[[YELLOW]]Grazi\u00F6se Rollen sind gleich wie normale Rollen, nur dass\n[[YELLOW]]sie \u00F6fter passieren und damit mehr Schutz vor St\u00FCrzen\n[[YELLOW]]liefern.
|
||||
Guides.Acrobatics.Section.2=[[DARK_AQUA]]Wie funktioniert Ausweichen?\n[[YELLOW]]Ausweichen ist eine passive F\u00E4higkeit\n[[YELLOW]]die ab und zu den Schaden in K\u00E4mpfen halbiert.\n[[YELLOW]]Die Wahrscheinlichkeit auszuweichen ist abh\u00E4ngig vom \n[[YELLOW]]Akrobatiklevel.
|
||||
##Alchemy
|
||||
Guides.Alchemy.Section.0=[[DARK_AQUA]]\u00DCber Alchemie:\n[[YELLOW]]In Alchemie musst du Tr\u00E4nke brauen.\n[[YELLOW]]Mit h\u00F6herem Level werden die Tr\u00E4nke schneller\n[[YELLOW]]gebraut und neue Zutaten f\u00FCr zun\u00E4chst unerh\u00E4ltliche Tr\u00E4nke \n[[YELLOW]]freigeschaltet.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Tr\u00E4nke brauen.
|
||||
Guides.Alchemy.Section.1=[[DARK_AQUA]]Wie funktioniert Katalyse?\n[[YELLOW]]Katalyse beschleunigt das Brauen von Tr\u00E4nken bis\n[[YELLOW]]zu 4-facher Geschwindigkeit bei Level 1000.\n[[YELLOW]]
|
||||
Guides.Alchemy.Section.2=[[DARK_AQUA]]Wie funktioniert Braukunst?\n[[YELLOW]]Braukunst erm\u00F6glich das Brauen weiterer Tr\u00E4nke mit neuen\n[[YELLOW]]Zutaten.\n[[YELLOW]]Welche Zutaten m\u00F6glich sind, h\u00E4ngt vom Rang ab.\n[[YELLOW]]Insgesamt gibt es 8 R\u00E4nge zum freischalten.
|
||||
Guides.Alchemy.Section.3=[[DARK_AQUA]]Braukunst Tier 1 Zutaten:\n[[YELLOW]]Lohnenstaub, Fermentierte Spinnenaugen, Ghast Tr\u00E4nen,\n[[YELLOW]]Redstone, Glowstonestaub, Zucker, Glitzernde Melone,\n[[YELLOW]]Goldene Karotte, Magma Creme, Netherwarzen, Spinnenaugen, \n[[YELLOW]]Schwarzpulver, Seerose, Kugelfisch (Vanilla Tr\u00E4nke)
|
||||
Guides.Alchemy.Section.4=[[DARK_AQUA]]Braukunst Tier 2 Zutaten:\n[[YELLOW]]Karotte (Eile)\n[[YELLOW]]Schleimball (Langsamkeit)\n\n[[DARK_AQUA]]Braukunst Tier 3 Zutaten:\n[[YELLOW]]Quarz (Absoption)\n[[YELLOW]]Roter Pilz (Springen)
|
||||
Guides.Alchemy.Section.5=[[DARK_AQUA]]Braukunst Tier 4 Zutaten:\n[[YELLOW]]Apfel (Gesundheitsboost)\n[[YELLOW]]Verrottetes Fleisch (Hunger)\n\n[[DARK_AQUA]]Braukunst Tier 5 Zutaten:\n[[YELLOW]]Brauner Pilz(\u00DCbelkeit)\n[[YELLOW]]Tintensack (Blindheit)
|
||||
Guides.Alchemy.Section.6=[[DARK_AQUA]]Braukunst Tier 6 Zutaten:\n[[YELLOW]]Gras (S\u00E4ttigung)\n\n[[DARK_AQUA]]Braukunst Tier 7 Zutaten:\n[[YELLOW]]Giftige Kartoffel(Verwesung)\n\n[[DARK_AQUA]]Braukunst Tier 8 Zutaten:\n[[YELLOW]]Normaler Goldener Apfel (Resistenz)
|
||||
##Archery
|
||||
Guides.Archery.Section.0=[[DARK_AQUA]]\u00DCber Bogenschie\u00DFen:\n[[YELLOW]]In Bogenschie\u00DFen geht es um die Verwendung von Pfeil und\n[[YELLOW]]Bogen.\n\n[[YELLOW]]Es gibt unterschiedliche Kampfboni, wie Zusatzschaden,\n[[YELLOW]]der mit dem Level steigt und der F\u00E4higkeit Feinde im PVP\n[[YELLOW]]zu bet\u00E4uben. Zus\u00E4tzlich kannst du einige verschossene\n[[YELLOW]]Pfeile aus den Leichen deiner Feinde wiedergewinnen.
|
||||
Guides.Archery.Section.1=[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]XP erh\u00E4ltst du durch das Abschie\u00DFen von Monstern und\n[[YELLOW]]anderen Spielern.
|
||||
Guides.Archery.Section.2=[[DARK_AQUA]]Wie funktioniert der Kunstschuss?\n[[YELLOW]]Kunstschuss erh\u00F6ht den Schaden deines Schusses.\n[[YELLOW]]Der Zusatzschaden steigt mit deinem Bogen Level.\n[[YELLOW]]In den Standardeinstellungen steigt der Schaden um 10%\n[[YELLOW]]alle 50 Level, mit einem Maximum von 200% extra.
|
||||
Guides.Archery.Section.3=[[DARK_AQUA]]Wie Funktioniert Bet\u00E4ubung?\n[[YELLOW]]Du hast eine passive Wahrscheinlichkeit andere Spieler\n[[YELLOW]]zu bet\u00E4uben wenn du sie anschie\u00DFt. Der Spieler wird\n[[YELLOW]]gezwungen f\u00FCr eine kurze Weile senkrecht nach oben zu\n[[YELLOW]]schauen.\n[[YELLOW]]Ein Bet\u00E4ubungsschuss f\u00FCgt au\u00DFerdem 4 Schadenspunkte \n[[YELLOW]](2 Herzen) extra zu.
|
||||
Guides.Archery.Section.4=[[DARK_AQUA]]Wie funktioniert die Pfeilr\u00FCckgewinnung?\n[[YELLOW]]Du hast eine passive Wahrscheinlichkeit einige Pfeile\n[[YELLOW]]zur\u00FCckzubekommen wenn du Monster mit dem Bogen t\u00F6test.\n[[YELLOW]]Die Wahrscheinlichkeit steigt mit dem Bogen Level.\n[[YELLOW]]Standardm\u00E4\u00DFig steigt diese F\u00E4higkeit um 0.1% pro Level, bis\n[[YELLOW]]100% bei Level 1000.
|
||||
##Axes
|
||||
Guides.Axes.Section.0=[[DARK_AQUA]]\u00DCber Axt:\n[[YELLOW]]Mit dem Axt Skill kannst du die Axt f\u00FCr viel mehr als\n[[YELLOW]]nur abholzen verwenden! Du kannst Monster und Spieler\n[[YELLOW]]sprichw\u00F6rtlich weghacken und ihnen t\u00F6dliche\n[[YELLOW]]Schl\u00E4ge verpassen oder sie zur\u00FCckweichen lassen\n[[YELLOW]]Deine Axt zerst\u00F6rt au\u00DFerdem sehr gut R\u00FCstungen,\n[[YELLOW]]was mit h\u00F6herem Level noch mehr ansteigt.
|
||||
Guides.Axes.Section.1=[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um XP zu bekommen musst du Spieler oder Monster \n[[YELLOW]]mit einer Axt schlagen.
|
||||
Guides.Axes.Section.2=[[DARK_AQUA]]Wie funktioniert der Sch\u00E4delspalter?\n[[YELLOW]]Diese F\u00E4higkeit erlaubt dir einen Angriff mit Fl\u00E4chenschaden\n[[YELLOW]]auszuf\u00FChren.\n[[YELLOW]]Der Fl\u00E4chenschaden ist halb so gro\u00DF wie der \n[[YELLOW]]Hauptangriff, also perfekt f\u00FCr gro\u00DFe Ansammlungen von Mobs.
|
||||
Guides.Axes.Section.3=[[DARK_AQUA]]Wie funktionieren kritische Treffer?\n[[YELLOW]]Kritische Treffer sind eine passive F\u00E4higkeit\n[[YELLOW]]die ab und zu Zusatzschaden zuf\u00FCgen.\n[[YELLOW]]In den Standardeinstellungen wird alle 2 Level \n[[YELLOW]]die Wahrscheinlichkeit um 0.1% erh\u00F6ht. Das f\u00FCgt Mobs\n[[YELLOW]]doppelten und anderen Spielern 1,5 fachen Schaden zu.
|
||||
Guides.Axes.Section.4=[[DARK_AQUA]]Wie funktioniert die Axt-Beherrschung?\n[[YELLOW]]Axt Beherrschung ist eine passive F\u00E4higkeit die deinen\n[[YELLOW]]Axt-Schl\u00E4gen Zusatzschaden hinzuf\u00FCgt.\n[[YELLOW]]Standardm\u00E4\u00DFig steigt der Schaden um 1 alle 50 Level,\n[[YELLOW]]maximal auf 4 Extraschaden bei Level 200.
|
||||
Guides.Axes.Section.5=[[DARK_AQUA]]Wie funktioniert Wucht?\n[[YELLOW]]Schlage m\u00E4chtig zu und zerst\u00F6re R\u00FCstungen!\n[[YELLOW]]Wucht hat eine passive Wahrscheinlichkeit gegnerische\n[[YELLOW]]R\u00FCstung zu besch\u00E4digen. Dieser Schaden steigt mit deinem Axt\n[[YELLOW]]Level.
|
||||
Guides.Axes.Section.6=[[DARK_AQUA]]Wie funktioniert der Wucht-Schlag?\n[[YELLOW]]Du hast eine passive Chance Monster und\n[[YELLOW]]Spieler beim Schlag zur\u00FCckweichen zu lassen\n[[YELLOW]]Standardm\u00E4\u00DFig ist die Wahrscheinlichkeit 25%\n[[YELLOW]]Zus\u00E4tzlich f\u00FCgst du Zusatzschaden zu.
|
||||
##Excavation
|
||||
Guides.Excavation.Section.0=[[DARK_AQUA]]\u00DCber Graben:\n[[YELLOW]]Graben ist die F\u00E4higkeit Sch\u00E4tze im Dreck zu finden.\n[[YELLOW]]Durch Aufgraben des Landes wirst du Sch\u00E4tze finden\n[[YELLOW]]Je l\u00E4nger du das tust, desto mehr Sch\u00E4tze findest du.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]XP erh\u00E4ltst du durch Schaufeln.\n[[YELLOW]]Nur bestimmte Materialen geben XP und Sch\u00E4tze.
|
||||
Guides.Excavation.Section.1=[[DARK_AQUA]]Kompatible Materialien:\n[[YELLOW]]Gras, Erde, Sand, Lehm, Kies, Myzel, Seelensand, Schnee
|
||||
Guides.Excavation.Section.2=[[DARK_AQUA]]Wie funktioniert der Giga Bohrer?\n[[YELLOW]]Halte eine Schaufel in der Hand und mach Rechtsklick.\n[[YELLOW]]Von nun an hast du ca. 4 Sekunden um einen kompatiblem\n[[YELLOW]]Block abzubauen.\n[[YELLOW]]Daraufhin wird der Giga Bohrer aktiviert.
|
||||
Guides.Excavation.Section.3=[[DARK_AQUA]]Was ist der Giga Bohrer?\n[[YELLOW]]Giga Bohrer ist eine F\u00E4higkeit deren Dauer vom Graben Skill\n[[YELLOW]]abh\u00E4ngt.\n[[YELLOW]]Es verdreifacht die Wahrscheinlichkeit Sch\u00E4tze zu finden\n[[YELLOW]]und erm\u00F6glicht sofortiges Abbauen kompatibler Materialien.
|
||||
Guides.Excavation.Section.4=[[DARK_AQUA]]Wie funktioniert der Schatz J\u00E4ger?\n[[YELLOW]]Jeder m\u00F6gliche Schatz hat seine eigene Level Voraussetzung\n[[YELLOW]]um zu erscheinen, folglich ist es schwer[[YELLOW]]zu sagen inwiefern es \n[[YELLOW]]dir hilft ein höheres Level zu haben.\n[[YELLOW]]Je h\u00F6her das Level, desto mehr Sch\u00E4tze k\u00F6nnen gefunden\n[[YELLOW]]werden.
|
||||
Guides.Excavation.Section.5=Beachte au\u00DFerdem, dass jedes kompatible Material seine\n[[YELLOW]]eigenen einzigartigen Sch\u00E4tze hat.\n[[YELLOW]]Anders ausgedr\u00FCckt: Sch\u00E4tze die du in Kies findest\n[[YELLOW]]gibt es nicht zwingend in Erde.
|
||||
Guides.Excavation.Section.6=[[DARK_AQUA]]Bemerkung zu Graben:\n[[YELLOW]]Graben Drops sind vollkommen anpassbar\n[[YELLOW]]Ergebnisse unterscheiden sich deshalb von Server zu Server.
|
||||
##Fishing
|
||||
Guides.Fishing.Section.0=[[DARK_AQUA]]\u00DCber Angeln:\n[[YELLOW]]Mit dem Angeln Skill ist Angeln wieder aufregend!\n[[YELLOW]]Finde versteckte Sch\u00E4tze oder Rei\u00DFe Items von Monstern.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Fang Fische.
|
||||
Guides.Fishing.Section.1=[[DARK_AQUA]]Wie funktioniert der Schatz J\u00E4ger?\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du beim Angeln Sch\u00E4tze finden.\n[[YELLOW]]Diese k\u00F6nnen sogar verzaubert sein!\n[[YELLOW]]Jeder m\u00F6gliche Schatz kann mit jedem Level gefunden\n[[YELLOW]]werden. Die H\u00E4ufigkeit h\u00E4ngt von dem Wert des Items ab.\n[[YELLOW]]Je h\u00F6her der Angeln Skill ist, desto einfacher wird es\n[[YELLOW]]wertvolle Sch\u00E4tze zu finden.
|
||||
Guides.Fishing.Section.2=[[DARK_AQUA]]Wie funktioniert Eisangeln?\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du in Eisseen angeln!\n[[YELLOW]]Wirf deine Angeln in einem Eissee aus\n[[YELLOW]]um ein kleines Loch zum Angeln zu erstellen.
|
||||
Guides.Fishing.Section.3=[[DARK_AQUA]]Wie funktioniert die Profiangel?\n[[YELLOW]]Mit dieser passiven F\u00E4higkeit bei\u00DFen mehr Fische an.\n[[YELLOW]]Sobald die F\u00E4higkeit freigeschaltet ist bringt das Angeln\n[[YELLOW]]in einem Boot oder Ozean die doppelte \n[[YELLOW]]Anbei\u00DFwahrscheinlichkeit.
|
||||
Guides.Fishing.Section.4=[[DARK_AQUA]]Wie funktioniert Rei\u00DFen?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glich es Monstern Items zu entrei\u00DFen,\n[[YELLOW]]indem du sie an deine Angel h\u00E4ngst. \n[[YELLOW]]Die Monster lassen das Item, das sie normalerweise beim Tod\n[[YELLOW]]fallen lassen fallen.\n[[YELLOW]]Au\u00DFerdem gibt es eine kleine Wahrscheinlichkeit Monstersch\u00E4del\n[[YELLOW]]zu bekommen.
|
||||
Guides.Fishing.Section.5=[[DARK_AQUA]]Wie funktioniert die Fischer-Mahlzeit?\n[[YELLOW]]Du wirst beim Essen von Fisch besser satt.
|
||||
Guides.Fishing.Section.6=[[DARK_AQUA]]Bemerkung zum Angeln:\n[[YELLOW]]Angeln Drops sind vollkommen anpassbar.\n[[YELLOW]]Ergebnisse unterscheiden sich deshalb von Server zu Server.
|
||||
##Herbalism
|
||||
Guides.Herbalism.Section.0=[[DARK_AQUA]]\u00DCber Pflanzenkunde\n[[YELLOW]]In Pflanzenkunde geht es um das Ernten.\n\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Ernte Pflanzen.
|
||||
Guides.Herbalism.Section.1=[[DARK_AQUA]]Kompatible Blocks\n[[YELLOW]]Weizen, Kartoffeln, Karotten, Melonen, K\u00FCrbisse,\n[[YELLOW]]Zuckerrohr, Kakaobohnen, Blumen, Kakteen,\n[[YELLOW]]Pilze, Netherwarzen, Seerosen und Ranken.
|
||||
Guides.Herbalism.Section.2=[[DARK_AQUA]]Wie funktioniert Gr\u00FCnes Land?\n[[YELLOW]]Gr\u00FCnes Land ist eine aktive F\u00E4higkeit die du aktivierst indem du\n[[YELLOW]]mit einer Harke in der Hand rechtsklickst.\n[[YELLOW]]Gr\u00FCnes Land erm\u00f6glicht einen 3-fachen Ertrag beim Ernten.\n[[YELLOW]]Au\u00DFerdem erm\u00F6glich es Leben in zu hauchen und sie\n[[YELLOW]]mithilfe von Samen aus dem Inventar zu verwandeln.
|
||||
Guides.Herbalism.Section.3=[[DARK_AQUA]]Wie funktioniert der Gr\u00FCne Daumen (Samen)?\n[[YELLOW]]Diese passive F\u00E4higkeit pflanz automatisch beim Ernten nach.\n[[YELLOW]]Der Erfolg h\u00E4ngt vom Pflanzenkunde Level ab.
|
||||
Guides.Herbalism.Section.4=[[DARK_AQUA]]Wie funktioniert der Gr\u00FCne Daumen(Blocks)?\n[[YELLOW]]Diese aktive F\u00E4higkeit erm\u00F6glich es Bl\u00F6cke in ihre \n[[YELLOW]]"Naturverwandte" Form zu verwandeln. Klicke dazu mit der\n[[YELLOW]]rechten Maustaste auf einen Block, w\u00E4hrend du Samen in\n[[YELLOW]]der Hand h\u00E4ltst. \n[[YELLOW]]Pro Versuch kostet es dich einen Samen.\n[[YELLOW]]Der Erfolg h\u00E4ngt vom Pflanzenkunde Level ab.
|
||||
Guides.Herbalism.Section.5=[[DARK_AQUA]]Wie funktioniert das Bauernfr\u00FChst\u00FCck?\n[[YELLOW]]Du wirst beim Essen von Brot, Keksen, Melonen, Pilzsuppe,\n[[YELLOW]]Karotten und Kartoffeln satter.
|
||||
Guides.Herbalism.Section.6=[[DARK_AQUA]]Wie funktioniert Hylians Gl\u00FCck?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dir eine Chance Items zu finden\n[[YELLOW]]wenn du bestimmte Bl\u00F6cke mit dem Schwert abbaust.
|
||||
Guides.Herbalism.Section.7=[[DARK_AQUA]]Wie funktionieren Doppeldrops?\n[[YELLOW]]Du erh\u00E4ltst beim Ernten mehr Ertrag.
|
||||
##Mining
|
||||
Guides.Mining.Section.0=[[DARK_AQUA]]\u00DCber Bergbau:\n[[YELLOW]]Im Bergbau musst du Steine und Erze sammeln. Du erh\u00E4ltst\n[[YELLOW]]ab und zu zus\u00E4tzliche Drops.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um Erfahrung zu sammeln musst du mit der Spitzhacke abbauen.\n[[YELLOW]]Nur bestimmte Blocks geben XP.
|
||||
Guides.Mining.Section.1=[[DARK_AQUA]]Kompatible Materialien:\n[[YELLOW]]Stein, Kohleerz, Eisenerz, Golderz, Diamanterz, Redstoneerz,\n[[YELLOW]]Lapiserz, Obsidian, Bemooster Bruchstein, Endstein,\n[[YELLOW]]Glowstone, und Netherrack.
|
||||
Guides.Mining.Section.2=[[DARK_AQUA]]Wie funktioniert Super-Brecher?:\n[[YELLOW]]Mache einen Rechtsklick w\u00E4hrend du eine Spitzhacke in der\n[[YELLOW]]Hand h\u00E4ltst.\n[[YELLOW]]Von nun an hast du ungef\u00E4hr 4 Sekunden um ein mit Bergbau\n[[YELLOW]]kompatibles Material abzubauen, daraufhin wird Super-Brecher\n[[YELLOW]]aktiviert.
|
||||
Guides.Mining.Section.3=[[DARK_AQUA]]Was ist Super-Brecher?\n[[YELLOW]]Super-Brecher ist eine F\u00E4higkeit deren Dauer\n[[YELLOW]]vom Bergbau Skill abh\u00E4ngt. Es verdreifacht die \n[[YELLOW]]Wahrscheinlichkeit Sch\u00E4tze zu finden und erm\u00F6glicht\n[[YELLOW]]sofortiges Abbauen kompatibler Materialien.
|
||||
Guides.Mining.Section.4=[[DARK_AQUA]]Wie benutzt man Z\u00FCndstoff?:\n[[YELLOW]]Halte ein Feuerzeug in der Hand, b\u00FCck dich und klicke aus\n[[YELLOW]]sicherer Entfernung mit der rechten Maustaste auf das TNT.\n[[YELLOW]]Das TNT wird sofort explodieren.
|
||||
Guides.Mining.Section.5=[[DARK_AQUA]]Wie funktioniert Z\u00FCndstoff?\n[[YELLOW]]Z\u00FCndstoff ist eine F\u00E4higkeit mit einer Abklingzeit, deren St\u00E4rke\n[[YELLOW]]vom Level abh\u00E4ngt. Sie erlaubt dir beim Abbauen mit TNT dieses\n[[YELLOW]]aus der Ferne zu z\u00FCnden. Z\u00FCndstoff besteht aus 3 Teilen.\n[[YELLOW]]Erstens dem Sprengmeister mit gr\u00F6\u00DFeren Explosionen\n[[YELLOW]]Zweitens dem Explosions-Experten, der Schaden von TNT\n[[YELLOW]]reduziert.\n[[YELLOW]]Die dritte F\u00E4higkeit erh\u00F6ht einfach den Erzertrag und\n[[YELLOW]]und reduziert den Schutt.
|
||||
##Repair
|
||||
Guides.Repair.Section.0=[[DARK_AQUA]]\u00DCber Reparatur:\n[[YELLOW]]Reparatur erlaub dir an einem Eisenblock Werkzeuge und\n[[YELLOW]]Waffen zu reparieren.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Repariere Werkzeuge am Eisenblockamboss\n[[RED]]Achtung: [[YELLOW]]Das ist nicht der normale Minecraft Amboss!
|
||||
Guides.Repair.Section.1=[[DARK_AQUA]]Wie kann ich Reparatur verwenden?\n[[YELLOW]]Platziere einen mcMMO Amboss, halte das zu reparierende Item\n[[YELLOW]]in der Hand und klicke mit der rechten Maustaste auf ihn. Zum\n[[YELLOW]]Reparieren benötigst du die Ausgangsmaterialien im Inventar,\n[[YELLOW]]diese werden dir im Zuge der Reparatur abgezogen.
|
||||
Guides.Repair.Section.2=[[DARK_AQUA]]Wie funktioniert der Reparatur Meister?\n[[YELLOW]]Mit dem Reparatur Meister wird dein Werkzeug ein bisschen\n[[YELLOW]]besser als normalerweise repariert.\n[[YELLOW]]Der Bonus ist abh\u00E4ngig vom Reparatur Level.
|
||||
Guides.Repair.Section.3=[[DARK_AQUA]]Wie funktioniert Super Reparatur?\n[[YELLOW]]Mit Super Reparatur werden ab und zu deine Items\n[[YELLOW]]doppelt so gut repariert.
|
||||
Guides.Repair.Section.4=[[DARK_AQUA]]Wie funktioniert Arkanes Schmieden?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glicht dir mit einer gewissen\n[[YELLOW]]Wahrscheinlichkeit Verzauberungen auf Items zu erhalten.\n[[YELLOW]]Verzauberungen k\u00F6nnen erhalten, vermindert werden oder\n[[YELLOW]]ganz verloren gehen.
|
||||
##Salvage
|
||||
Guides.Salvage.Section.0=[[DARK_AQUA]]\u00DCber Verwerten:\n[[YELLOW]]Mit einem Goldamboss kannst du R\u00FCstungen und\n[[YELLOW]]Werkzeuge verwerten.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Verwerten ist ein vom Angeln und Reparieren abh\u00E4ngiger Skill\n[[YELLOW]]Sein Level ist die H\u00E4lfte von deren Summe.
|
||||
Guides.Salvage.Section.1=[[DARK_AQUA]]Wie funktioniert Verwerten?\n[[YELLOW]]Platziere einen Goldamboss und rechtsklicke mit dem Item in\n[[YELLOW]]der Hand. Das item wird zerst\u00F6rt und in seine\n[[YELLOW]]Bestandteile zerlegt.\n\n[[YELLOW]]Beispielsweise gibt eine Eisenaxt Eisenbarren.
|
||||
Guides.Salvage.Section.2=[[DARK_AQUA]]Wie funktioniert Fortgeschrittenes Verwerten?\n[[YELLOW]]Sobald freigeschaltet, kannst du besch\u00E4digte Items verwerten.\n[[YELLOW]]Der Ertrag steigt mit dem Level.\n[[YELLOW]]Der Mindestertrag ist immer 1 Item, ansonsten kannst du nicht\n[[YELLOW]]verwerten.
|
||||
Guides.Salvage.Section.3=[[DARK_AQUA]]Zur Verbildlichung ein Beispiel:\n[[YELLOW]]Sagen wir verwerten eine Goldene Spitzhacke mit 80%\n[[YELLOW]]Haltbarkeit, bedeutet das, dass wir nur 2 Gold bekommen\n[[YELLOW]]k\u00F6nnen (Spitzhacke=3 Goldbarren, also jeder 33,33%\n[[YELLOW]]Haltbarkeit) was 66% entspricht. Wenn dein\n[[YELLOW]]Ertragsprozentsatz unter 66% liegt wirst du keine 2 Barren\n[[YELLOW]]bekommen k\u00F6nnen. Wenn sie dar\u00FCber ist, kannst du den\n[[YELLOW]]"gesamten Betrag" bekommen, der aus 2 Eisenbarren besteht.
|
||||
Guides.Salvage.Section.4=[[DARK_AQUA]]Wie funktioniert Arkanes Verwerten?\n[[YELLOW]]Diese F\u00E4higkeit erm\u00F6glicht es verzauberte B\u00FCcher beim\n[[YELLOW]]Verwerten von verzauberten Items zu bekommen.\n[[YELLOW]]Verzauberungen k\u00F6nnen vollkommen oder teilweise extrahiert\n[[YELLOW]]werden.\n[[YELLOW]]Bei einer teilweisen Extraktion wird das Verzauberungslevel\n[[YELLOW]]reduziert.
|
||||
##Smelting
|
||||
Guides.Smelting.Section.0=Kommt irgendwann mal...
|
||||
Guides.Smelting.Section.1=Immer noch hier?
|
||||
##Swords
|
||||
Guides.Swords.Section.0=[[DARK_AQUA]]\u00DCber Schwerter:\n[[YELLOW]]Diese F\u00E4higkeit gibt Kampfboni bei Benutzung\n[[YELLOW]]des Schwertes.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Verletze Monster und Spieler mit dem Schwert.
|
||||
Guides.Swords.Section.1=[[DARK_AQUA]]Wie funktioniert der S\u00E4gezahnschlag??\n[[YELLOW]]S\u00E4gezahnschlag ist eine aktive F\u00E4higkeit die du mit Rechtsklick \n[[YELLOW]]aktivierst.\n[[YELLOW]]Mit dieser F\u00E4higkeit kannst du Fl\u00E4chenschaden verteilen. \n[[YELLOW]]Au\u00DFerdem blutet das Ziel f\u00FCr kurze Zeit.
|
||||
Guides.Swords.Section.2=[[DARK_AQUA]]Wie funktioniert der Gegenangriff?\n[[YELLOW]]Gegenangriff ist eine aktive F\u00E4higkeit,\n[[YELLOW]]bei der Angriffe von Monstern beim Blocken um bis zu 50%\n[[YELLOW]]des erhaltenen Schadens reflektiert werden k\u00F6nnen.
|
||||
Guides.Swords.Section.3=[[DARK_AQUA]]Wie funktioniert Blutung?\n[[YELLOW]]Blutung f\u00FCgt den Gegnern alle 2 Sekunden Schaden zu. Das\n[[YELLOW]]Bluten geht solange bis die F\u00E4higkeit ausl\u00E4uft oder der\n[[YELLOW]]Gegner stirbt.\n[[YELLOW]]Die Dauer der Blutung erh\u00F6ht sich mit dem Schwert Skill.
|
||||
##Taming
|
||||
Guides.Taming.Section.0=[[DARK_AQUA]]\u00DCber Z\u00E4hmen:\n[[YELLOW]]Z\u00E4hmen gibt dem Spieler diverse Kampfboni beim Kampf mit\n[[YELLOW]]gez\u00E4hmten W\u00F6lfen.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Um XP zu bekommen musst du Tiere z\u00E4hmen oder mit\n[[YELLOW]]deinen W\u00F6lfen k\u00E4mpfen.
|
||||
Guides.Taming.Section.1=[[DARK_AQUA]]Wie funktioniert Ruf der Wildnis?\n[[YELLOW]]Ruf der Wildnis ist eine aktive F\u00E4higkeit die dir erlaubt\n[[YELLOW]]einen Wolf, einen Ozelot oder ein Pferd an deine Seite zu\n[[YELLOW]]rufen. \n[[YELLOW]]Das tust du, indem du Linksklickst w\u00E4hrend du Knochen, Fisch\n[[YELLOW]]oder \u00C4pfel in der Hand h\u00E4ltst.
|
||||
Guides.Taming.Section.2=[[DARK_AQUA]]Wie funktioniert Bestienkunde?\n[[YELLOW]]Bestienkunde erlaubt es die Haustiere zu inspizieren\n[[YELLOW]]Halte einen Knochen in der Hand und klick mit linker Maustaste\n[[YELLOW]]auf das Haustier um Bestienkunde zu aktivieren.
|
||||
Guides.Taming.Section.3=[[DARK_AQUA]]Wie funktioniert Aufschlitzen?\n[[YELLOW]]Aufschlitzen ist eine passive F\u00E4higkeit die beim Ziel\n[[YELLOW]]des Wolfes Blutungen hervorrufen kann. Der Erfolg h\u00E4ngt\n[[YELLOW]]vom Z\u00E4hmen Level ab.
|
||||
Guides.Taming.Section.4=[[DARK_AQUA]]Wie funktionieren gesch\u00E4rfte Klauen?\n[[YELLOW]]Gesch\u00E4rfte Klauen geben Zusatzschaden in Abh\u00E4ngigkeit\n[[YELLOW]]vom Z\u00E4hmen Level.
|
||||
Guides.Taming.Section.5=[[DARK_AQUA]]Wie funktioniert Umweltbewusst?\n[[YELLOW]]Diese passive F\u00E4higkeit erm\u00F6glich W\u00F6lfen sich zu dir zu\n[[YELLOW]]teleportieren wenn sie in die N\u00E4he von Gefahren wie \n[[YELLOW]]Kakteen/Lava kommen. \n[[YELLOW]]Zus\u00E4tzlich sind W\u00F6lfe immun gegen Fallschaden.
|
||||
Guides.Taming.Section.6=[[DARK_AQUA]]Wie funktioniert Dicker Pelz?\n[[YELLOW]]Diese passive F\u00E4higkeit reduziert Schaden und \n[[YELLOW]]macht W\u00F6lfe feuerresistent.
|
||||
Guides.Taming.Section.7=[[DARK_AQUA]]Wie funktioniert Schocksicher?\n[[YELLOW]]Diese passive F\u00E4higkeit reduziert den Schaden\n[[YELLOW]]durch Explosionen.
|
||||
Guides.Taming.Section.8=[[DARK_AQUA]]Wie funktioniert Schnell-Imbiss?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dem Wolf eine Chance sich zu \n[[YELLOW]]erholen wann immer er einen Gegner verletzt.
|
||||
##Unarmed
|
||||
Guides.Unarmed.Section.0=[[DARK_AQUA]]\u00DCber Unbewaffnet:\n[[YELLOW]]Mit Unbewaffnet kann der echte Mann endlich mit seinen\n[[YELLOW]]F\u00E4usten angemessen zuschlagen. \n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]K\u00E4mpfe unbewaffnet gegen Monster und andere Spieler
|
||||
Guides.Unarmed.Section.1=[[DARK_AQUA]]Wie funktioniert Berserker?\n[[YELLOW]]Berserker ist eine aktive F\u00E4higkeit die mit Rechtsklick\n[[YELLOW]]aktiviert wird.\n[[YELLOW]]Im Berserker Modus f\u00FCgst du 50% mehr Schaden zu und\n[[YELLOW]]kannst weiche Materiale wie Gras und Erde sofort abbauen.
|
||||
Guides.Unarmed.Section.2=[[DARK_AQUA]]Wie funktioniert der Eiserne Arm?\n[[YELLOW]]Eiserner Arm erh\u00F6ht den Monstern und Spielern mit den\n[[YELLOW]]F\u00E4usten zugef\u00FCgten Schaden.
|
||||
Guides.Unarmed.Section.3=[[DARK_AQUA]]Wie funktioniert Pfeilablenkung?\n[[YELLOW]]Pfeilablenkung ist eine passive F\u00E4higkeit die ab und zu\n[[YELLOW]]Pfeile von Skeletten und angreifenden Spielern ablenkt.\n[[YELLOW]]Diese Pfeile prallen einfach ab und fallen auf den Boden.
|
||||
Guides.Unarmed.Section.4=[[DARK_AQUA]]Wie funktioniert der Eiserne Griff?\n[[YELLOW]]Eiserner Griff ist eine passive F\u00E4higkeit die Entwaffnung\n[[YELLOW]]verhindert. Mit h\u00F6herem Level ist es umso einfacher\n[[YELLOW]]Entwaffnung zu verhindern.
|
||||
Guides.Unarmed.Section.5=[[DARK_AQUA]]Wie funktioniert Entwaffnen?\n[[YELLOW]]Diese passive F\u00E4higkeit erm\u00F6glich es den Gegner zu\n[[YELLOW]]entwaffnen, sodass seine Waffe auf den Boden f\u00E4llt.
|
||||
##Woodcutting
|
||||
Guides.Woodcutting.Section.0=[[DARK_AQUA]]\u00DCber Holzf\u00E4ller:\n[[YELLOW]]Im Holzf\u00E4llen geht es um das F\u00E4llen von B\u00E4umen.\n\n[[DARK_AQUA]]XP ZUWACHS:\n[[YELLOW]]Du kriegst XP f\u00FCr das abholzen von Baumst\u00E4mmen.
|
||||
Guides.Woodcutting.Section.1=[[DARK_AQUA]]Wie funktioniert der Baumf\u00E4ller?\n[[YELLOW]]Baumf\u00E4ller ist eine aktive F\u00E4higkeit. Mache mit der Axt in der\n[[YELLOW]]Hand einen Rechtsklick um sie zu aktivieren. Der Baum\n[[YELLOW]]wird sofortig gef\u00E4llt und alle St\u00E4mme abgebaut.
|
||||
Guides.Woodcutting.Section.2=[[DARK_AQUA]]Wie funktioniert Bl\u00E4ttersturm?\n[[YELLOW]]Bl\u00E4ttersturm ist eine passive F\u00E4higkeit die Bl\u00E4tter\n[[YELLOW]]bei Ber\u00FChrung mit der Axt sofortig bricht. Standardm\u00E4\u00DFig\n[[YELLOW]]wird diese F\u00E4higkeit bei Level 100 freigeschaltet.
|
||||
Guides.Woodcutting.Section.3=[[DARK_AQUA]]Wie funktionieren Doppel-Drops?\n[[YELLOW]]Diese passive F\u00E4higkeit gibt dir ab und zu doppelten\n[[YELLOW]]Ertrag f\u00FCr jeden Stamm den du f\u00E4llst.
|
||||
#INSPECT
|
||||
Inspect.Offline=[[RED]]Du hast nicht die Rechte um offline Spieler zu inspizieren!
|
||||
Inspect.OfflineStats=mcMMO Stats f\u00FCr Offline Spieler [[YELLOW]]{0}
|
||||
Inspect.Stats=[[GREEN]]mcMMO Stats f\u00FCr [[YELLOW]]{0}
|
||||
Inspect.TooFar=Du bist zu weit entfernt um den Spieler zu inspizieren!
|
||||
#ITEMS
|
||||
Item.ChimaeraWing.Fail=**CHIMAERA FL\u00DCGEL GESCHEITERT!**
|
||||
Item.ChimaeraWing.Pass=**CHIMAERA FL\u00DCGEL*
|
||||
Item.ChimaeraWing.Name=Chimaera Fl\u00FCgel
|
||||
Item.ChimaeraWing.Lore=[[GRAY]]Teleportiert dich zu deinem Bett.
|
||||
Item.Generic.Wait=Du musst warten bis du das wieder verwenden kannst! [[YELLOW]]({0}s)
|
||||
Item.Injured.Wait=Du wurdest vor kurzem verletzt und musst warten bis du das verwenden kannst. [[YELLOW]]({0}s)
|
||||
Item.FluxPickaxe.Name=Flux Spitzhacke
|
||||
Item.FluxPickaxe.Lore.1=[[GRAY]]Hat eine Wahrscheinlichkeit Erze sofort zu schmelzen.
|
||||
Item.FluxPickaxe.Lore.2=[[GRAY]]Ben\u00F6tigt Schmelzen Level {0}+
|
||||
#TELEPORTATION
|
||||
Teleport.Commencing=[[GRAY]]Beginne Teleport in [[GOLD]]({0}) [[GRAY]]Sekunden, bitte stillhalten...
|
||||
Teleport.Cancelled=[[DARK_RED]]Teleport abgebrochen!
|
||||
#SKILLS
|
||||
Skills.Child=[[GOLD]](VERWANDTER SKILL)
|
||||
Skills.Disarmed=[[DARK_RED]]Du wurdest entwaffnet!
|
||||
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
|
||||
Skills.NeedMore=[[DARK_RED]]Du brauchst mehr[[GRAY]]{0}
|
||||
Skills.Parents=ELTERN
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.ChildStats={0}[[GREEN]]{1}
|
||||
Skills.TooTired=Du bist zu m\u00FCde um diese F\u00E4higkeit zu verwenden. [[YELLOW]]({0}s)
|
||||
Skills.Cancelled={0} abgebrochen!
|
||||
Skills.ConfirmOrCancel=[[GREEN]]Erneuter Rechtsklick zur Best\u00E4tigung [[GOLD]]{0}[[GREEN]]. Linksklick zum abbrechen.
|
||||
#STATISTICS
|
||||
Stats.Header.Combat=[[GOLD]]-=KAMPFSKILLS=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=SAMMELSKILLS=-
|
||||
Stats.Header.Misc=[[GOLD]]-=DIV.SKILLS=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] Stats
|
||||
#PERKS
|
||||
Perks.XP.Name=Erfahrung
|
||||
Perks.XP.Desc=Erhalte mehr Erfahrung in bestimmen Skills.
|
||||
Perks.Lucky.Name=Gl\u00FCck
|
||||
Perks.Lucky.Desc={0} Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert.
|
||||
Perks.Lucky.Desc.Login=Bestimmte Skills und F\u00E4higkeiten werden um 33.3% \u00F6fter aktiviert.
|
||||
Perks.Lucky.Bonus=[[GOLD]] ({0} mit Gl\u00FCcksbonus)
|
||||
Perks.Cooldowns.Name=Schnelle Erholung
|
||||
Perks.Cooldowns.Desc=Verk\u00FCrzt die Abklingzeit um {0}.
|
||||
Perks.ActivationTime.Name=Ausdauer
|
||||
Perks.ActivationTime.Desc=Erh\u00F6ht die F\u00E4higkeitszeit um {0} Sekunden.
|
||||
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s mit Ausdauer Bonus)
|
||||
#HARDCORE
|
||||
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Hardcore Modus {0} deaktiviert f\u00FCr {1}.
|
||||
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Hardcore Modus {0} aktiviert f\u00FCr {1}.
|
||||
Hardcore.DeathStatLoss.Name=Skillverlust bei Tod:
|
||||
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Du hast durch den Tod[[BLUE]]{0}[[DARK_RED]] Level verloren.
|
||||
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] Der Verlustprozentsatz wurde auf {0} ge\u00E4ndert.
|
||||
Hardcore.Vampirism.Name=Vampirismus
|
||||
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] war nicht erfahren genug um dir Wissen zu hinterlassen.
|
||||
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Du hast [[BLUE]]{0}[[DARK_AQUA]] Level von [[YELLOW]]{1} [[DARK_AQUA]] gestohlen.
|
||||
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] hat es nicht geschafft Wissen von dir zu stehlen!
|
||||
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] hat[[BLUE]]{1}[[DARK_RED]] Level von dir gestohlen!
|
||||
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] Der Vampirismus Prozentsatz wurde auf {0} ge\u00E4ndert.
|
||||
#MOTD
|
||||
MOTD.Donate=[[DARK_AQUA]]Spenden Info:
|
||||
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Hardcore Modus aktiviert: [[DARK_RED]]{0}
|
||||
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Skillverlust bei Tod: [[DARK_RED]]{0}%
|
||||
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Vampirismus Prozentsatz: [[DARK_RED]]{0}%
|
||||
MOTD.PerksPrefix=[mcMMO Boni]
|
||||
MOTD.Version=[[GOLD]][mcMMO] Verwende Version[[DARK_AQUA]]{0}
|
||||
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Webseite
|
||||
#SMELTING
|
||||
Smelting.Ability.FluxMining=Schmelztiegel: [[YELLOW]]{0}
|
||||
Smelting.Ability.FuelEfficiency=Brennstoff Effizienz Multiplikator: [[YELLOW]]{0}x
|
||||
Smelting.Ability.Locked.0=GESPERRT bis {0}+ Skill (XP BOOST)
|
||||
Smelting.Ability.Locked.1=GESPERRT bis {0}+ Skill (SCHMELZTIEGEL)
|
||||
Smelting.Ability.SecondSmelt=Extra Schmelzung: [[YELLOW]]{0}
|
||||
Smelting.Ability.VanillaXPBoost=Vanilla XP Multiplikator: [[YELLOW]]{0}x
|
||||
Smelting.SubSkill.FuelEfficiency.Name=Brennstoff Effizienz
|
||||
Smelting.SubSkill.FuelEfficiency.Description=Erh\u00F6he die Brenndauer des Brennstoffes in \u00D6fen
|
||||
Smelting.SubSkill.SecondSmelt.Name=Extra Schmelzung
|
||||
Smelting.SubSkill.SecondSmelt.Description=Verdoppelt den Ertrag beim Schmelzen
|
||||
Smelting.Effect.4=Vanilla XP Boost
|
||||
Smelting.Effect.5=Erh\u00F6ht die erhaltene Erfahrung beim Schmelzen
|
||||
Smelting.SubSkill.FluxMining.Name=Schmelztiegel
|
||||
Smelting.SubSkill.FluxMining.Description=M\u00F6glichkeit, Erze direkt beim Abbauen zu Schmelzen
|
||||
Smelting.Listener=Schmelzen:
|
||||
Smelting.SkillName=SCHMELZEN
|
||||
#COMMAND DESCRIPTIONS
|
||||
Commands.Description.addlevels=Gib einem Spieler mcMMO Level
|
||||
Commands.Description.adminchat=Schalte den mcMMO Adminchat an/aus oder sende Adminchat Nachrichten
|
||||
Commands.Description.addxp=Gib einem Spieler mcMMO XP
|
||||
Commands.Description.hardcore=\u00C4ndere den mcMMO hardcore Prozentsatz oder schalte den hardcore Modus an/aus
|
||||
Commands.Description.inspect=Sieh detaillierte mcMMO Informationen \u00FCber einen anderen Spieler
|
||||
Commands.Description.mcability=Schalte die Bereitschaft von mcMMO F\u00E4higkeiten bei Rechtsklick an/aus
|
||||
Commands.Description.mccooldown=Sieh alle mcMMO F\u00E4higkeiten Abklingzeiten
|
||||
Commands.Description.mcgod=Schalte mcMMO godmode an/aus
|
||||
Commands.Description.mchud=\u00C4ndere deinen mcMMO HUD Stil
|
||||
Commands.Description.mcmmo=Zeige eine kurze Beschreibung von mcMMO
|
||||
Commands.Description.mcnotify=Schalte die meisten mcMMO F\u00E4higkeiten Hinweise im Chat an/aus
|
||||
Commands.Description.mcpurge=Bereinige die mcMMO Datenbank von Spielern die {0} Monate nicht online waren oder 0 Level haben.
|
||||
Commands.Description.mcrank=Zeige das mcMMO Ranking f\u00FCr einen Spieler
|
||||
Commands.Description.mcrefresh=Aktualisiere alle Abklingzeiten f\u00FCr mcMMO
|
||||
Commands.Description.mcremove=Entferne einen Benutzer aus der mcMMO Datenbank
|
||||
Commands.Description.mcscoreboard=Verwalte deine mcMMO \u00DCbersicht
|
||||
Commands.Description.mcstats=Zeige deine mcMMO Level und XP
|
||||
Commands.Description.mctop=Zeige die mcMMO Bestenlisten
|
||||
Commands.Description.mmoedit=Editiere die mcMMO Level bei einem Benutzer
|
||||
Commands.Description.mmoupdate=Migriere die mcMMO Datenbank von einer alten Datenbank zur aktuellen
|
||||
Commands.Description.mcconvert=Konvertiert Datenbanktypen oder Erfahrungsformeln
|
||||
Commands.Description.mmoshowdb=Zeige den Namen der aktuellen Datenbank (zur Benutzung mit /mmoupdate)
|
||||
Commands.Description.party=Steuere verschiedene mcMMO Party Einstellungen
|
||||
Commands.Description.partychat=Schalte den mcMMO Party Chat an/aus oder send Party Nachrichten
|
||||
Commands.Description.ptp=Teleportiere zu einem mcMMO Party Mitglied
|
||||
Commands.Description.Skill=Zeige detaillierte Informationen zu einem mcMMO Skill {0}
|
||||
Commands.Description.skillreset=Setze die mcMMO Level f\u00FCr einen Spieler zur\u00FCck
|
||||
Commands.Description.vampirism=Schalte Vampirismus an/aus / \u00E4ndere den Vampirismus Prozentsatz
|
||||
Commands.Description.xplock=Setze deine mcMMO XP-Leiste auf einen bestimmten Skill fest
|
||||
Commands.Description.xprate=\u00C4ndere die mcMMO XP Rate oder starte ein XP Event
|
||||
#UPDATE CHECKER
|
||||
UpdateChecker.Outdated=Du verwendest eine veraltete mcMMO Version!
|
||||
UpdateChecker.NewAvailable=Eine neue Version ist auf BukkitDev erh\u00E4ltlich.
|
||||
#SCOREBOARD HEADERS
|
||||
Scoreboard.Header.PlayerStats=mcMMO Stats
|
||||
Scoreboard.Header.PlayerCooldowns=mcMMO Abklingzeiten
|
||||
Scoreboard.Header.PlayerRank=mcMMO Bestenlisten
|
||||
Scoreboard.Header.PlayerInspect=mcMMO Stats: {0}
|
||||
Scoreboard.Header.PowerLevel=Gesamt Level
|
||||
Scoreboard.Misc.PowerLevel=[[GOLD]]Gesamt Level
|
||||
Scoreboard.Misc.Level=[[DARK_AQUA]]Level
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]Aktuelle XP
|
||||
Scoreboard.Misc.RemainingXP=Verbliebene XP
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Abklingzeit
|
||||
Scoreboard.Misc.Overall=[[GOLD]]Insgesamt
|
||||
Scoreboard.Misc.Ability=F\u00E4higkeit
|
||||
#DATABASE RECOVERY
|
||||
Profile.Loading.Success=[[GREEN]]Your mcMMO profile has been loaded.
|
||||
Profile.Loading.Failure=mcMMO still cannot load your data. You may want to [[AQUA]]contact the server owner.\n[[YELLOW]]You can still play on the server, but you will have [[BOLD]]no mcMMO levels[[YELLOW]] and any XP you get [[BOLD]]will not be saved[[YELLOW]].
|
||||
Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO was unable to load the player data for [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Please inspect your database setup.
|
||||
@@ -1,162 +0,0 @@
|
||||
Acrobatics.Ability.Proc=[[GREEN]]**Kecses Landol\u00e1s**
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Elker\u00fclve**
|
||||
Acrobatics.Listener=Akrobatika:
|
||||
Acrobatics.SkillName=AKROBATIKA
|
||||
Acrobatics.Skillup=Akrobatika fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Archery.Listener=\u00cdj\u00e1szat:
|
||||
Archery.SkillName=\u00cdJ\u00c1SZAT
|
||||
Archery.Skillup=\u00cdj\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Axes.Ability.Bonus.0=Mesteri balta
|
||||
Axes.Ability.Lower=[[GRAY]]**LETETTED A BALT\u00c1DAT**
|
||||
Axes.Ability.Ready=[[GREEN]]**ELK\u00c9SZ\u00cdTETTED BALT\u00c1DAT**
|
||||
Axes.Combat.GI.Struck=**HATALMAS EREJ\u0170 \u00dcT\u00c9S**
|
||||
Axes.SubSkill.CriticalStrikes.Description=Dupla sebz\u00e9s
|
||||
Axes.SubSkill.AxeMastery.Name=Mesteri balta
|
||||
Axes.Listener=Balt\u00e1k:
|
||||
Axes.SkillName=BALT\u00c1K
|
||||
Axes.Skills.SS.On=[[GREEN]]**Koponya T\u00f6r\u0151 AKTIV\u00c1LVA**
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Koponya T\u00f6r\u0151t!
|
||||
Excavation.Ability.Lower=[[GRAY]]**LETETTED AZ \u00c1S\u00d3DAT**
|
||||
Excavation.Ability.Ready=[[GREEN]]**EL\u0150VETTED AZ \u00c1S\u00d3DAT**
|
||||
Excavation.Listener=\u00c1s\u00e1s:
|
||||
Excavation.SkillName=\u00c1S\u00c1S
|
||||
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]A TE [[YELLOW]]Giga B\u00e1ny\u00e1sz B\u00e1ny\u00e1sz Cs\u00e1k\u00e1ny [[GREEN]]k\u00e9pesseged friss\u00fclt!
|
||||
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1latban [[RED]]Giga B\u00e1ny\u00e1sz Cs\u00e1k\u00e1ny!
|
||||
Excavation.Skillup=\u00c1s\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Fishing.SubSkill.IceFishing.Name=J\u00e9g Horg\u00e1szat
|
||||
Fishing.Listener=Horg\u00e1szat:
|
||||
Fishing.SkillName=HORG\u00c1SZAT
|
||||
Herbalism.Ability.Lower=[[GRAY]]**LETETTED A KAP\u00c1DAT**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**EL\u0150K\u00c9SZ\u00cdTETTED A KAP\u00c1DAT**
|
||||
Herbalism.Listener=Gy\u00f3gyn\u00f6v\u00e9nytan:
|
||||
Herbalism.SkillName=GY\u00d3GYN\u00d6V\u00c9NYTAN
|
||||
Herbalism.Skillup=Gy\u00f3gyn\u00f6v\u00e9nytan fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Mining.Ability.Length=Szupercs\u00e1k\u00e1ny t\u00e1vols\u00e1g: [[YELLOW]]{0}s
|
||||
Mining.Ability.Lower=[[GRAY]]**LETETTED A CS\u00c1K\u00c1NYOD**
|
||||
Mining.Ability.Ready=[[GREEN]]**CS\u00c1K\u00c1NYOD K\u00c9SZEN \u00c1LL**
|
||||
Mining.Listener=B\u00e1ny\u00e1sz\u00e1s:
|
||||
Mining.SkillName=B\u00c1NY\u00c1SZ\u00c1S
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A [[YELLOW]] Szuper Z\u00faz\u00f3 [[GREEN]]k\u00e9pess\u00e9ged \u00fajra haszn\u00e1lhat\u00f3!
|
||||
Mining.Skillup=B\u00e1ny\u00e1szat fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Mining.Blast.Refresh=[[GREEN]]A [[YELLOW]]Robban\u00f3 B\u00e1ny\u00e1szat [[GREEN]]k\u00e9pess\u00e9ged \u00fajra el\u00e9rhet\u0151!
|
||||
Repair.SubSkill.Repair.Name=Jav\u00edt\u00e1s
|
||||
Repair.SubSkill.Repair.Description=Eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.GoldRepair.Description=Arany eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.IronRepair.Description=Vas eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.StoneRepair.Description=K\u0151 eszk\u00f6z\u00f6k jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.RepairMastery.Name=Jav\u00edt\u00f3 mester
|
||||
Repair.SubSkill.SuperRepair.Name=Szuper jav\u00edt\u00e1s
|
||||
Repair.SubSkill.DiamondRepair.Description=Gy\u00e9m\u00e1nt eszk\u00f6z\u00f6k \u00e9s felszerel\u00e9sek jav\u00edt\u00e1sa
|
||||
Repair.SubSkill.ArcaneForging.Description=M\u00e1gikus t\u00e1rgyak megjav\u00edt\u00e1sa
|
||||
Repair.Listener=Jav\u00edt\u00e1s:
|
||||
Repair.SkillName=JAV\u00cdT\u00c1S
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy gy\u00e9m\u00e1nt t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy arany t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptIron=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy vas t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Nem vagy el\u00e9g k\u00e9pzett ahhoz, hogy arany t\u00e1rgyakat jav\u00edts.
|
||||
Repair.Skills.StackedItems=[[DARK_RED]]Nem tudsz jav\u00edtani st\u00f3colt t\u00e1rgyakat
|
||||
Repair.Skillup=Jav\u00edt\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Repair.Pretty.Name=Jav\u00edt\u00e1s
|
||||
Repair.Arcane.Fail=A t\u00e1rgyon l\u00e9v\u0151 var\u00e1zslat szertefoszlott.
|
||||
Swords.Ability.Lower=[[GRAY]]**ELTETTED A KARDOD**
|
||||
Swords.Ability.Ready=[[GREEN]]**A KARDOD K\u00c9SZEN \u00c1LL**
|
||||
Swords.Combat.Bleeding.Started=[[DARK_RED]] V\u00e9rzel!
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]A v\u00e9rz\u00e9s [[GREEN]]elm\u00falt[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**ELLENS\u00c9G V\u00c9RZIK**
|
||||
Swords.Listener=Kardok:
|
||||
Swords.SkillName=KARDOK
|
||||
Swords.Skills.SS.On=[[GREEN]]**F\u0170R\u00c9SZES CSAP\u00c1S AKTIV\u00c1LVA**
|
||||
Swords.Skillup=Harc fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Taming.SubSkill.ShockProof.Description=Robban\u00e1si Sebz\u00e9s Ellen\u00e1ll\u00e1s
|
||||
Taming.SubSkill.FastFoodService.Name=Gyors Kaja Szolg\u00e1ltat\u00e1s
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]A farkasod visszat\u00e9rt hozz\u00e1d...
|
||||
Taming.Listener=Szelid\u00edt\u00e9s:
|
||||
Taming.SkillName=SZELID\u00cdT\u00c9S
|
||||
Taming.Skillup=Szelid\u00edt\u00e9s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Unarmed.Ability.Lower=[[GRAY]]**LETETTED KEZEIDET**
|
||||
Unarmed.Ability.Ready=[[GREEN]]**EL\u0150K\u00c9SZ\u00cdTETTED KEZEIDET**
|
||||
Unarmed.Listener=Fegyvertelen:
|
||||
Unarmed.SkillName=FEGYVERTELEN
|
||||
Unarmed.Skills.Berserk.Off=**Tombol\u00e1sod befejez\u0151d\u00f6tt**
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1lta a [[RED]]Tombol\u00e1st!
|
||||
Unarmed.Skillup=Fegyvertelen fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Woodcutting.Ability.0=Lev\u00e9l F\u00faj\u00f3
|
||||
Woodcutting.Ability.1=Elf\u00fajja a leveleket.
|
||||
Woodcutting.Listener=Fav\u00e1g\u00e1s:
|
||||
Woodcutting.SkillName=FAV\u00c1G\u00c1S
|
||||
Woodcutting.Skills.TreeFeller.Off=**Fa D\u00f6nt\u00e9s befejezve**
|
||||
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**FA D\u00d6NT\u0150 AKTIV\u00c1LVA **
|
||||
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] haszn\u00e1latban [[RED]]Fa D\u00f6nt\u0151!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Ez a fa t\u00fal nagy!
|
||||
Woodcutting.Skillup=Fav\u00e1g\u00e1s fejl\u0151d\u00f6tt {0} szinttel. \u00d6sszesen: ({1})
|
||||
Ability.Generic.Refresh=[[GREEN]]**K\u00c9PESS\u00c9GEK FRISS\u00cdTVE!**
|
||||
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]\u00c9let ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Tulajdonos ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Bolyhosat \u00e9rintettem. Elsz\u00e9d\u00fcltem.
|
||||
Commands.AdminChat.Off=Admin Chat [[RED]]kikapcsolva
|
||||
Commands.AdminChat.On=Admin Chat [[RED]]bekapcsolva
|
||||
Commands.AdminToggle=- Admin chat \u00e1tv\u00e1ltva
|
||||
Commands.Disabled=Ez a parancs jelenleg le van tiltva.
|
||||
Commands.DoesNotExist=Ilyen nev\u0171 j\u00e1t\u00e9kos nincs az adatb\u00e1zisban!
|
||||
Commands.GodMode.Disabled=mcMMO Istenm\u00f3d letiltva
|
||||
Commands.GodMode.Forbidden=[mcMMO] Istenm\u00f3d nem lehets\u00e9ges ebben a vil\u00e1gban! (N\u00e9zd meg a jogokat)
|
||||
Commands.Party.Invite.Accepted=[[GREEN]]Megh\u00edv\u00e1st sikeresen elfogadtad {0} party-ra!
|
||||
Commands.Invite.Success=[[GREEN]]Megh\u00edv\u00f3 sikeresen elk\u00fcldve.
|
||||
Commands.mcc.Header=---[][[YELLOW]]mcMMO Parancsok[[RED]][]---
|
||||
Commands.mcgod=- V\u00e1lt\u00e1s GodModba
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - M\u00f3dos\u00edtva
|
||||
Commands.Other=[[GREEN]]--Egy\u00e9b Parancsok--
|
||||
Commands.Party.Accept=- Parti megh\u00edv\u00e1s elfogadva
|
||||
Commands.Party.Chat.Off=Party Chat [[RED]]kikapcsolva
|
||||
Commands.Party.Chat.On=Party Chat [[GREEN]]bekapcsolva
|
||||
Commands.Party.Commands=[[GREEN]]--Party Parancsok--
|
||||
Commands.Party.Invite.0=FIGYELEM: [[GREEN]]Kapt\u00e1l egy party megh\u00edv\u00f3t a {0} party-ba. Megh\u00edv\u00f3: {1}
|
||||
Commands.Party.Rename=[[GRAY]]A party \u00faj neve: [[WHITE]]{0}
|
||||
Commands.Party.Kick=Kidobtak a csoportb\u00f3l {0}!
|
||||
Commands.Party.Leave=Elhagytad a party-t
|
||||
Commands.Party.Quit=- Kil\u00e9pt\u00e9l a jelenlegi partib\u00f3l
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Energia szint [[YELLOW]Ranglista--
|
||||
Commands.PowerLevel=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0}
|
||||
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Dics\u0151s\u00e9glista--
|
||||
Commands.Stats.Self=STATISZTIK\u00c1ID
|
||||
Commands.Stats=- mcMMO Statisztik\u00e1d
|
||||
Commands.ToggleAbility=- K\u00e9pess\u00e9g aktiv\u00e1l\u00e1sa jobb gombbal
|
||||
Commands.Usage.PartyName=n\u00e9v
|
||||
Commands.Usage.Password=jelsz\u00f3
|
||||
Party.InformedOnJoin={0} [[GREEN]]csatlakozott a party-dba
|
||||
Party.InformedOnQuit={0} [[GREEN]]elment a party-db\u00f3l
|
||||
Party.Player.Invalid=Nincs ilyen nev\u0171 j\u00e1t\u00e9kos.
|
||||
Party.Player.InSameParty={0} m\u00e1r bent van a party-dban!
|
||||
Party.PlayerNotInParty=[[DARK_RED]]{0} nincs benne a party-ba
|
||||
Party.Teleport.Dead=Nem teleport\u00e1lhatsz halott j\u00e1t\u00e9kosra.
|
||||
Party.Teleport.Target=[[GREEN]]{0} hozz\u00e1d teleport\u00e1lt.
|
||||
Party.Unlocked=[[GRAY]]Csoport nyitva
|
||||
Party.ShareType.Item=T\u00c1RGY
|
||||
Party.ShareMode.Random=V\u00c9LETLEN
|
||||
Party.ItemShare.Category.Mining=B\u00e1ny\u00e1sz\u00e1s
|
||||
Party.ItemShare.Category.Woodcutting=Fav\u00e1g\u00e1s
|
||||
Commands.XPGain.Acrobatics=Es\u00e9s
|
||||
Commands.XPGain.Axes=Sz\u00f6rnyek T\u00e1mad\u00e1sa
|
||||
Commands.XPGain.Excavation=\u00c1sni \u00e9s kincset tal\u00e1lni.
|
||||
Commands.XPGain.Herbalism=N\u00f6v\u00e9nyek betakar\u00edt\u00e1sa
|
||||
Commands.XPGain.Mining=K\u0151 \u00e9s \u00e9rcek kib\u00e1ny\u00e1sz\u00e1sa
|
||||
Commands.XPGain.Repair=Jav\u00edt\u00e1s
|
||||
Commands.XPGain.Swords=Sz\u00f6rnyek sebz\u00e9se
|
||||
Commands.XPGain.Taming=\u00c1llatok idom\u00edt\u00e1sa vagy harc a farkasoddal
|
||||
Commands.XPGain=[[DARK_GRAY]]KAPOTT TP: [[WHITE]]{0}
|
||||
Commands.xplock.unlocked=[[GOLD]]Az XP cs\u00edkod [[GREEN]]FELOLDVA[[GOLD]]!
|
||||
Commands.xprate.started.0=[[GOLD]]mcMMO XP event kezdet\u00e9t vette!
|
||||
XPRate.Event=[[GOLD]]mcMMO-ban most TP r\u00e1ta n\u00f6vel\u0151 esem\u00e9ny van! TP r\u00e1ta {0}x!
|
||||
Effects.Effects=EFFEKTEK
|
||||
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
|
||||
Guides.Page.OutOfRange=Ez a lap nem l\u00e9tezik, \u00f6sszesen {0} lap van.
|
||||
Guides.Smelting.Section.0=Hamarosan...
|
||||
Skills.Disarmed=[[DARK_RED]]Lefegyvereztek!
|
||||
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
|
||||
Skills.TooTired=T\u00fal f\u00e1radt vagy hogy haszn\u00e1ld ezt a k\u00e9pess\u00e9get. [[YELLOW]]({0}s)
|
||||
Stats.Header.Combat=[[GOLD]]-=HARCI K\u00c9PZETTS\u00c9GEK=-
|
||||
Stats.Header.Gathering=[[GOLD]]-= GY\u0170JT\u00d6GET\u0150 K\u00c9PESS\u00c9GEK=-
|
||||
Stats.Header.Misc=[[GOLD]]-=EGY\u00c9B SKILLEK=-
|
||||
Stats.Own.Stats=[[GREEN]][mcMMO] Statisztik\u00e1k
|
||||
MOTD.Version=[[GOLD]][mcMMO] Jelenlegi verzi\u00f3: [[DARK_AQUA]]{0}
|
||||
@@ -1,197 +0,0 @@
|
||||
Acrobatics.Combat.Proc=[[GREEN]]**Esquivou**
|
||||
Acrobatics.SubSkill.Roll.Name=Rolar
|
||||
Acrobatics.SubSkill.Dodge.Name=Esquivou
|
||||
Acrobatics.Listener=Acrobacias:
|
||||
Acrobatics.Roll.Text=**Rolou**
|
||||
Acrobatics.SkillName=Acrobacia
|
||||
Acrobatics.Skillup=Habilidade Acrobacia aumentada em {0}. Total ({1})
|
||||
Archery.SubSkill.SkillShot.Name=Tiro Habilidoso
|
||||
Archery.SubSkill.SkillShot.Description=Aumenta o dano feito com arcos
|
||||
Archery.SubSkill.ArrowRetrieval.Description=Chance de recuperar flechas dos corpos
|
||||
Archery.Listener=Arqueiro
|
||||
Archery.SkillName=ARQUEIRO
|
||||
Archery.Skillup=Habilidade Arqueiro aumentada em {0}. Total ({1})
|
||||
Axes.Ability.Bonus.0=Machado
|
||||
Axes.Ability.Lower=[[GRAY]]**VOCE ABAIXA SEU MACHADO**
|
||||
Axes.Ability.Ready=[[GREEN]]**VOCE PREPARA SEU MACHADO**
|
||||
Axes.Combat.GI.Struck=**GOLPEADO POR UM GRANDE IMPACTO**
|
||||
Axes.SubSkill.CriticalStrikes.Description=Dano Duplo
|
||||
Axes.SubSkill.AxeMastery.Description=Adiciona dano extra
|
||||
Axes.Listener=Machados:
|
||||
Axes.SkillName=Machado
|
||||
Axes.Skills.SS.On=[[GREEN]]**Racha Cranio ATIVADO**
|
||||
Axes.Skills.SS.Refresh=[[GREEN]]Sua [[YELLOW]] Racha Cranio [[GREEN]] habilidade esta pronta.
|
||||
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Racha Cranios!
|
||||
Axes.Skillup=Habilidade em Machado aumentada em {0}. Total ({1})
|
||||
Excavation.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PA**
|
||||
Excavation.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PA**
|
||||
Excavation.SubSkill.TreasureHunter.Description=Habilidade de cavar tesouros
|
||||
Excavation.Listener=Escavacao:
|
||||
Excavation.SkillName=Escava\u00e7\u00e3o
|
||||
Excavation.Skillup=Habilidade de Escavacao aumentada em {0}. Total ({1})
|
||||
Fishing.Listener=Pescaria:
|
||||
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
|
||||
Fishing.SkillName=PESCARIA
|
||||
Fishing.Skillup=Habilidade em Pescaria aumentada em {0}. Total ({1})
|
||||
Herbalism.Ability.GTh=[[GREEN]]**DEDAO VERDE**
|
||||
Herbalism.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ENXADA**
|
||||
Herbalism.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ENXADA**
|
||||
Herbalism.Listener=Herbalismo
|
||||
Herbalism.SkillName=HERBALISMO
|
||||
Herbalism.Skills.GTe.Refresh=[[GREEN]]Sua [[YELLOW]]pronta sua habilidade de [[GREEN]]Terra Verde
|
||||
Herbalism.Skills.GTe.Other.Off=Terra Verde[[GREEN]] acabou para o [[YELLOW]]{0}
|
||||
Herbalism.Skillup=Habilidade em Herbalismo aumentada em {0}. Total ({1})
|
||||
Mining.Ability.Length=Super Partir Duracao: [[YELLOW]]{0}s
|
||||
Mining.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA PICARETA**
|
||||
Mining.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA PICARETA**
|
||||
Mining.Listener=Mineracao:
|
||||
Mining.SkillName=MINERAR
|
||||
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]A tua [[YELLOW]]habilidade Super Partir [[GREEN]]esta pronta!
|
||||
Mining.Skillup=Habilidade Minerar aumentada em {0}. Total ({1})
|
||||
Mining.Blast.Boom=[[GRAY]]**BOOM**
|
||||
Mining.Blast.Refresh=[[GREEN]]A tua [[YELLOW]]habilidade de explosao [[GREEN]]esta pronta!
|
||||
Repair.SubSkill.Repair.Name=Reparar
|
||||
Repair.SubSkill.SuperRepair.Name=Super Reparo
|
||||
Repair.SubSkill.DiamondRepair.Name=Reparar Diamante ({0}+ SKILL)
|
||||
Repair.SubSkill.DiamondRepair.Description=Reparar ferramentas e armadura de Diamante
|
||||
Repair.SubSkill.ArcaneForging.Description=Reparar itens magicos
|
||||
Repair.Listener=Reparar:
|
||||
Repair.SkillName=REPARAR
|
||||
Repair.Skills.AdeptDiamond=[[DARK_RED]]Voce nao tem nivel suficiente pra reparar Diamante.
|
||||
Repair.Skills.AdeptGold=[[DARK_RED]]Voc\u00ea n\u00e3o tem nivel suficiente pra reparar Ouro.
|
||||
Repair.Skills.AdeptStone=[[DARK_RED]]Voce nao tem nivel suficiente pra reparar Pedra.
|
||||
Repair.Skills.FeltEasy=[[GRAY]]Isso pareceu facil.
|
||||
Repair.Skillup=Habilidade de Reparacao aumentada em {0}. Total ({1})
|
||||
Repair.Arcane.Chance.Success=[[GRAY]]AF Percentagem de Sucesso: [[YELLOW]]{0}%
|
||||
Repair.Arcane.Fail=Poder misterioso saiu permanentemente do item.
|
||||
Repair.Arcane.Lost=Voce nao foi habilidoso o suficiente para manter os encantamentos.
|
||||
Swords.Ability.Lower=[[GRAY]]**VOCE ABAIXA SUA ESPADA**
|
||||
Swords.Ability.Ready=[[GREEN]]**VOCE PREPARA SUA ESPADA**
|
||||
Swords.Combat.Bleeding.Stopped=[[GRAY]]O sangramento[[GREEN]]parou[[GRAY]]!
|
||||
Swords.Combat.Bleeding=[[GREEN]]**INIMIGO A SANGRAR**
|
||||
Swords.Combat.Countered=[[GREEN]]**CONTRA-ATACADO**
|
||||
Swords.SubSkill.CounterAttack.Name=Contra-ataque
|
||||
Swords.SubSkill.Bleed.Name=Sangrou
|
||||
Swords.Listener=Espadas:
|
||||
Swords.SkillName=Espada
|
||||
Swords.Skills.SS.On=[[GREEN]]**ATAQUE DE SERRA ACTIVADO**
|
||||
Swords.Skills.SS.Other.Off=Ataque de cerra[[GREEN]] acabou para [[YELLOW]]{0}
|
||||
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]] quebra rapida!
|
||||
Swords.Skillup=Habilidade com Espadas aumentada em {0}. Total ({1})
|
||||
Taming.Ability.Bonus.1=Lobos evitam o perigo
|
||||
Taming.Ability.Bonus.6=Garras Afiadas
|
||||
Taming.SubSkill.ShockProof.Description=Reducao de dano explosivo
|
||||
Taming.SubSkill.CallOfTheWild.Name=Chamado da Selva
|
||||
Taming.SubSkill.CallOfTheWild.Description=Invoca um animal ao seu lado
|
||||
Taming.SubSkill.FastFoodService.Description=Chance dos lobos se curarem ao atacarem
|
||||
Taming.SubSkill.SharpenedClaws.Name=Garras Afiadas
|
||||
Taming.SubSkill.SharpenedClaws.Description=Dano Bonus
|
||||
Taming.Listener.Wolf=[[DARK_GRAY]]O seu lobo correu de volta ate voce...
|
||||
Taming.Listener=Domar
|
||||
Taming.SkillName=DOMAR
|
||||
Taming.Skillup=Habilidade de Domesticar aumentada em {0}. Total ({1})
|
||||
Unarmed.Listener=Desarmado:
|
||||
Unarmed.SkillName=DESARMAR
|
||||
Unarmed.Skills.Berserk.Off=**Berserk acabou**
|
||||
Unarmed.Skills.Berserk.Other.Off=Quebra rapida[[GREEN]] acabou para [[YELLOW]]{0}
|
||||
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] usou [[RED]]Berserk!
|
||||
Woodcutting.Ability.0=Soprador de Folhas
|
||||
Woodcutting.Ability.1=Soprar Folhas
|
||||
Woodcutting.SubSkill.TreeFeller.Description=Faz arvores explodirem.
|
||||
Woodcutting.SubSkill.HarvestLumber.Name=Drops duplos
|
||||
Woodcutting.Listener=Lenhador
|
||||
Woodcutting.SkillName=Lenhador
|
||||
Woodcutting.Skills.TreeFeller.Other.Off=Corta Arvores[[GREEN]] acabou para o [[YELLOW]]{0}
|
||||
Woodcutting.Skills.TreeFeller.Splinter=SEU MACHADO SE QUEBROU EM DEZENAS DE PEDACOS!
|
||||
Woodcutting.Skills.TreeFeller.Threshold=Essa arvore e muito grande!
|
||||
Woodcutting.Skillup=Habilidade como Lenhador aumentada em {0}. Total ({1})
|
||||
Ability.Generic.Template={0}:[[YELLOW]]{1}
|
||||
Combat.ArrowDeflect=[[WHITE]]*DESVIOU A FLECHA*
|
||||
Combat.BeastLore=[[GREEN]]*CONHECIMENTO DE ANIMAIS*
|
||||
Combat.BeastLoreHealth=[[DARK_AQUA]]Vida ([[GREEN]]{0}[[DARK_AQUA]]/{1})
|
||||
Combat.BeastLoreOwner=[[DARK_AQUA]]Dono ([[RED]]{0}[[DARK_AQUA]])
|
||||
Combat.Gore=[[GREEN]]*MORDIDA*
|
||||
Combat.StruckByGore=*ATINGIDO POR MORDIDA*
|
||||
Combat.TargetDazed=Alvo foi [[DARK_RED]]Atordoado
|
||||
Combat.TouchedFuzzy=[[DARK_RED]]Visao turva. Sente Tonturas.
|
||||
Commands.addlevels.AwardAll.1=[[GREEN]]Voce ganhou {0} leveis em todas suas skills!
|
||||
Commands.addlevels.AwardAll.2=Todas suas skills foram alteradas para {0}.
|
||||
Commands.addlevels.AwardSkill.1=[[GREEN]]Voce ganhou {0} leveis em {1}!
|
||||
Commands.addlevels.AwardSkill.2={0} foi modificado para {1}.
|
||||
Commands.addxp.AwardAll=[[GREEN]]Voce ganhou {0} experiencias em todas skills!
|
||||
Commands.addxp.AwardSkill=[[GREEN]]Voce ganhou {0} experiencias em {1}!
|
||||
Commands.AdminChat.Off=Chat Admin [[RED]]Desligado
|
||||
Commands.AdminChat.On=Chat de Admin [[GREEN]]Ligado
|
||||
Commands.AdminToggle=- Liga o Admin chat
|
||||
Commands.Disabled=Este comando esta desabilitado.
|
||||
Commands.DoesNotExist=Player nao existe na database!
|
||||
Commands.GodMode.Disabled=mcMMO Modo God desabilitado
|
||||
Commands.GodMode.Enabled=mcMMO Godmode Ligado
|
||||
Commands.Invite.Accepted=[[GREEN]]Convite aceito. Voce se juntou ao grupo {0}
|
||||
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - Modifica alvo
|
||||
Commands.ModDescription=- Leia a descricao breve do mod
|
||||
Commands.NoConsole=Esse comando nao suporta uso no console
|
||||
Commands.Party.Accept=- Aceitar convite de grupo
|
||||
Commands.Party.Chat.Off=Chat de grupo [[RED]]Desligado
|
||||
Commands.Party.Commands=[[GREEN]]--COMANDOS DE GRUPO--
|
||||
Commands.Party.Invite.0=ALERTA: [[GREEN]]Voce recebeu um convite para o grupo {0} de {1}
|
||||
Commands.Party.Kick=Voce foi kickado do grupo {0}!
|
||||
Commands.Party.Leave=Voce saiu do grupo
|
||||
Commands.Party.None=Voce nao esta em um grupo.
|
||||
Commands.Party.Quit=- Deixe seu grupo atual
|
||||
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Nivel de Poder [[YELLOW]]Podium--
|
||||
Commands.PowerLevel=[[DARK_RED]]N\u00cdVEL DE PODER: [[GREEN]]{0}
|
||||
Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO scoreboard sumiu.
|
||||
Commands.Scoreboard.NoBoard=The mcMMO scoreboard nao esta ativo.
|
||||
Commands.Scoreboard.Keep=[[DARK_AQUA]]O mcMMO scoreboard vai estar visivel ate voce usar [[GREEN]]/mcscoreboard clear[[DARK_AQUA]].
|
||||
Commands.Scoreboard.Timer=[[DARK_AQUA]]O mcMMO scoreboard vai sumir em [[GOLD]]{0}[[DARK_AQUA]] segundos.
|
||||
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Ajuda para [[RED]]/mcscoreboard[[GOLD]] ==
|
||||
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - oculta o McMMO scoreboard
|
||||
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mantem o McMMO scoreboard visivel
|
||||
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - oculta o McMMO scoreboard depois de [[LIGHT_PURPLE]]n[[WHITE]] segundos
|
||||
Commands.Scoreboard.Tip.Keep=[[GOLD]]Dica: Use [[RED]]/mcscoreboard keep[[GOLD]] enquanto ele estiver visivel para fazer com que ele fique sempre visivel .
|
||||
Commands.Scoreboard.Tip.Clear=[[GOLD]]Dica: Use [[RED]]/mcscoreboard clear[[GOLD]] para ocultar o McMMO scoreboard.
|
||||
Commands.Stats.Self=SEUS STATS
|
||||
mcMMO.NoPermission=[[DARK_RED]]Permissoes insuficientes.
|
||||
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
|
||||
Party.InvalidName=[[DARK_RED]]Isto nao e um nome valido.
|
||||
Party.Locked=Equipe esta bloqueada, soh o lider pode convidar.
|
||||
Party.NotInYourParty=[[DARK_RED]]{0} nao est\u00e1 na sua equipe
|
||||
Party.Password.Set=[[GREEN]]Senha da equipe: {0}
|
||||
Party.Player.Invalid=Isto nao e um jogador valido.
|
||||
Party.Teleport.Dead=Voce nao pode teleportar para um jogador morto.
|
||||
Party.Teleport.Player=[[GREEN]]Voce teleportou para {0}.
|
||||
Party.Teleport.Target=[[GREEN]]{0} teleportou-se para voce.
|
||||
Party.Unlocked=[[GRAY]]Equipe foi Destrancada
|
||||
Commands.XPGain.Acrobatics=CAINDO
|
||||
Commands.XPGain.Archery=Atacando Monstros
|
||||
Commands.XPGain.Axes=Atacando Monstros
|
||||
Commands.XPGain.Excavation=Cavando e achando tesouros
|
||||
Commands.XPGain.Herbalism=Colhendo Ervas
|
||||
Commands.XPGain.Mining=Minerar Pedra & Min\u00e9rio
|
||||
Commands.XPGain.Swords=Atacando Monstros
|
||||
Commands.XPGain.Taming=Domesticar animais, ou combater com os seus lobos
|
||||
Commands.XPGain=[[DARK_GRAY]]XP ADQUIRIDO: [[WHITE]]{0}
|
||||
Commands.xplock.locked=[[GOLD]]Sua barra de XP BAR est\u00e1 travada em {0}!
|
||||
Commands.xplock.unlocked=[[GOLD]]Sua barra de XP foi [[GREEN]]DESTRAVADA[[GOLD]]!
|
||||
Commands.xprate.over=Evento de XP Rate acabou!!
|
||||
XPRate.Event=[[GOLD]]mcMMO esta em um evento de XP aumentada! O aumento de XP e {0}x!
|
||||
Effects.Effects=EFEITOS
|
||||
Inspect.OfflineStats=Estatisticas do mcMMO para o player offline [[YELLOW]]{0}
|
||||
Inspect.Stats=[[GREEN]]Estatisticas do mcMMO para [[YELLOW]]{0}
|
||||
Inspect.TooFar=Voce esta muito longe para inspecionar este Player!
|
||||
Item.ChimaeraWing.Fail=**ASAS DE QUIMERA FALHARAM!**
|
||||
Item.ChimaeraWing.Pass=**ASAS DE QUIMERA**
|
||||
Item.Injured.Wait=Voce foi ferido recentemente e deve esperar para usar isto. [[YELLOW]]({0}s)
|
||||
Skills.Disarmed=[[DARK_RED]]Voc\u00ea foi Desarmado!
|
||||
Skills.NeedMore=[[DARK_RED]]Voc\u00ea precisa de mais
|
||||
Skills.TooTired=Voc\u00ea est\u00e1 cansado pra usar essa habilidade.
|
||||
Skills.Cancelled={0} cancelado!
|
||||
Stats.Header.Combat=[[GOLD]]-=SKILLS DE COMBATE=-
|
||||
Stats.Header.Gathering=[[GOLD]]-=SKILLS DE RECOLHA=-
|
||||
Stats.Header.Misc=[[GOLD]]-=OUTRAS SKILLS=-
|
||||
Scoreboard.Header.PlayerCooldowns=mcMMO Restantes
|
||||
Scoreboard.Misc.CurrentXP=[[GREEN]]XP Atual
|
||||
Scoreboard.Misc.RemainingXP=XP Restante
|
||||
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Faltando
|
||||
Scoreboard.Misc.Overall=[[GOLD]]Geral
|
||||
@@ -1,27 +0,0 @@
|
||||
import Config.Libs as Libs
|
||||
// Config is located in <root>/buildSrc/src/main/java/Config.kt
|
||||
// It provides a bunch of constant values we use as dependency
|
||||
// strings, so we don't have to duplicate a bunch of them in
|
||||
// various scripts. The import as allows for shorthand.
|
||||
|
||||
plugins {
|
||||
`java-library` // This is already provided, but for static compilation,
|
||||
// we declare it here so we can use the IDE static type references
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
compile(Libs.configurate) { // Configurate-Yaml dependency, inherits Configurate-core
|
||||
exclude(Deps.Groups.guava, Deps.Modules.guava) // Exclude guava
|
||||
exclude(Deps.Groups.checker, Deps.Modules.checker) // Exclude checkerframework
|
||||
}
|
||||
compile(Libs.flowmath) // flowpowered math, for more maths.
|
||||
compile(Libs.jdbc) // Database connectors
|
||||
compile(Libs.juli) // Database connectors
|
||||
testCompile(Libs.junitDep) // junit for testing
|
||||
|
||||
// Spigot for in-dev dependency
|
||||
compileOnly(Libs.Bukkit.`1_13`.spigotApi) { // Spigot only for temporary usage in core
|
||||
isTransitive = false // Don't include spigot api's dependencies
|
||||
}
|
||||
}
|
||||
@@ -1,73 +0,0 @@
|
||||
package com.gmail.nossr50.core;
|
||||
|
||||
import com.gmail.nossr50.core.data.database.DatabaseManager;
|
||||
import com.gmail.nossr50.core.mcmmo.event.EventCommander;
|
||||
import com.gmail.nossr50.core.mcmmo.plugin.Plugin;
|
||||
import com.gmail.nossr50.core.mcmmo.server.Server;
|
||||
import com.gmail.nossr50.core.mcmmo.tasks.TaskScheduler;
|
||||
import com.gmail.nossr50.core.platform.Platform;
|
||||
import com.gmail.nossr50.core.util.ModManager;
|
||||
import com.gmail.nossr50.core.util.experience.FormulaManager;
|
||||
import com.gmail.nossr50.core.util.upgrade.UpgradeManager;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class McmmoCore {
|
||||
//TODO: Wire all this stuff
|
||||
public static Plugin p;
|
||||
private static EventCommander eventCommander;
|
||||
private static Logger logger;
|
||||
private static Platform platform;
|
||||
private static boolean retroModeEnabled;
|
||||
|
||||
//Why do all these things need to be here? Sigh...
|
||||
private static DatabaseManager databaseManager;
|
||||
private static UpgradeManager upgradeManager; //TODO: I can't even remember what this one did
|
||||
private static FormulaManager formulaManager;
|
||||
private static ModManager modManager; //TODO: Probably need to rewrite this
|
||||
|
||||
/**
|
||||
* Returns our Logger
|
||||
* @return the logger
|
||||
*/
|
||||
public static Logger getLogger()
|
||||
{
|
||||
return logger;
|
||||
}
|
||||
|
||||
public static EventCommander getEventCommander() {
|
||||
return eventCommander;
|
||||
}
|
||||
|
||||
public static Server getServer() {
|
||||
return platform.getServer();
|
||||
}
|
||||
|
||||
public static TaskScheduler getTaskScheduler()
|
||||
{
|
||||
return platform.getScheduler();
|
||||
}
|
||||
|
||||
public static java.io.InputStream getResource(String path)
|
||||
{
|
||||
return platform.getResource(path);
|
||||
}
|
||||
|
||||
public static File getDataFolderPath()
|
||||
{
|
||||
return platform.getDataFolderPath();
|
||||
}
|
||||
|
||||
public static DatabaseManager getDatabaseManager() { return databaseManager; }
|
||||
|
||||
public static UpgradeManager getUpgradeManager() { return upgradeManager; }
|
||||
|
||||
public static FormulaManager getFormulaManager() { return formulaManager; }
|
||||
|
||||
public static boolean isRetroModeEnabled() { return retroModeEnabled; }
|
||||
|
||||
public static ModManager getModManager() { return modManager; }
|
||||
|
||||
public static String getModDataFolderPath() { return platform.getModDataFolderPath(); }
|
||||
}
|
||||
@@ -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
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -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 */
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.gmail.nossr50.core.config;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public interface ConfigCollection<T> {
|
||||
Collection<T> getLoadedCollection();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,11 +0,0 @@
|
||||
package com.gmail.nossr50.core.config;
|
||||
|
||||
/**
|
||||
* A class that registers keys
|
||||
*/
|
||||
public interface RegistersKeys {
|
||||
/**
|
||||
* Loads up keys
|
||||
*/
|
||||
void loadKeys();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package com.gmail.nossr50.core.config;
|
||||
|
||||
/**
|
||||
* Unloads values, sort of like a constructor
|
||||
*/
|
||||
public interface Unload {
|
||||
void unload();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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() {
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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 = "§";
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package com.gmail.nossr50.core.mcmmo.entity;
|
||||
|
||||
/**
|
||||
* Represents an entity that can be tamed
|
||||
*/
|
||||
public interface Tameable extends Living {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package com.gmail.nossr50.core.mcmmo.event;
|
||||
|
||||
/**
|
||||
* Represents an event for a given API
|
||||
*/
|
||||
public interface Event {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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...
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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,
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
package com.gmail.nossr50.core.mcmmo.meta;
|
||||
|
||||
public class MetadataDefinitions {
|
||||
public static final String MCMMO_METADATA_PLAYERDATA_KEY = "mcMMO_PlayerDataKey";
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.gmail.nossr50.core.mcmmo.nbt;
|
||||
|
||||
/**
|
||||
* Represents compound NBT Data
|
||||
*/
|
||||
public interface NBT {
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
package com.gmail.nossr50.core.platform;
|
||||
|
||||
/**
|
||||
* This is the implementation of the Platform Interface
|
||||
*/
|
||||
public abstract class AbstractPlatform implements Platform {
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
package com.gmail.nossr50.core.platform;
|
||||
|
||||
/**
|
||||
* ENUMs representing the software the platform belongs to
|
||||
*/
|
||||
public enum PlatformSoftwareType {
|
||||
NMS,
|
||||
BUKKIT,
|
||||
SPONGE
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
package com.gmail.nossr50.core.skills;
|
||||
|
||||
public enum ConfigItemCategory {
|
||||
ARMOR,
|
||||
TOOL,
|
||||
OTHER;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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
Reference in New Issue
Block a user