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

Compare commits

..

1 Commits

Author SHA1 Message Date
t00thpick1
8f1801bc4d To capfan - My biggest fan 2015-11-29 22:22:32 -05:00
626 changed files with 27713 additions and 38294 deletions

344
.gitignore vendored
View File

@@ -1,330 +1,42 @@
# Eclipse stuff
/.classpath
/.project
/.settings
### Eclipse template
# netbeans
/nbproject
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders
# we use maven!
/build.xml
# External tool builders
.externalToolBuilders/
# maven
/target
# Locally stored "Eclipse launch configurations"
*.launch
# vim
.*.sw[a-p]
# PyDev specific (Python IDE for Eclipse)
*.pydevproject
# various other potential build files
/build
/bin
/dist
/manifest.mf
# CDT-specific (C/C++ Development Tooling)
.cproject
/world
# CDT- autotools
.autotools
# Mac filesystem dust
*.DS_Store
# Java annotation processor (APT)
.factorypath
# PDT-specific (PHP Development Tools)
.buildpath
# sbteclipse plugin
.target
# Tern plugin
.tern-project
# TeXlipse plugin
.texlipse
# STS (Spring Tool Suite)
.springBeans
# Code Recommenders
.recommenders/
# Annotation Processing
.apt_generated/
# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet
### Android template
# Built application files
*.apk
*.ap_
# Files for the ART/Dalvik VM
*.dex
# Java class files
*.class
# Generated files
gen/
out/
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
# Proguard folder generated by Eclipse
proguard/
# Log Files
*.log
# Android Studio Navigation editor temp files
.navigation/
# Android Studio captures folder
captures/
# IntelliJ
# intellij
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches
# Keystore files
# Uncomment the following line if you do not want to check your keystore files in.
#*.jks
# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild
# Google Services (e.g. APIs or Firebase)
google-services.json
# Freeline
freeline.py
freeline/
freeline_project_description.json
# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md
### Dropbox template
# Dropbox settings and caches
.dropbox
.dropbox.attr
.dropbox.cache
### Windows template
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
### Maven template
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
.mvn/wrapper/maven-wrapper.jar
### NetBeans template
nbproject/private/
nbbuild/
dist/
nbdist/
.nb-gradle/
### macOS template
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Linux template
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### GPG template
secring.*
### Gradle template
.gradle
/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Cache of project
.gradletasknamecache
# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties
### SBT template
# Simple Build Tool
# http://www.scala-sbt.org/release/docs/Getting-Started/Directories.html#configuring-version-control
dist/*
lib_managed/
src_managed/
project/boot/
project/plugins/project/
.history
.cache
.lib/
### Example user template template
### Example user template
# IntelliJ project files
.idea
out
gen### JetBrains template
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.ipr
*.iws
.idea/
# IntelliJ
# mpeltonen/sbt-idea plugin
.idea_modules/
# Project Stuff
/src/main/resources/mcMMO
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
### Kotlin template
# Compiled class file
# Log file
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
# Other Libraries
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### Java template
# Compiled class file
# Log file
# BlueJ files
# Mobile Tools for Java (J2ME)
# Package Files #
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
# Atlassian Stuff
/atlassian-ide-plugin.xml

View File

@@ -7,316 +7,18 @@ 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.12
Salvage config entries are no longer case sensitive
Fixed a bug where Fishing was not rewarding vanilla XP orbs
Version 2.1.11
Fixed a bug where Rupture was using the wrong permission node (new permission node: mcmmo.ability.swords.rupture)
Version 2.1.10
Fishing command did an oopsie
Endstone now gives the same XP as Stone (update your experience.yml)
Version 2.1.9
Fixed a bug where grabbing the version of WG would throw classnotdefined errors
Version 2.1.8
mcMMO now checks for WG 7 before attempting to use the WG API
Made some optimizations for our WG integration
Fixed a bug where Bite chance for Master Angler was displaying too many decimal places
Fixed a bug where Abilities didn't check for permission nodes before activating
MaxBonusLevel now has specific entries for Standard and Retro in advanced.yml
MaxBonusLevel for Critical Strikes changed from 75/750 to 100/1000
MaxBonusLevel of Dodge changed from 80/800 to 100/1000
MaxBonusLevel of Rupture changed from 20/200 to 100/1000
MaxBonusLevel of Counter Attack changed from 60/600 to 100/1000
Version 2.1.7
Fixed an almost 6 year old bug where Salvage materials did not have a defined material count so they defaulted to 2 (which could lead to shovels giving back more diamonds than normal)
Added spam detection for Unarmed's bonus damage and disarm
Corrected an error where master angler for retro only required level 150 instead of 500 (update your skillranks.yml)
Fixed a bug where Players could see hidden party members in the party member listings
(API) Added addXpFromBlocks to ExperienceAPI to help make adding XP for a player easier
(API) Added addXpFromBlocksBySkill to ExperienceAPI to help make adding XP for a player easier
(API) Added addXpFromBlock to ExperienceAPI to help make adding XP for a player easier
(API) Added addXpFromBlockBySkill to ExperienceAPI to help make adding XP for a player easier
Version 2.1.6
Fixed a bug where Arcane Salvage could never fail
Recolored some lines in the locale related to failure from white to red
Fixed a bug where Salvage was giving back too many resources
SubSkillFailure renamed to SubSkillFailed in config.yml
SubSkillFailed now sends copies to chat by default
SubSkillFailed no longer sends messages to the action bar by default
Version 2.1.5
mcMMO no longer ignores cancelled events relating to the player left or right clicking
Version 2.1.4
Fixed a bug where Alchemy didn't gain XP
Fixed a bug where Archery gained XP from mob spawned entities
Fixed a display bug with Roll on /acrobatics command
Fixed a display bug for bite chance on Fishing
Fixed a display bug for treasure drop chances on Fishing
Fixed a display bug for Arcane Forging on Repair
Fixed a display bug for Super Repair on Repair
Fixed a display bug for Repair Mastery on Repair
Fixed a display bug for Second Smelt on Smelting
Repair Mastery now uses a rank system
Super Repair now uses a rank system
Changed the stat for bite chance to be more clear that its additive chance
Fixed Styling for the /salvage command
Temporarily disabled Flux Mining
Removed XP from entities that target endermite to prevent easy exploitation (Credits to TheBentoBox for the tip!) [Can be turned off in experience.yml]
Fixed a bug where static chance skills like Arcane Salvage were using incorrect calculations for success
Advanced Salvage now uses a rank system
Arcane Salvage now goes by your rank to determine the maximum amount of materials salvaged and is no longer percentage based
Fixed a bug where Iron Arm was checking for Iron Grip to be unlocked instead of itself
(Plugin Compatibility) mcMMO no longer ignores cancelled block place events (this is to prevent XP gains from placed blocks)
(Plugin Compatibility) mcMMO now ignores cancelled events relating to the player left or right clicking
(Locale) Changed the string for "Salvage.Ability.Bonus.1" to fit the new material recovery mechanics of Salvage
(Config) Added a toggle for the new endermite enderman xp farm fix in experience.yml "ExploitFix.EndermanEndermiteFarms"
(Config) Cleaned up some leftover 'unlocklevel' settings, this stuff is now handled in skillranks.yml
(Config) Removed Salvage.MaxPercentage
(Config) Removed Salvage.MaxPercentageChance
(Config) Added Salvage.ArcaneSalvage.MaxBonusLevel
(Config) Added Salvage.ArcaneSalvage.MaxChance
Version 2.1.3
Temporarily removed the unarmed no-item pickup feature until its fixed
Version 2.1.2
(Compatibility) mcMMO now deals custom damage type for all damage sources to be more compatible with other plugins (such as anti-cheat)
(Perks) Fixed a bug where the Lucky perk wasn't adding to success
(Skills) mcMMO will now listen to cancelled events to remove our temporary enchantments from tools
(Skills) Fixing a bug where Shake didn't calculate success correctly
(Skills) Fixed a bug where Arcane Forging didn't calculate success and failure correctly
(Skills) Fixed a bug where Salvage didn't calculate success and failure correctly
(Skills) Fixed a bug where Flux Mining didn't calculate success correctly
(Skills) Fixed a bug where Shake didn't calculate correctly
(Skills) Fixed a bug where Pummel didn't calculate correctly
(Skills) Tree Feller now works on Mushroom Stems
(Skills) Fixed a bug where magic chance would show as null
(Skills) Fixed a bug where Trap percentages were added to Fishing even though they no longer exist
(Skills) Magic Hunter now uses a rank system
(Skills) Fixed a bug where Magic Hunter would work without treasure hunter
(Skills) As long are you are empty handed mcMMO will no longer put items into your hands
(Skills) Improved the styling on /smelting
(Skills) Iron Arm Style can now reach a bonus damage of 10 (up from 8)
(Skills) Iron Arm Style now uses a rank system
(Skills) Iron Grip now uses a rank system
(Skills) Disarm now uses a rank system
(Skills) Arrow Deflect now uses a rank system
(Skills) Flux Mining is now a passive effect when you mine ore instead of requiring a special pickaxe
(Skills) Removed the Flux Mining mcMMO Pickaxe Item
(Style) Locked skills now are styled differently in the skill command display
(Experience) Phantoms have been added to the default experience.yml with a value of 4.0 (update your config!)
(Experience) Default XP value for witch set to 0.1 instead of 0.0
(Experience) Default XP value for ender dragon set to 1.0 instead of 0.0
(Style) Added @ symbol styling for hover tooltips to the locale
(Style) Added the skill names in the skill commands display to the locale so it can now be edited and styled
(Experience) Renamed Grass to Grass_Block in treasures.yml to allow grass to give items again (update your configs manually or delete to regen)
(Experience) Wood blocks now give XP and are affected by Tree Feller (6 sided bark blocks)
(API) Moved XPGainReason from skills to experience package
(API) Added XpGainSource for tracking sources of XP
(API) You can now specify XpGainSource when adding xp to players
(Config) The Extra Stats option for XP bars now overrides the setting for updating XP bars every time XP is gained
(Config) Added an option for Party XP gains to not update XP bars
(Config) Added an option for Passive XP gains to not update XP bars (smelting/brewing)
(Config) Added warnings if mcMMO finds a MaxBonusLevel of 0 for any skill that incorporates RNG
(Config) Removed config options for Iron Arm
(Config) Removed the options related to the Flux Mining Item
(Config) Second Smelt has a max activation chance of 50% instead of 100% (you can update your configs or gen new ones to get this change)
Version 2.1.1
= Fixed an issue where excavation wasn't using the correct permission node
= Added protection against AFK fishing
= Acrobatics now uses much better anti-exploit detection
Version 2.1.0
+ mcMMO now features XP bars! Configurable in experience.yml
+ Locale files now support & codes for colors and formatting!
+ Prevented exploits involving blocks made from entities (snowmen, etc..)
+ Added JSON integration to all Skill Commands
+ Added config setting to enable or disable old mcMMO skill scaling (General.RetroMode) this is on by default for existing installs
+ You can now disable specific skills in coreskills.yml without the need for permissions
+ Added links to mcMMO related websites to various commands
+ Certain elements of mcMMO's UI have been restyled
+ Added the tagline "Overhaul Era" to various locations until 3.0.0 comes out
+ You can now disable mcMMO completely for specific worlds via world_blacklist.txt in /plugins/mcMMO/
+ (WorldGuard) mcMMO now supports worldguard, you can use the flags "mcmmo" and "mcmmo-xp" on regions (they default to on unless otherwise specified)
! (Scoreboards) Scoreboards are now disabled by default, I don't like them. You can turn them back on in config.yml
+ (Sounds) Rolling now plays a sound (Graceful Roll has a different sound :) )
+ (Sounds) Activating Super abilities plays a sound (other plays can hear this)
+ (Sounds) Skill Unlock Notifications have sounds
+ (Sounds) Readying a tool for a super ability now plays a sound
+ (Sounds) Bleed DOT now plays a sound
+ (Experience) mcMMO now notifies you when you progress in a skill!
+ (Experience) Coral (blocks) now give Mining XP
+ (Experience) Coral (plants) now give Herbalism XP
+ (Experience) Blue Ice now gives Mining XP
+ (Experience) Dolphins now give combat XP
+ (Experience) Drowned mobs now count towards combat XP
+ (Experience) You can now set guaranteed minimum values for XP gained if diminishing returns are enabled, this value defaults to 5% (experience.yml)
+ (Events) Starting an XP event will now use the title API (toggle this in advanced.yml)
+ (Sound) Volume and Pitch of sounds can now be configured in the new sounds.yml file
+ (MySQL) Added support for SSL for MySQL/MariaDB (On by default)
! (Skills) Taming's Gore now uses Rupture Rank 1 for its DoT calculations
! (Skills) Sword's Bleed has been renamed to Rupture
! (Skills) Sword's Rupture no longer has an internal hard coded limit
! (Skills) Sword's Serrated Strikes now uses your Rupture rank to determine the damage/ticks for its bleed effect.
! (Skills) Sword's Rupture now ticks four times as fast
! (Skills) Sword's Rupture now refreshes bleed duration instead of adding duration when applying bleed to the same target
! (Skills) Sword's Rupture will now deal lethal damage
= (Skills) Fixed a bug where Rupture would apply an incorrect amount of bleed ticks
! (Skills) Sword's Rupture now reaches its max proc chance at level 20 (200 in Retro)
! (Skills) Sword's Rupture now has a max chance to proc of 33% instead of 70%
! (Skills) Sword's Rupture now deals 50% more damage at above Rank 3 and can last much longer! The base damage for Bleed has been increased as well (update your advanced.yml admins)
! (Skills) Sword's Rupture no longer triggers invincibility frames when damaging your opponent
= (Skills) Furnaces now give XP to the last person to modify their inventory instead of the first person to open them
+ (Skills) Ability Lengths now have a default skill cap at which they stop increasing in length, configurable in advanced.yml (endurance perks extend this limit)
+ (Skills) Added a new subskill to some skills 'Understanding The Art' this adds nothing new, but tracks benefits that increase together that seemed unrelated, which was previously a bit obfuscated.
+ (Skills) Tool alerts now are sent to the Action Bar
+ (Skills) Super Ability activation alerts are now sent to the Action Bar
+ (Skills) Certain Skill messages are now sent to the Action Bar
+ (Skills) Added some missing information to skill stats
+ (Config) Skill Rank requirements are now defined in skillranks.yml you cannot add or remove ranks from this file
+ (Config) Added option to use SSL for MySQL in config.yml
+ (Config) Added option to disable the new URL links to config.yml
+ (Config) New config file added coreskills.yml
+ (Config) Added rank settings for the new Woodcutting skill
+ (Config) Added configurable parameters for the new Tree Feller
+ (Config) Added retro toggle for Tree Feller
+ (Config) Added toggle to disable all scoreboards
+ (Chat) Added ability for admins to spy on party chat (off unless toggled on)
+ (Commands) Added new info command /mmoinfo or /mcinfo
+ (Commands) Added toggle command /mcchatspy
+ (API) Added many missing SubSkills to SubSkillType class
+ (Permissions) Added permission node mcmmo.commands.mcchatspy & mcmmo.commands.mcchatspy.others
+ (Permissions) Added permission nodes for Harvest Lumber, Splinter, Nature's Bounty, and Bark Surgeon
+ (Permissions) Added mcmmo.commands.mmoinfo for the new mmoinfo/mcinfo command
! (Permissions) Call of the wild now uses mcmmo.ability.taming.callofthewild instead of mcmmo.ability.taming.callofthewild.all
+ (Locale) Added locale strings for new Woodcutting abilities
+ (Locale) Added locale strings for mcchatspy command
+ (Locale) Added locale strings for JSON integration
+ (Locale) Added locale strings for Taming's Pummel SubSkill
+ (Locale) Added locale strings for Unarmed's Block Cracker SubSkill
- (Locale) Removed localizations with the following codes for being almost empty: id, HR_hr, et_EE, lv, lt, no, pl_PL, pt_PT, tr_TR
- (Config) Removed SkillShot's IncreaseLevel & IncreasePercentage (replaced by RankDamageMultiplier)
- (Config) Removed AxeMastery's MaxBonus & MaxBonusLevel (replaced by RankDamageMultiplier)
= (Events) Fixed bug where XP rate could be a negative number
= (Experience) Fixed a bug where you could set a players levels into the negative and bad things would happen
= (Plugin Compatibility) mcMMO now fires new custom events relating to changes it makes to player scoreboards, plugin authors can listen to these events to improve compatibility
= (Items) Chimaera Wing now tracks cooldowns between sessions for players (no more disconnect abuse)
= (Skills) Added missing mushroom blocks to experience.yml defaults
= (Skills) Tridents will no longer be considered unarmed
= (MySQL) You can now inspect offline players
= (MySQL) When converting from MySQL to flatfile mcMMO will now properly include all users in the conversion process
= (Commands) '/mcMMO help' no longer displays the other/special commands category to players lacking permissions
+ (Party) Parties can now have size limits (configurable in config.yml), party size is unlimited by default
+ (Party) You can now turn on Friendly Fire for parties in config.yml
+ (Debug Stick) The Debug stick can now tell you about properties of a block related to Excavation
! (Deaths) Fixed the bug where mob names would be replaced by hearts
! (Experience) The XP values of fish are now based on their rarity and have been drastically changed
! (Experience) Skills now start at level 1 (configurable in advanced.yml)
! (Item) Improved some of the messages sent to the player regarding the Chimaera Wing
! (Party) Party member list will only include members of the party that you can see (aren't vanished)
! (Skills) Excavation Treasure Hunter is renamed to Archaeology
! (Skills) Swords no longer require blocking with a shield to trigger counter attacks
! (Skills) Stripping wood and right clicking on stripped wood will no longer ready your Axe
! (Skills) Some skill level rank requirements have changed
! (Skills) Green Thumb now uses a rank system
! (Skills) Farmer's Diet & Fisherman's Diet now use a rank system
! (Skills) Fixed an edge case bug where Blast Mining wouldn't inform the player that it was on cooldown
! (Skills) mcMMO skills will now be on a scale from 1-100 instead of 0-1000 (for existing mcMMO installs this is opt-in and off by default)
! (Skills) Skill Super Powers now use a rank system, almost all of them unlocking first at level 10
! (Skills) Acrobatics' Roll exploit detection was tweaked to still allow for Roll to trigger even if it rewards no XP
! (Skills) Acrobatics' Roll & Gracefull Roll are now considered the same skill (both mechanics are still there)
! (Skills) Woodcutting's Double Drop subskill is now named Harvest Lumber
! (Skills) Archery's Skill Shot now uses a rank system
! (Skills) Swords' Bleed now uses a rank system
! (Skills) Swords' Counter Attack now uses a rank system
! (Skills) Axe's Axe Mastery now uses a rank system
! (Skills) Axe's Impact now uses a rank system
! (Skills) Herbalism's Farmer's Diet now uses a rank system
! (Skills) Herbalism's Green Thumb now uses a rank system
! (Skills) Shake now uses a rank system
! (Skills) Flux Mining now uses a rank system
! (Skills) Removed traps from fishing
! (Skills) Dodge now uses a rank system
! (Skills) Arrow Retrieval now uses a rank system
! (Skills) Axes' Critical Strikes now uses a rank system
! (Skills) Axes' Greater Impact now uses a rank system
! (Skills) Taming's Beast Lore now uses a rank system
! (Skills) Taming's Gore now uses a rank system
! (Skills) Taming's Call of the Wild now uses a rank system
! (Skills) Taming's Pummel now uses a rank system
! (Kraken) Removed everything involving the kraken
= (Skills) Shake now sends custom damage types for better nocheat compat
! (Config) Unarmed.IronArm in advanced.yml is now Unarmed.IronArmStyle
! (Config) Unarmed.Deflect in advanced.yml is now Unarmed.ArrowDeflect
! (Config) Swords.Counter in advanced.yml is now Swords.CounterAttack
! (Config) Archery.Retrieve in advanced.yml is now Archery.ArrowRetrieval
! (Config) Axes.CriticalHit in advanced.yml is now Axes.CriticalStrikes
! (Config) Archery's Skill Shot now uses RankDamageMultiplier for its damage bonus calculations
! (Config) Axe's Axe mastery now uses RankDamageMultiplier for its damage bonus calculations
! (Permissions) Replaced the old Double Drop permission node for woodcutting with a new Harvest Lumber permission node
! (Permissions) Fast Food Service permission node renamed to mcmmo.ability.taming.fastfoodservice
! (Permissions) Counter Attack permission node renamed to mcmmo.ability.swords.counterattack
! (Permissions) Arrow Deflect permission node renamed to mcmmo.ability.unarmed.arrowdeflect
! (Permissions) Iron Arm Style permission node renamed to mcmmo.ability.unarmed.ironarmstyle
! (Permissions) Remove all mob health bar permissions, this is no longer a per-player setting.
! (Commands) Removed the mobhealthbar command, this is no longer a per-player setting.
! (Locale) The descriptions of a few skills have changed
! (Locale) Removed redundant information from some skill names and descriptions en_US (other locales will need to be updated)
! (Locale) SubSkill locale keys are now located at {ParentSkill}.SubSkill.SubSkillName
! (Locale) Super Abilities no longer have (ABILITY) in their Skill.Effect strings
! (API) mcMMO is now built against Spigot-API instead of Bukkit
! (API) Moved a lot of methods from SkillCommand to SkillUtils
! (API) SkillType is now PrimarySkillType
! (API) SecondarySkill is now SubSkillType
! (API) AbilityType is now SuperAbilityType
! (API) SecondaryAbilityEvent is now SubSkillEvent
! (API) SubSkillType has had many helpful methods added to it
! (API) GREEN_THUMB_PLANT & GREEN_THUMB_BLOCK are replaced by GREEN_THUMB
! (Code) Refactored some unreadable code relating to SecondaryAbilityType activation in SkillUtils
Version 2.0.0
= Fixed an interaction between Tree Feller and Stripped Wood
! Fireworks no longer fire by default for ability activation/deactivation
! Website has been changed and the MOTD string relating to it reflects this
! Discord link added to mcMMO command
! Updated misc strings relating to mcMMO
Version 1.5.05-SNAPSHOT
Version 1.5.04
+ Added option to config.yml to control mcMMO generated sound volume
Version 1.5.04-SNAPSHOT
+ Added option to config.yml to truncate existing player skill levels that exceed the skill level cap
+ Falling blocks persist mcMMO natural data
= Woodcutting double drops correctly identify acacia and dark oak logs
= Skill Reset command now correctly identifies arguments
= Hylian Treasure config options are now actually used
= Child skills now use parent skills configured skill caps properly
= Auto Update config now properly works
! Item dropped from blocks now drop from the center
! Potions Config updated for 1.9
! Flux mining now simulates a block break event for other plugins to act upon
! Zombie Pigmen spawned from nether portals are now considered spawner mobs
! Flux Pickaxe lore now appends to existing lore as opposed to replacing it
! Party chat no longer displays colors when logged in server console
- Treefeller no longer lowers exp for big trees
- No longer supports 1.8 :(
- Removed plugin metrics
Version 1.5.03
= Fixed bug where absorption hearts could be attacked by allied players
@@ -446,7 +148,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 +496,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 +719,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 +1305,7 @@ Fixed bug with randomly receiving Taming XP
mcmmo.users file moved into /plugins/mcMMO/FlatFileStuff/
Leaderboard files now moved into /plugins/mcMMO/FlatFileStuff/Leaderboards
Locale files now have the prefix locale_ instead of messages_
Locale files are now located inside com/com.gmail/com.gmail.nossr50/locale/ instead of com/com.gmail/com.gmail.nossr50/
Locale files are now located inside com/gmail/nossr50/locale/ instead of com/gmail/nossr50/
Updated the code that handles permissions (this may mean 3.1.6 will finally play well!)
Some more source code organization
Fixed warnings for compiler

View File

@@ -1,234 +0,0 @@
# **Version 2.1.0+**
### Please use Spigot or Paper!
* **mcMMO is now built against Spigot-API instead of Bukkit**
### New Level Scaling
* mcMMO now features an optional 1-100 scaling mode!
* This is on by default for new installs, if you are upgrading mcMMO you will be put into Retro Mode instead (1-1000) scaling.
* The two scaling modes are the same, the changes are completely cosmetic!
* Skill Requirements in the config file will be multiplied by 10 if you are using Retro mode unless the setting has Retro in its name, keep this in mind if you need to edit anything!
### WorldGuard Support
* Added support for WorldGuard regions!
* `mcmmo` region flag turns on or off a players ability to use anything related to mcMMO other than commands
* `mcmmo-xp` region flag turns on or off a player's ability to gain XP
* These flags default to on unless you specify otherwise
### World Blacklist
* You can now disable mcMMO completely for specific worlds via `world_blacklist.txt` in /plugins/mcMMO/
* This file appears once mcMMO has been run at least once
* Every line of this file should be the name of a world where you don't want mcMMO to be enabled!
### Rank System
* Skills that are not yet unlocked will show up as `???` until learned
* Many skills now make use of a rank system!
* Rank level requirements are modified in `skillranks.yml`
* Woodcutting's Double Drop subskill is now named Harvest Lumber
* Archery's Skill Shot now uses a rank system
* Swords' Bleed now uses a rank system
* Swords' Counter Attack now uses a rank system
* Axe's Axe Mastery now uses a rank system
* Axe's Impact now uses a rank system
* Herbalism's Farmer's Diet now uses a rank system
* Herbalism's Green Thumb now uses a rank system
* Shake now uses a rank system
* Flux Mining now uses a rank system
* Removed traps from fishing
* Dodge now uses a rank system
* Arrow Retrieval now uses a rank system
* Axes' Critical Strikes now uses a rank system
* Axes' Greater Impact now uses a rank system
* Taming's Beast Lore now uses a rank system
* Taming's Gore now uses a rank system
* Taming's Call of the Wild now uses a rank system
* Taming's Pummel now uses a rank system
* Green Thumb now uses a rank system
* Farmer's Diet & Fisherman's Diet now use a rank system
### mcMMO Chat Alerts
* mcMMO no longer spams your chat!
* Most messages are sent to your action bar instead!
* Completely configurable! You can have mcMMO spam your chat again if you want!
* You can configure it so that messages will be sent to your action bar AND your chat system!
* Improved some of the messages sent to the player regarding the Chimaera Wing
### Localization File
* The descriptions of a few skills have changed
* Locale files now support & codes for colors and formatting!
* Added locale strings for new Woodcutting abilities
* Added locale strings for mcchatspy command
* Added locale strings for JSON integration
* Added locale strings for Taming's Pummel SubSkill
* Added locale strings for Unarmed's Block Cracker SubSkill
* Removed localizations with the following codes for being almost empty: `id`, `HR_hr`, `et_EE`, `lv`, `lt`, `no`, `pl_PL`, `pt_PT`, `tr_TR`
* Removed redundant information from some skill names and descriptions `en_US` (other locales will need to be updated)
* SubSkill locale keys are now located at `{ParentSkill}.SubSkill.SubSkillName`
* Super Abilities no longer have `(ABILITY)` in their `Skill.Effect` strings
### UI
* Certain elements of mcMMO's UI have been restyled
* Skills can now be clicked on and hovered over for more information!
* Added links to mcMMO related websites to various commands
* Customizeable and optional XP Bars
* Added the tagline "Overhaul Era" to various locations until 3.0.0 comes out
* Added option to disable the new URL links to `config.yml`
### Sounds
* Volume and Pitch of sounds can now be configured in the new `sounds.yml` file
### Super Ability Changes
* Skill Super Abilities now use a rank system, the default rank to unlock is level 5
* Activating Super abilities plays a sound (other plays can hear this)
* Ability Lengths now have a default skill cap at which they stop increasing in length
* Setting the cap to 0 removes it!
* Configurable in `advanced.yml` (endurance perks extend this limit)
### Skills
* mcMMO now notifies you when you progress in a skill!
* Excavation Treasure Hunter is renamed to Archaeology
* Readying a tool for a super ability now plays a sound
* Skill Unlock Notifications have sounds
* Stripping wood and right clicking on stripped wood will no longer ready your Axe
* Added new skill 'Understanding The Art' which adds nothing new but tracks previously hidden benefits of raising a skill
* Tool alerts now are sent to the Action Bar
* Super Ability activation alerts are now sent to the Action Bar
* Almost all Skill-related messages are now sent to the Action Bar
* Added some missing information to skill stats
* Swords no longer require blocking with a shield to trigger counter attacks
* Sword's Bleed has been renamed to Rupture
* Sword's Rupture no longer has an internal hard coded limit
* Sword's Serrated Strikes now uses your Rupture rank to determine the damage/ticks for its bleed effect.
* Sword's Rupture now ticks four times as fast
* Sword's Rupture now refreshes bleed duration instead of adding duration when applying bleed to the same target
* Sword's Rupture will now deal lethal damage
* Sword's Rupture now reaches its max proc chance at level 20 (200 in Retro)
* Sword's Rupture now has a max chance to proc of 33% instead of 70%
* Sword's Rupture now deals 50% more damage at above Rank 3 and can last much longer!
* The base damage for Bleed has been increased as well (update your `advanced.yml` admins)
* Sword's Rupture no longer triggers invincibility frames when damaging your opponent
* Sword's Rupture now plays a sound
* Taming's Gore now uses Rupture Rank 1 for its DoT calculations
* Furnaces now give XP to the last person to modify their inventory instead of the first person to open them
* Rolling now plays a sound (Graceful Roll has a different sound :) )
* Acrobatics' Roll exploit detection was tweaked to still allow for Roll to trigger even if it rewards no XP
* Acrobatics' Roll & Gracefull Roll are now considered the same skill (both mechanics are still there)
* Some skill level rank requirements have changed
### Experience
* Skills now start at level 1 (configurable in advanced.yml)
* Starting an XP event will now use the title API (toggle this in `advanced.yml`)
* The XP values of fish are now based on their rarity and have been drastically changed
* Coral (blocks) now give Mining XP
* Coral (plants) now give Herbalism XP
* Blue Ice now gives Mining XP
* Dolphins now give combat XP
* Drowned mobs now count towards combat XP
* Added missing mushroom blocks for XP
* You can now set guaranteed minimum values for XP gained if diminishing returns are enabled, this value defaults to 5% (`experience.yml`)
### Bug Fixes
* Fixed the bug where mob names would be replaced by hearts
* Fixed a bug where Rupture would apply an incorrect amount of bleed ticks
* Fixed bug where XP rate could be a negative number
* Fixed a bug where you could set a players levels into the negative and bad things would happen
* Fixed an edge case bug where Blast Mining wouldn't inform the player that it was on cooldown
### Plugin Compatibility
* mcMMO now fires new custom events relating to changes it makes to player scoreboards, plugin authors can listen to these events to improve compatibility
### Exploit Fixes
* Prevented exploits involving blocks made from entities (snowmen, etc..)
* Chimaera Wing now tracks cooldowns between sessions for players (no more disconnect abuse)
* Tridents will no longer be considered unarmed
* Prevented exploits involving 2 high herbs and chorus flowers
* Vastly Improved the Acrobatics exploit detection checks
### Parties
* Parties can now have size limits (configurable in `config.yml`), party size is unlimited by default
* You can now turn on Friendly Fire for parties in `config.yml`
* Party member list will only include members of the party that you can see (aren't vanished)
### Scoreboards
* Scoreboards are now disabled by default since most of their functionality is handled better by XP bars.
* Added toggle to disable all scoreboards (previously you had to disable them one by one)
* You can turn them back on in `config.yml`
* You can have XP bars and scoreboards on at the same time
### MySQL
* Added support for SSL for MySQL/MariaDB in config.yml (On by default)
* mcMMO no longer spams your console if you are not using SSL for your MySQL server
* You can now inspect offline players
* When converting from MySQL to flatfile mcMMO will now properly include all users in the conversion process
### Admins
* Added ability for admins to spy on party chat (off unless toggled on) /mcchatspy
* The Debug stick can now tell you about properties of a block related to Excavation
### API
* Detailed guide to API changes is available at http://api.mcmmo.org
* Added many missing `SubSkills` to `SubSkillType` class
* Moved a lot of methods from `SkillCommand` to `SkillUtils`
* `SkillType` is now `PrimarySkillType`
* `SecondarySkill` is now `SubSkillType`
* `AbilityType` is now `SuperAbilityType`
* `SecondaryAbilityEvent` is now `SubSkillEvent`
* `SubSkillType` has had many helpful methods added to it
* `GREEN_THUMB_PLANT` & `GREEN_THUMB_BLOCK` are replaced by `GREEN_THUMB`
### Permissions
* Removed all mob health bar permissions, this is no longer a per-player setting.
* Added permission node `mcmmo.commands.mcchatspy` & `mcmmo.commands.mcchatspy.others`
* Added `mcmmo.commands.mmoinfo` for the new `mmoinfo`/`mcinfo` command
* Added permission nodes for Harvest Lumber, Splinter, Nature's Bounty, and Bark Surgeon
* Call of the wild now uses `mcmmo.ability.taming.callofthewild` instead of `mcmmo.ability.taming.callofthewild.all`
* Replaced the old Double Drop permission node for woodcutting with a new Harvest Lumber permission node
* Fast Food Service permission node renamed to `mcmmo.ability.taming.fastfoodservice`
* Counter Attack permission node renamed to `mcmmo.ability.swords.counterattack`
* Arrow Deflect permission node renamed to `mcmmo.ability.unarmed.arrowdeflect`
* Iron Arm Style permission node renamed to `mcmmo.ability.unarmed.ironarmstyle`
### Commands
* Added new info command `/mmoinfo` or `/mcinfo`
* Added toggle command `/mcchatspy`
* `/mcMMO help` no longer displays the other/special commands category to players lacking permissions
* Removed the `mobhealthbar` command, this is no longer a per-player setting.
### Misc Config Changes
* Removed `SkillShot`'s `IncreaseLevel` & `IncreasePercentage` (replaced by `RankDamageMultiplier`)
* Removed `AxeMastery`'s `MaxBonus` & `MaxBonusLevel` (replaced by `RankDamageMultiplier`)
* `Unarmed.IronArm` in `advanced.yml` is now `Unarmed.IronArmStyle`
* `Unarmed.Deflect` in `advanced.yml` is now `Unarmed.ArrowDeflect`
* `Swords.Counter` in `advanced.yml` is now `Swords.CounterAttack`
* `Archery.Retrieve` in `advanced.yml` is now `Archery.ArrowRetrieval`
* `Axes.CriticalHit` in `advanced.yml` is now `Axes.CriticalStrikes`
* Archery's Skill Shot now uses `RankDamageMultiplier` for its damage bonus calculations
* Axe's Axe mastery now uses `RankDamageMultiplier` for its damage bonus calculations
### Misc Changes
* Removed everything involving the kraken
* Code cleanup in a lot of places... unfortunately there is still much left to do!

View File

@@ -1,56 +1,39 @@
# mcMMO
## The RPG lovers mod
## Website
I'm working on a brand new website for mcMMO
You can check it out here http://www.mcmmo.org
I plan to post links to our new wiki (its still under development), downloads, and dev blogs there.
### Contributing
As the plugin is being developed for multiple Minecraft versions, and multiple Minecraft platforms (read: [sponge](https://spongepowered.org/), [spigot](https://spigotmc.org/), bukkit, and [paper](https://papermc.io)), the
overall build process is handled by [Gradle](https://gradle.org/) with [Kotlin-dsl](https://github.com/gradle/kotlin-dsl) based scripts.
As such, an IDE is strongly recommended when attempting to contribute features, additions, changes, bug fixes, etc. to mcMMO as the scripts handle a
majority of our dependencies and rebuilding a production worthy jar.
To get started, a few things need to be installed:
- JDK 8 (not 9, 10, 11, or 7)
- git
- Your favorite IDE (can be [Eclipse](https://eclipse.org/), [IntelliJ](https://jetbrains.org/)
- BuildTools.jar from [Spigot](https://www.spigotmc.org/wiki/buildtools/)
##### Using BuildTools
BuildTools is used to generate the craftbukkit/spigot dependencies used for varoius versions of Minecraft.
The key with this tool is that it can build and deploy multiple vesions of Minecraft based on "reviewions".
### Builds
Currently, you can obtain our builds via the Spigot resource page: https://spigot.mcmmo.org
Currently, you can obtain our builds via the Spigot resource page: http://www.spigotmc.org/resources/mcmmo.2445/
### 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.
### Project Lead & Founder
[![com.gmail.nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)](https://github.com/com.gmail.nossr50)
### Former Lead
[![gmcferrin](http://www.gravatar.com/avatar/b64c52daf25d206b27650788b5813b7b.png)](https://github.com/gmcferrin)
### Developers
[![bm01](http://www.gravatar.com/avatar/ec8146f5358177f12e9a252271bbc391.png)](https://github.com/bm01)
[![Glitchfinder](http://www.gravatar.com/avatar/5aa4cce22f72ae9c002ecec30f061d00.png)](https://github.com/Glitchfinder)
[![NuclearW](http://www.gravatar.com/avatar/90926bdcf1c8a75918df5ea5fa801ce6.png)](https://github.com/NuclearW)
[![shatteredbeam](http://www.gravatar.com/avatar/cad3b5d7d39cf5387afb87f494389610.png)](https://github.com/shatteredbeam)
[![TfT_02](http://www.gravatar.com/avatar/b8914f9970e1f6ffd5281ce4770e20a7.png)](https://github.com/TfT-02)
[![t00thpick1](http://www.gravatar.com/avatar/ee23c7794a0c40120c3474287c7bce06.png)](https://github.com/t00thpick1)
[![riking](https://1.gravatar.com/avatar/aca9f37e569ac3a63929920035a91ba4.png)](https://github.com/riking)
[![gmcferrin](http://www.gravatar.com/avatar/b64c52daf25d206b27650788b5813b7b.png)]
(https://github.com/gmcferrin)
[![bm01](http://www.gravatar.com/avatar/ec8146f5358177f12e9a252271bbc391.png)]
(https://github.com/bm01)
[![Glitchfinder](http://www.gravatar.com/avatar/5aa4cce22f72ae9c002ecec30f061d00.png)]
(https://github.com/Glitchfinder)
[![nossr50](http://www.gravatar.com/avatar/f2ee41eedfd645fb4a3a2c8f6cb1b18c.png)]
(https://github.com/nossr50)
[![NuclearW](http://www.gravatar.com/avatar/90926bdcf1c8a75918df5ea5fa801ce6.png)]
(https://github.com/NuclearW)
[![shatteredbeam](http://www.gravatar.com/avatar/cad3b5d7d39cf5387afb87f494389610.png)]
(https://github.com/shatteredbeam)
[![TfT_02](http://www.gravatar.com/avatar/b8914f9970e1f6ffd5281ce4770e20a7.png)]
(https://github.com/TfT-02)
[![t00thpick1](http://www.gravatar.com/avatar/ee23c7794a0c40120c3474287c7bce06.png)]
(https://github.com/t00thpick1)
[![riking](https://1.gravatar.com/avatar/aca9f37e569ac3a63929920035a91ba4.png)]
(https://github.com/riking)
### Special thanks
[![EasyMFnE](https://www.gravatar.com/avatar/99c9a1fa3bbf957791ceac7b45daadb0.png)](https://github.com/EasyMFnE)
[![EasyMFnE](https://www.gravatar.com/avatar/99c9a1fa3bbf957791ceac7b45daadb0.png)]
(https://github.com/EasyMFnE)
Added the Alchemy skill
## Compiling
@@ -60,7 +43,8 @@ mcMMO uses Maven 3 to manage dependencies, packaging, and shading of necessary c
The typical command used to build mcMMO is: `mvn clean package install`
Required Libraries:
* Bukkit
* JUnit
* EMetrics
* Bukkit
https://spigot.mcmmo.org for more up to date information.
http://www.spigotmc.org/resources/mcmmo.2445/ for more up to date information.

View File

@@ -1,139 +0,0 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ConfigureShadowRelocation
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
/*
* Declares the version of the Gradle wrapper. We need 4.9 for now because
* ForgeGradle 3+ is a hard dependency for Gradle 4.9, 4.10 is not compatible
*/
val wrapper by tasks.getting(Wrapper::class) {
gradleVersion = "4.9"
}
/*
* Sets up project references to be used in child scripts, like
* ":bukkit", ":core", ":sponge" where these projects need to be
* referred to for dependencies, paths, outputs etc.
* Projects is specifically an object stored in <root>/buildSrc/src/main/java/Config.kt
* It's a nullable variable, but we just store it here and use it elsewhere.
*/
Projects.core = project("core")
Projects.bukkit = project("bukkit")
Projects.sponge = project("sponge")
/*
Declares the various other projects and stores them to Gradle's `extra` properties.
These are potentially usable for other purposes, but for now, they're here only to
declare the values for this root project's dependency (for shadowjar)
*/
var core: Project by extra { project("core") }
val bukkit by extra { project("bukkit") }
val bukkit_18 by extra { bukkit.project("1_8_8") }
val bukkit_112 by extra { bukkit.project("1_12") }
val bukkit_113 by extra { bukkit.project("1_13") }
val sponge by extra { project("sponge") }
val sponge_7 by extra { sponge.project("api7") }
group = properties["pluginGroup"]!!
version = properties["pluginVersion"]!!
/*
Even though all projects declares some of these plugins, we want to declare them the traditional
way so that we can have IDE utiliziation and processing, it helps with writing these scripts.
*/
plugins {
`java-library`
`maven-publish`
id("com.github.johnrengelman.shadow") version "4.0.4"
}
/*
Default management for ALL projects, not just root, or ":bukkit", but all projects and
their children projects.
*/
allprojects {
/*
We need the java library processing, and shadow allows us to run
shadowJar to relocate dependencies and bundle dependencies into a fat jar.
*/
apply(plugin="java-library")
apply(plugin="com.github.johnrengelman.shadow")
/*
Defines all the repositories for all project dependency resolutions. Some of these
repositories are meant for specific dependencies, so the content filters will
prevent attempts at resolving those dependencies being requested at those repositories.
Constants are defined in <root>/buildSrc/src/main/java/Config.kt
*/
repositories {
mavenCentral()
maven(Repos.sk89q) // WorldEdit/WorldGuard
maven(Repos.bstats) // bstats
maven(Repos.sponge) // Sponge, Configurate, and some other things
maven(Repos.spigot) // Spigot and Bukkit
maven(Repos.sonatype) // General Maven
mavenLocal() // For nms packages
}
// Sets all projects compatibility level to Java 8
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
// Encoding for all packages is UTF-8
tasks.getting(JavaCompile::class) {
options.encoding = "UTF-8"
}
// Default shadow jar configuration. Sub projects will override and add on,
// but this sets up at the very least the jdbc connection dependencies to be relocated
val shadowJar by tasks.getting(ShadowJar::class) { // Configure basics of relocation
relocate(Shadow.Origin.juli, Shadow.Target.juli)
relocate(Shadow.Origin.tomcat, Shadow.Target.tomcat)
exclude(Shadow.Exclude.ForgeGradle.dummyThing)
exclude(Shadow.Exclude.ForgeGradle.template)
}
}
/*
All subprojects shadowjar tasks that will exclude various dependencies, while
the root project will include some of these dependencies (like jdbc, configurate)
so that the sub project jars are already somewhat minimized, in the event those
platform jars are to be deployed individually versus an overall "all platforms"
jar.
*/
subprojects {
val shadowJar by tasks.getting(ShadowJar::class) {
dependencies {
exclude(dependency("${Deps.Groups.sponge}:${Deps.Modules.configurate_yaml}"))
exclude(dependency(Shadow.Exclude.guava))
exclude(dependency(Shadow.Exclude.snakeyaml))
exclude(dependency(Shadow.Exclude.tomcat))
exclude(dependency(Shadow.Exclude.juli))
}
}
}
// Sets up this root project to depend on all the implementations supported.
// By default, they all already should have shadow relocations and packaging,
// and their dependencies should not be leaking into this project.
dependencies {
compile(bukkit)
compile(sponge)
compile(bukkit_18)
compile(bukkit_112)
compile(bukkit_113)
compile(sponge_7)
}
// Configure shadow for the root project, we want to relocate bstats-bukkit
// and whatever else is configured in the allProjects configuration
val shadowJar by tasks.getting(ShadowJar::class) { // Root shadow relocation
relocate(Shadow.Origin.bstatsBukkit, Shadow.Target.bstatsBukkit)
baseName = "mcMMO"
classifier = "bundle"
}
// Tell the build task to depend on shadowjar.
val build by tasks
build.dependsOn(shadowJar)

View File

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

View File

@@ -1,191 +0,0 @@
@file:Suppress("MayBeConstant", "unused")
import org.gradle.api.Project
object Plugins {
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
object FG2_3 {
const val classpath = "net.minecraftforge.gradle:ForgeGradle:${Versions.fg23}"
const val extensionName = "minecraft"
const val id = "net.minecraftforge.gradle.forge"
}
}
object Repos {
const val sk89q = "https://maven.sk89q.com/repo"
// bStats
const val bstats = "https://repo.codemc.org/repository/maven-public"
// configurate
const val sponge = "https://repo.spongepowered.org/maven/"
const val spigot = "https://hub.spigotmc.org/nexus/content/repositories/snapshots"
const val sonatype = "https://oss.sonatype.org/content/repositories/snapshots"
const val forge = "https://files.minecraftforge.net/maven/"
}
object Config {
object Libs {
const val configurate = "${Deps.Groups.sponge}:${Deps.Modules.configurate_yaml}:${Versions.configurate}"
const val jdbc = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}:${Versions.jdbc}"
const val juli = "${Deps.Groups.tomcat}:${Deps.Modules.juli}:${Versions.jdbc}"
const val junitDep = "${Deps.Groups.junit}:${Deps.Modules.junit}:${Versions.junit}"
const val flowmath = "${Deps.Groups.flowpowered}:${Deps.Modules.flowmath}:${Versions.flowmath}"
object Bukkit {
object `1_8` {
const val api = "$bukkit:${Versions.bukkit18}"
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit18}"
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit18}"
const val nms = "$craftbukkit:${Versions.bukkit18}"
// only legacy existed at this point, no core.
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg18}"
}
object `1_12` {
const val api = "$bukkit:${Versions.bukkit112}"
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit112}"
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit112}"
const val nms = "$craftbukkit:${Versions.bukkit112}"
// only legacy existed at this point, no core.
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg112}"
}
object `1_13` {
const val api = "$bukkit:${Versions.bukkit113}"
const val spigotApi = "${Bukkit.spigotApi}:${Versions.bukkit113}"
const val spigot = "$${Bukkit.spigot}:${Versions.bukkit113}"
const val nms = "$craftbukkit:${Versions.bukkit113}"
const val wgCore = "${Bukkit.wgCore}:${Versions.wg113}"
const val wgLegacy = "${Bukkit.wgLegacy}:${Versions.wg113}"
}
const val bukkit = "${Deps.Groups.bukkit}:${Deps.Modules.bukkit}"
const val craftbukkit = "${Deps.Groups.bukkit}:${Deps.Modules.craftbukkit}"
const val wgCore = "${Deps.Groups.worldguard}:${Deps.Modules.wgCore}"
const val wgLegacy = "${Deps.Groups.worldguard}:${Deps.Modules.wgLegacy}"
const val spigotApi = "${Deps.Groups.spigot}:${Deps.Modules.spigotApi}"
const val spigot = "${Deps.Groups.spigot}:${Deps.Modules.spigot}"
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsBukit}:${Versions.bstats}"
}
object Sponge {
object API7 { // All of these are specific to the API7 module, API8 will change
const val forgeGradleId = "net.minecraftforge.gradle.forge"
const val spongeGradleId = "${Deps.Groups.sponge}.plugin"
const val spongeGradleVersion = "0.9.0"
const val api = "${Sponge.api}:${Versions.sapi7}"
const val common = "${Sponge.common}:${Versions.spongeImpl7}"
const val forge_version = "14.23.5.2768"
const val minecraftVersion = "1.12.2-$forge_version"
const val mappings = "snapshot_20180808"
}
object Exclude {
const val group = Deps.Groups.sponge
const val module = Deps.Modules.spongeAPI
}
const val api = "${Deps.Groups.sponge}:${Deps.Modules.spongeAPI}"
const val common = "${Deps.Groups.sponge}:${Deps.Modules.spongecommon}"
const val bstats = "${Deps.Groups.bstats}:${Deps.Modules.bstatsSponge}:${Versions.bstats}"
}
}
}
object Deps {
object Groups {
const val nossr = "com.gmail.nossr50"
const val google = "com.google"
const val guava = "com.google.guava"
const val gson = "com.google.code.gson"
const val yaml = "org.yaml"
const val sk89q = "com.sk89q"
const val apache = "org.apache"
const val worldguard = "$sk89q.worldguard"
const val worldedit = "$sk89q.worldedit"
const val sponge = "org.spongepowered"
const val spigot = "org.spigotmc"
const val md5 = "net.md_5"
const val bukkit = "org.bukkit"
const val bstats = "org.bstats"
const val tomcat = "org.apache.tomcat"
const val junit = "junit"
const val checker = "org.checkerframework"
const val flowpowered = "com.flowpowered"
}
object Modules {
const val guava = "guava"
const val gson = "gson"
const val snakeyaml = "snakeyaml"
const val wgCore = "worldguard-core"
const val wgLegacy = "worldguard-legacy"
const val bungeecordChat = "bungeecord-chat"
const val spongeAPI = "spongeapi"
const val spongecommon = "spongecommon"
const val spongeforge = "spongeforge"
const val spongevanilla = "spongevanilla"
const val bukkit = "bukkit"
const val craftbukkit = "craftbukkit"
const val bstatsBukit = "bstats-bukkit"
const val bstatsSponge = "bstats-sponge"
const val spigotApi = "spigot-api"
const val spigot = "spigot"
const val configurate = "configurate"
const val configurate_core = "${configurate}-core"
const val configurate_yaml = "${configurate}-yaml"
const val jdbc = "tomcat-jdbc"
const val juli = "tomcat-juli"
const val junit = "junit"
const val checker = "checker-qual"
const val flowmath = "flow-math"
}
}
object Projects {
var core: Project? = null
var bukkit: Project? = null
var sponge: Project? = null
}
object Shadow {
object Origin {
const val juli = "${Deps.Groups.apache}.juli"
const val tomcat = "${Deps.Groups.apache}.tomcat"
const val apache = "${Deps.Groups.apache}.commons.logging"
const val bstatsBukkit = "${Deps.Groups.bstats}.bukkit"
const val configurate = "ninja.leaping.configurate"
const val checker = "org.checkerframework"
}
object Target {
const val juli = "${Deps.Groups.nossr}.database.tomcat.juli"
const val tomcat = "${Deps.Groups.nossr}.database.tomcat"
const val apache = "${Deps.Groups.nossr}.commons.logging"
const val bstatsBukkit = "${Deps.Groups.nossr}.metrics.bstat"
const val configurate = "${Deps.Groups.nossr}.${Deps.Modules.configurate}"
const val checker = "${Deps.Groups.nossr}.${Deps.Modules.configurate}.checkerframework"
}
object Exclude {
const val tomcat = "${Deps.Groups.tomcat}:${Deps.Modules.jdbc}"
const val juli = "${Deps.Groups.apache}:${Deps.Modules.juli}"
const val guava = "${Deps.Groups.guava}:${Deps.Modules.guava}"
const val snakeyaml = "${Deps.Groups.yaml}:${Deps.Modules.snakeyaml}"
const val bukkit = Deps.Groups.bukkit
const val spigot = Deps.Groups.spigot
const val sk89q = "com.sk89q"
const val wg = "$sk89q.worldguard"
const val intake = "$sk89q.intake"
const val flyway = "com.flywaydb"
const val khelekore = "org.khelekore"
const val findbugs = "com.google.code.findbugs"
const val bstats = "${Deps.Groups.bstats}"
object ForgeGradle {
const val dummyThing = "dummyThing"
const val template = "Version.java.template"
}
}
}

View File

@@ -1,16 +0,0 @@
object Versions {
const val configurate = "3.6" // Latest configurate
const val flowmath = "1.0.4-SNAPSHOT"
const val bukkit18 = "1.8.8-R0.1-SNAPSHOT" // Last bukkit 1.8.8
const val bukkit112 = "1.12.2-R0.1-SNAPSHOT" // Last bukkit 1.12.2
const val bukkit113 = "1.13.2-R0.1-SNAPSHOT" // Latest bukkit
const val sapi7 = "7.1.0" // Latest SpongeAPI stable
const val spongeImpl7 = "7.1.5" // Latest SpongeCommon stable
const val jdbc = "7.0.52"
const val junit = "4.12"
const val fg23 = "2.3-SNAPSHOT" // ForgeGradle to support MC 1.12.2
const val wg18 = "6.1.2" // Bukkit/CraftBukkit/Spigot 1.8.8 supported build, works on newer, but last one to support 1.8.8
const val wg112 = "6.2" // Last WorldGuard to support 1.12
const val wg113 = "7.0.0-SNAPSHOT" // Latest WorldGuard to support 1.13.2
const val bstats = "1.4" // Supports all backwards compatible. Always relocated
}

View File

@@ -1,27 +0,0 @@
import Config.Libs.Bukkit.`1_12` as Bukkit
// Config is located in <root>/buildSrc/src/main/java/Config.kt
// It provides a bunch of constant values we use as dependency
// strings, so we don't have to duplicate a bunch of them in
// various scripts.
plugins {
java // This is already provided, but for static compilation,
// we declare it here so we can use the IDE static type references
}
/*
Dependency inheritance is as follows
- ":core", which provides
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
dependencies like guava and apache commons lang.
- ":bukkit", which provides nothing on it's own, except the
core bukkit classes that can be built on 1.13.2 API (which may change).
It also defines all subprojects to depend on ":core", and ":bukkit",
and bstats-bukkit.
*/
dependencies {
compileOnly(Bukkit.api) // Bukkit API for 1.12.2
compileOnly(Bukkit.nms) // CraftBukkit for 1.12.2
compileOnly(Bukkit.wgLegacy) // WorldGuard for 1.12.2 bukkit
}

View File

@@ -1,106 +0,0 @@
package com.gmail.nossr50.bukkit.v1_12;
import com.gmail.nossr50.VersionedHandler;
import com.gmail.nossr50.mcMMO;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import net.minecraft.server.v1_12_R1.Chunk;
import net.minecraft.server.v1_12_R1.EntityTypes;
import net.minecraft.server.v1_12_R1.IBlockData;
import net.minecraft.server.v1_12_R1.IBlockState;
import net.minecraft.server.v1_12_R1.MinecraftKey;
import net.minecraft.server.v1_12_R1.RegistryBlocks;
import net.minecraft.server.v1_12_R1.RegistryMaterials;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v1_12_R1.CraftChunk;
import org.bukkit.craftbukkit.v1_12_R1.block.CraftBlockState;
import org.bukkit.craftbukkit.v1_12_R1.entity.CraftEntity;
import org.bukkit.entity.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class NmsHandler extends VersionedHandler {
/**
* Static reference to the block registry. Don't really care about the fact that
* it is being stored as a reference here, but for imports reasons, it's smaller
* line length makes it optimal to read for method usages.
*/
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_12_R1.Block> BLOCK_REGISTRY = net.minecraft.server.v1_12_R1.Block.REGISTRY;
/**
* We can keep track of block state id's by generating them on demand, i.e., when
* they're being requested from Blocks, or BlockDatas.
*/
private static final RegistryMaterials<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
NmsHandler(mcMMO plugin) {
super(plugin);
}
@Override
public String getIdFor(Block block) {
// We have to get the underlying nms block by the block, which might as well just be the type id.
final Chunk chunk = ((CraftChunk) block.getChunk()).getHandle();
// Get the block state from the underlying chunk (stored by reference in CraftBlock)
final IBlockData blockState = chunk.a(block.getX(), block.getY(), block.getZ());
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
final MinecraftKey key = BLOCK_REGISTRY.b(blockState.getBlock());
return key.toString();
}
@Override
public String getIdFor(Entity entity) {
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
final net.minecraft.server.v1_12_R1.Entity nmsEntity = ((CraftEntity) entity).getHandle();
// And then... well. we get the string id from the registry, based on the entity class to id mapping in EntityTypes.
final MinecraftKey key = EntityTypes.a(nmsEntity);
// If the key is null, well, we've got bigger problems...
return key == null ? "minecraft:slime" : key.toString();
}
@SuppressWarnings("Duplicates")
@Override
public String getIdFor(BlockState block) {
// Since we don't really want to trust what "BlockState" gives us, and the API doesn't give us anything but
// what the API wants to give us, we have to dig into internals to get the true BlockState representation
final CraftBlockState craftState = (CraftBlockState) block;
// Because CraftBlock also stores the chunk reference, we can short cut in to use the chunk, instead of pinging
// the chunk map on WorldServer
final CraftChunk craftChunk = (CraftChunk) craftState.getChunk();
// Then query for the block state from the chunk.
final IBlockData nmsState = craftChunk.getHandle().a(block.getX(), block.getY(), block.getZ());
// And then we're gucci
final net.minecraft.server.v1_12_R1.Block nmsBlock = nmsState.getBlock();
final MinecraftKey blockKey = BLOCK_REGISTRY.b(nmsBlock);
// Now we can check if our blockstate registry actually has the block state.
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.b(nmsState);
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
return stateKey.toString();
}
// If not, well, it needs to have a key generated and registered.
final String nameSpace = blockKey.getKey();
StringBuilder builder = new StringBuilder();
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
// Get the full Property -> Value mapping for the block state
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.t();
if (!properties.isEmpty()) {
builder.append('[');
Joiner joiner = Joiner.on(',');
List<String> propertyValues = new ArrayList<>();
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
}
builder.append(joiner.join(propertyValues));
builder.append(']');
}
// Now we can make the MinecraftKey...
final MinecraftKey newKey = new MinecraftKey(builder.toString());
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
return newKey.toString();
}
}

View File

@@ -1,27 +0,0 @@
import Config.Libs.Bukkit.`1_13` as Bukkit
// Config is located in <root>/buildSrc/src/main/java/Config.kt
// It provides a bunch of constant values we use as dependency
// strings, so we don't have to duplicate a bunch of them in
// various scripts. The import allows us to "import as" for shorthand
plugins {
`java-library` // This is already provided, but for static compilation,
// we declare it here so we can use the IDE static type references
}
/*
Dependency inheritance is as follows
- ":core", which provides
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
dependencies like guava and apache commons lang.
- ":bukkit", which provides nothing on it's own, except the
core bukkit classes that can be built on 1.13.2 API (which may change).
It also defines all subprojects to depend on ":core", and ":bukkit",
and bstats-bukkit.
*/
dependencies {
compileOnly(Bukkit.api) // Bukkit API for 1.13.2 - Defined in <root>/buildSrc/src/main/java/Config.kt
compileOnly(Bukkit.nms) // CraftBukkit-1.13.2-R0.1-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
compileOnly(Bukkit.wgCore) // WorldGuard-core - Defined in <root>/buildSrc/src/main/java/Config.kt
compileOnly(Bukkit.wgLegacy) // WorldGuard-legacy - Defined in <root>/buildSrc/src/main/java/Config.kt
}

View File

@@ -1,101 +0,0 @@
package com.gmail.nossr50.bukkit.v1_13;
import com.gmail.nossr50.VersionedHandler;
import com.gmail.nossr50.mcMMO;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import net.minecraft.server.v1_13_R2.EntityTypes;
import net.minecraft.server.v1_13_R2.IBlockData;
import net.minecraft.server.v1_13_R2.IBlockState;
import net.minecraft.server.v1_13_R2.IRegistry;
import net.minecraft.server.v1_13_R2.MinecraftKey;
import net.minecraft.server.v1_13_R2.RegistryMaterials;
import net.minecraft.server.v1_13_R2.WorldServer;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlock;
import org.bukkit.craftbukkit.v1_13_R2.block.CraftBlockState;
import org.bukkit.craftbukkit.v1_13_R2.entity.CraftEntity;
import org.bukkit.entity.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class NmsHandler extends VersionedHandler {
private static final IRegistry<net.minecraft.server.v1_13_R2.Block> BLOCK_REGISTRY = IRegistry.BLOCK;
private static final IRegistry<EntityTypes<?>> ENTITY_REGISTRY = IRegistry.ENTITY_TYPE;
/**
* We use {@link RegistryMaterials} because we don't want to default to another block state,
* if a {@link IBlockData} is not registered, we need to generate an ID and register that key to
* that {@link IBlockData}. By default, this should be populated during plugin startup by
* calling some init method, but that will be determined later.
*/
private static final IRegistry<IBlockData> BLOCK_STATE_REGISTRY = new RegistryMaterials<>();
NmsHandler(mcMMO plugin) {
super(plugin);
}
@Override
public String getIdFor(Block block) {
// We have to get the underlying nms block by the block, which might as well just be the type id.
final WorldServer world = ((CraftBlock) block).getCraftWorld().getHandle();
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
final IBlockData blockState = world.getType(((CraftBlock) block).getPosition());
// Sadly, Mojang doesn't store the string id onto blocks, states, or any of their types, they just call the registry.
final MinecraftKey key = BLOCK_REGISTRY.getKey(blockState.getBlock());
// Sometimes, there's a rare case with mods where the key is going to be null, but should never happen in bukkit/spigot.
return key == null ? "minecraft:air" : key.toString();
}
@Override
public String getIdFor(Entity entity) {
// Every entity knows it's "type". Here, we just use the right method getter to get the EntityTypes instance for that entity
final EntityTypes<?> entityType = ((CraftEntity) entity).getHandle().P();
// And then... well. we get the string id from the registry!
final MinecraftKey key = ENTITY_REGISTRY.getKey(entityType);
// If the key is null, well, we've got bigger problems...
return key == null ? "minecraft:slime" : key.toString();
}
@SuppressWarnings("Duplicates")
@Override
public String getIdFor(BlockState block) {
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
// the world.
final CraftBlockState craftState = (CraftBlockState) block;
final IBlockData nmsState = craftState.getHandle();
final net.minecraft.server.v1_13_R2.Block nmsBlock = nmsState.getBlock();
final MinecraftKey blockKey = BLOCK_REGISTRY.getKey(nmsBlock);
// Now we can check if our blockstate registry actually has the block state.
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.getKey(nmsState);
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
return stateKey.toString();
}
// If not, well, it needs to have a key generated and registered.
final String nameSpace = blockKey.getKey();
StringBuilder builder = new StringBuilder();
builder.append(nameSpace); // We only want to get the block id, not the domain id, since that's going to be appended later
// Get the full Property -> Value mapping for the block state
final ImmutableMap<IBlockState<?>, Comparable<?>> properties = nmsState.getStateMap();
if (!properties.isEmpty()) {
builder.append('[');
Joiner joiner = Joiner.on(',');
List<String> propertyValues = new ArrayList<>();
// Yadadadada, go through all property entries and add each as a string for the "propertyName=value" (like "variant=oak")
for (Map.Entry<IBlockState<?>, Comparable<?>> entry : properties.entrySet()) {
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
}
builder.append(joiner.join(propertyValues));
builder.append(']');
}
// Now we can make the MinecraftKey...
final MinecraftKey newKey = new MinecraftKey(builder.toString());
BLOCK_STATE_REGISTRY.a(newKey, nmsState);
return newKey.toString();
}
}

View File

@@ -1,23 +0,0 @@
import Config.Libs.Bukkit.`1_8` as Bukkit
plugins {
java
}
/*
Dependency inheritance is as follows
- ":core", which provides
configurate, tomcat jdbc/juli, and flowmath. It excludes sub
dependencies like guava and apache commons lang.
- ":bukkit", which provides nothing on it's own, except the
core bukkit classes that can be built on 1.13.2 API (which may change).
It also defines all subprojects to depend on ":core", and ":bukkit",
and bstats-bukkit.
*/
dependencies {
compileOnly(Bukkit.api) // Bukkit API for 1.8.8 - Defined in <root>/buildSrc/src/main/java/Config.kt
compileOnly(Bukkit.nms) // CraftBukkit-1.8.8-R0.3-SNAPSHOT - Defined in <root>/buildSrc/src/main/java/Config.kt
compileOnly(Bukkit.wgLegacy) // Old worldguard - Defined in <root>/buildSrc/src/main/java/Config.kt
}

View File

@@ -1,93 +0,0 @@
package com.gmail.nossr50.bukkit.v1_8;
import com.gmail.nossr50.VersionedHandler;
import com.gmail.nossr50.mcMMO;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import net.minecraft.server.v1_8_R3.Blocks;
import net.minecraft.server.v1_8_R3.EntityTypes;
import net.minecraft.server.v1_8_R3.IBlockData;
import net.minecraft.server.v1_8_R3.IBlockState;
import net.minecraft.server.v1_8_R3.MinecraftKey;
import net.minecraft.server.v1_8_R3.RegistryBlocks;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.craftbukkit.v1_8_R3.util.CraftMagicNumbers;
import org.bukkit.entity.Entity;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@SuppressWarnings({"unused", "Duplicates"}) // We use reflection to load this handler on 1.8 versions
public class NmsHandler extends VersionedHandler {
/**
* Static reference to the block registry. Don't really care about the fact that
* it is being stored as a reference here, but for imports reasons, it's smaller
* line length makes it optimal to read for method usages.
*/
private static final RegistryBlocks<MinecraftKey, net.minecraft.server.v1_8_R3.Block> BLOCK_REGISTRY = net.minecraft.server.v1_8_R3.Block.REGISTRY;
/**
* We can keep track of block state id's by generating them on demand, i.e., when
* they're being requested from Blocks, or BlockDatas.
*/
private static final RegistryBlocks<MinecraftKey, IBlockData> BLOCK_STATE_REGISTRY = new RegistryBlocks<>(BLOCK_REGISTRY.c(Blocks.AIR)); // Default to AIR
NmsHandler(mcMMO plugin) {
super(plugin);
}
@Override
public String getIdFor(Block block) {
// We have to get the underlying nms block by the block, which might as well just be the type id.
final net.minecraft.server.v1_8_R3.Block block1 = CraftMagicNumbers.getBlock(block);
// The registry.c(T) will return MinecraftKey, and the toString() returns the "$mod:$name", so "minecraft:stone"
final MinecraftKey key = BLOCK_REGISTRY.c(block1);
return key.toString();
}
@Override
public String getIdFor(Entity entity) {
// EntityTypes maintains the maps of Class<? extends nms.Entity> to String for id's and to numerical id numbers.
// We of course are using the method that gets us the String id of the entity, such as "minecraft:creeper"
return EntityTypes.b(((CraftEntity) entity).getHandle());
}
@Override
public String getIdFor(BlockState block) {
// Much like #getIdFor(Block) except here we have the "state" by numerical id. So.. we have to grab it from
// the world.
final net.minecraft.server.v1_8_R3.Block nmsBlock = net.minecraft.server.v1_8_R3.Block.REGISTRY.a(block.getTypeId());
final MinecraftKey blockKey = net.minecraft.server.v1_8_R3.Block.REGISTRY.c(nmsBlock);
final IBlockData blockState = nmsBlock.fromLegacyData(block.getRawData());
// Now we can check if our blockstate registry actually has the block state.
final MinecraftKey stateKey = BLOCK_STATE_REGISTRY.c(blockState);
if (stateKey != null) { // If the state has been registered by the handler, then by all means.
return stateKey.toString();
}
// If not, well, it needs to have a key generated and registered.
final String nameSpace = blockKey.a();
StringBuilder builder = new StringBuilder();
builder.append(blockKey.a()); // We only want to get the block id, not the domain id, since that's going to be appended later
// Get the full Property -> Value mapping for the block state
final ImmutableMap<IBlockState, Comparable> properties = blockState.b();
if (!properties.isEmpty()) {
builder.append('[');
Joiner joiner = Joiner.on(',');
List<String> propertyValues = new ArrayList<>();
for (Map.Entry<IBlockState, Comparable> entry : properties.entrySet()) {
// a() gets the inputted "name" for the state, the value, well, that gets the value, which is always toStringable.
propertyValues.add(entry.getKey().a() + "=" + entry.getValue());
}
builder.append(joiner.join(propertyValues));
builder.append(']');
}
// Now we can make the MinecraftKey...
final MinecraftKey newKey = new MinecraftKey(builder.toString());
BLOCK_STATE_REGISTRY.a(newKey, blockState);
return newKey.toString();
}
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.platform.bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_8_R3.block.CraftBlock;
public class Testing18 {
Material material;
CraftBlock block;
}

View File

@@ -1,77 +0,0 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import Config.Libs.Bukkit as Bukkit
// Config is located in <root>/buildSrc/src/main/java/Config.kt
// It provides a bunch of constant values we use as dependency
// strings, so we don't have to duplicate a bunch of them in
// various scripts. The import as allows for shorthand.
val bukkit: Project = Projects.bukkit!! // Static project references
val core: Project = Projects.core!! // Stored by Config.kt and created in <root>/build.gradle.kts
/* This configures ":bukkit" and it's dependent projects:
- ":bukkit:1_8_8"
- ":bukkit:1_12"
- ":bukkit:1_13"
Basically sets up all projects to depend on ":core" and
bstats-bukkit. Also sets up shadow to relocate bukkit related
packages to limit platform interference
*/
allprojects {
dependencies {
compile(core) // includes junit for tests
implementation(Bukkit.bstats) // Bukkit bstats
}
// TODO dunno if this works yet... project needs to compile.
val shadowJar by tasks.getting(ShadowJar::class) {
// Relocate bstats for bukkit, as per requirement for bstats
relocate(Shadow.Origin.bstatsBukkit, Shadow.Target.bstatsBukkit)
// Relocate the bukkit platform classes of mcmmo so we don't
// interfere with other platform classes (or core)
relocate(Deps.Groups.nossr, "${Deps.Groups.nossr}.bukkit") {
exclude("${Deps.Groups.nossr}.core")
}
}
}
// Tells all subprojects of ":bukkit" (":bukkit:1_8_8", ":bukkit:1_12",etc.)
// to depend on this project (":bukkit") to inherit the dependencies, and
// does NOT inherit the same configurations (anything configured outside
// here does not persist to child projects).
subprojects {
dependencies {
// Provide the base bukkit plugin dependency for plugin classloading.
// All "versioned" implementations will be properly classloaded by the bukkit parent
compileOnly(bukkit)
}
}
plugins {
`java-library` // This is already provided, but for static compilation,
// we declare it here so we can use the IDE static type references
}
dependencies {
// Temporary dependencies while things are being moved.
compileOnly(Bukkit.`1_13`.spigotApi) { // Spigot API for generic usage. Based on 1.13.2
isTransitive = true // We don't want the dependencies
}
compileOnly(Bukkit.`1_13`.api) { // Bukkit API for generic usage. Based on 1.13.2
isTransitive = true // We don't want the dependencies
}
compileOnly(Bukkit.`1_13`.wgCore) { // WorldGuard dependency, again, for 1.13.2
isTransitive = true // We don't want the dependencies
exclude(group = Shadow.Exclude.sk89q)
exclude(group = Shadow.Exclude.intake, module = "intake")
exclude(group = Shadow.Exclude.sk89q, module = "squirrelid")
exclude(group = Shadow.Exclude.flyway)
exclude(group = Shadow.Exclude.khelekore)
exclude(group = Shadow.Exclude.findbugs)
}
compileOnly(Bukkit.`1_13`.wgLegacy) {
isTransitive = true // We don't want the dependencies
exclude(group = Shadow.Exclude.bukkit)
exclude(group = Shadow.Exclude.sk89q, module = "commandbook")
exclude(group = Shadow.Exclude.bstats)
}
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
public class BukkitBlockType {
private Material material;
private BlockData blockData;
}

View File

@@ -1,74 +0,0 @@
package com.gmail.nossr50;
import com.sk89q.worldedit.extension.platform.NoCapablePlatformException;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Entity;
public abstract class VersionedHandler {
private static VersionedHandler instance;
private final mcMMO plugin;
protected VersionedHandler(mcMMO plugin) {
this.plugin = plugin;
}
/**
* Gets the string value id of the BlockType, note that this is not the
* blockstate.
*
* Examples include: "minecraft:stone", "minecraft:chest", "thaumcraft:log2"
* BlockStates are more specific like "minecraft:log[variant=oak,axis=x]"
*
* This should be casting down and retrieving the id from the block registry maintained by vanilla.
*
* @param block The block instance (holds byte/numerical id or sometimes block state in newer versions)
* @return The string id of the block type
*/
public abstract String getIdFor(Block block);
/**
* Gets the string value id of the Entity, much like blocks, this is not
* the full string representation of the entity, just the string id of the
* TYPE.
*
* Examples include: "minecraft:creeeper", "minecraft:sheep", "thaumcraft:wisp"
*
* @param entity The entity instance
* @return The string id of the entity's registered type.
*/
public abstract String getIdFor(Entity entity);
// Technically can be TileEntity snapshot references as well.
public abstract String getIdFor(BlockState block);
/**
* Gets the {@link VersionedHandler} instance for this running platform.
* Note that all the handler does is perform various operations necessitated
* by either a lack of, or bridging an implementation of some API/core aspects
* that are not available through Bukkit API (like getting BlockType id's, or
* BlockState id's).
*
* @param plugin The mcmmo plugin
* @return The version handler instance
*/
public VersionedHandler getInstance(mcMMO plugin) {
if (instance == null) {
final String serverPackage = mcMMO.p.getServer().getClass().getPackage().getName();
final String serverVersion = serverPackage.substring(serverPackage.lastIndexOf(".") + 1);
try {
final Class<?> clazz = Class.forName("com.gmail.nossr50.bukkit." + serverVersion + ".NmsHandler");
if (VersionedHandler.class.isAssignableFrom(clazz)) {
instance = (VersionedHandler) clazz.getConstructor(mcMMO.class).newInstance(plugin);
}
} catch (Exception e) {
e.printStackTrace();
throw new NoCapablePlatformException("Could not discover a valid mcMMO VersionedHandler for version:" + serverVersion);
}
}
return instance;
}
}

View File

@@ -1,45 +0,0 @@
package com.gmail.nossr50.commands;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.data.database.FlatfileDatabaseManager;
import com.gmail.nossr50.core.data.database.SQLDatabaseManager;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.mcMMO;
import com.google.common.collect.ImmutableList;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import java.util.List;
public class MHDCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (mcMMO.getDatabaseManager() instanceof SQLDatabaseManager) {
SQLDatabaseManager m = (SQLDatabaseManager) mcMMO.getDatabaseManager();
m.resetMobHealthSettings();
for (McMMOPlayer player : UserManager.getPlayers()) {
player.getProfile().setMobHealthbarType(MainConfig.getInstance().getMobHealthbarDefault());
}
sender.sendMessage("Mob health reset");
return true;
}
if (mcMMO.getDatabaseManager() instanceof FlatfileDatabaseManager) {
FlatfileDatabaseManager m = (FlatfileDatabaseManager) mcMMO.getDatabaseManager();
m.resetMobHealthSettings();
for (McMMOPlayer player : UserManager.getPlayers()) {
player.getProfile().setMobHealthbarType(MainConfig.getInstance().getMobHealthbarDefault());
}
sender.sendMessage("Mob health reset");
return true;
}
return false;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
return ImmutableList.of();
}
}

View File

@@ -1,30 +0,0 @@
package com.gmail.nossr50.commands.chat;
import com.gmail.nossr50.commands.ToggleCommand;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.util.Permissions;
import org.bukkit.command.CommandSender;
public class McChatSpy extends ToggleCommand {
@Override
protected boolean hasOtherPermission(CommandSender sender) {
return Permissions.adminChatSpyOthers(sender);
}
@Override
protected boolean hasSelfPermission(CommandSender sender) {
return Permissions.adminChatSpy(sender);
}
@Override
protected void applyCommandAction(McMMOPlayer mcMMOPlayer) {
mcMMOPlayer.getPlayer().sendMessage(LocaleLoader.getString("Commands.AdminChatSpy." + (mcMMOPlayer.isPartyChatSpying() ? "Disabled" : "Enabled")));
mcMMOPlayer.togglePartyChatSpying();
}
@Override
protected void sendSuccessMessage(CommandSender sender, String playerName) {
sender.sendMessage(LocaleLoader.getString("Commands.AdminChatSpy.Toggle", playerName));
}
}

View File

@@ -1,15 +0,0 @@
package com.gmail.nossr50.commands.server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
/**
* This command facilitates switching the skill system scale between classic and modern scale
*/
public class Mcmmoupgrade implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
return false;
}
}

View File

@@ -1,98 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.random.RandomChanceSkill;
import com.gmail.nossr50.core.util.random.RandomChanceUtil;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import com.gmail.nossr50.listeners.InteractionManager;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class AcrobaticsCommand extends SkillCommand {
private String dodgeChance;
private String dodgeChanceLucky;
private boolean canDodge;
private boolean canRoll;
public AcrobaticsCommand() {
super(PrimarySkillType.ACROBATICS);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// ACROBATICS_DODGE
if (canDodge) {
String[] dodgeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_DODGE);
dodgeChance = dodgeStrings[0];
dodgeChanceLucky = dodgeStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canDodge = canUseSubskill(player, SubSkillType.ACROBATICS_DODGE);
canRoll = canUseSubskill(player, SubSkillType.ACROBATICS_ROLL);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canDodge) {
messages.add(getStatMessage(SubSkillType.ACROBATICS_DODGE, dodgeChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", dodgeChanceLucky) : ""));
}
if (canRoll) {
AbstractSubSkill abstractSubSkill = InteractionManager.getAbstractByName("Roll");
if (abstractSubSkill != null) {
double rollChance, graceChance;
//Chance to roll at half
RandomChanceSkill roll_rcs = new RandomChanceSkill(player, SubSkillType.ACROBATICS_ROLL);
//Chance to graceful roll
RandomChanceSkill grace_rcs = new RandomChanceSkill(player, SubSkillType.ACROBATICS_ROLL);
grace_rcs.setSkillLevel(grace_rcs.getSkillLevel() * 2); //Double Odds
//Chance Stat Calculations
rollChance = RandomChanceUtil.getRandomChanceExecutionChance(roll_rcs);
graceChance = RandomChanceUtil.getRandomChanceExecutionChance(grace_rcs);
//damageThreshold = AdvancedConfig.getInstance().getRollDamageThreshold();
String rollStrings[] = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ACROBATICS_ROLL);
//Format
double rollChanceLucky = rollChance * 1.333D;
double graceChanceLucky = graceChance * 1.333D;
messages.add(getStatMessage(SubSkillType.ACROBATICS_ROLL, rollStrings[0])
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", rollStrings[1]) : ""));
/*messages.add(getStatMessage(true, false, SubSkillType.ACROBATICS_ROLL, String.valueOf(graceChance))
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", String.valueOf(graceChanceLucky)) : ""));*/
}
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ACROBATICS);
return textComponents;
}
}

View File

@@ -1,96 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.alchemy.AlchemyManager;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class AlchemyCommand extends SkillCommand {
private String brewSpeed;
private String brewSpeedLucky;
private int tier;
private int ingredientCount;
private String ingredientList;
private boolean canCatalysis;
private boolean canConcoctions;
public AlchemyCommand() {
super(PrimarySkillType.ALCHEMY);
}
protected String[] calculateAbilityDisplayValues(Player player) {
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
String[] displayValues = new String[2];
boolean isLucky = Permissions.lucky(player, PrimarySkillType.ALCHEMY);
displayValues[0] = decimal.format(alchemyManager.calculateBrewSpeed(false)) + "x";
displayValues[1] = isLucky ? decimal.format(alchemyManager.calculateBrewSpeed(true)) + "x" : null;
return displayValues;
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// ALCHEMY_CATALYSIS
if (canCatalysis) {
String[] catalysisStrings = calculateAbilityDisplayValues(player);
brewSpeed = catalysisStrings[0];
brewSpeedLucky = catalysisStrings[1];
}
// ALCHEMY_CONCOCTIONS
if (canConcoctions) {
AlchemyManager alchemyManager = UserManager.getPlayer(player).getAlchemyManager();
tier = alchemyManager.getTier();
ingredientCount = alchemyManager.getIngredients().size();
ingredientList = alchemyManager.getIngredientList();
}
}
@Override
protected void permissionsCheck(Player player) {
canCatalysis = canUseSubskill(player, SubSkillType.ALCHEMY_CATALYSIS);
canConcoctions = canUseSubskill(player, SubSkillType.ALCHEMY_CONCOCTIONS);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canCatalysis) {
messages.add(getStatMessage(SubSkillType.ALCHEMY_CATALYSIS, brewSpeed)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", brewSpeedLucky) : ""));
}
if (canConcoctions) {
messages.add(getStatMessage(false, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(tier), String.valueOf(RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS))));
messages.add(getStatMessage(true, true, SubSkillType.ALCHEMY_CONCOCTIONS, String.valueOf(ingredientCount), ingredientList));
//messages.add(LocaleLoader.getString("Alchemy.Concoctions.Rank", tier, RankUtils.getHighestRank(SubSkillType.ALCHEMY_CONCOCTIONS)));
//messages.add(LocaleLoader.getString("Alchemy.Concoctions.Ingredients", ingredientCount, ingredientList));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ALCHEMY);
return textComponents;
}
}

View File

@@ -1,88 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.archery.Archery;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ArcheryCommand extends SkillCommand {
private String skillShotBonus;
private String dazeChance;
private String dazeChanceLucky;
private String retrieveChance;
private String retrieveChanceLucky;
private boolean canSkillShot;
private boolean canDaze;
private boolean canRetrieve;
public ArcheryCommand() {
super(PrimarySkillType.ARCHERY);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// ARCHERY_ARROW_RETRIEVAL
if (canRetrieve) {
String[] retrieveStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
retrieveChance = retrieveStrings[0];
retrieveChanceLucky = retrieveStrings[1];
}
// ARCHERY_DAZE
if (canDaze) {
String[] dazeStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.ARCHERY_DAZE);
dazeChance = dazeStrings[0];
dazeChanceLucky = dazeStrings[1];
}
// SKILL SHOT
if (canSkillShot) {
skillShotBonus = percent.format(Archery.getDamageBonusPercent(player));
}
}
@Override
protected void permissionsCheck(Player player) {
canSkillShot = canUseSubskill(player, SubSkillType.ARCHERY_SKILL_SHOT);
canDaze = canUseSubskill(player, SubSkillType.ARCHERY_DAZE);
canRetrieve = canUseSubskill(player, SubSkillType.ARCHERY_ARROW_RETRIEVAL);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canRetrieve) {
messages.add(getStatMessage(SubSkillType.ARCHERY_ARROW_RETRIEVAL, retrieveChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", retrieveChanceLucky) : ""));
}
if (canDaze) {
messages.add(getStatMessage(SubSkillType.ARCHERY_DAZE, dazeChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", dazeChanceLucky) : ""));
}
if (canSkillShot) {
messages.add(getStatMessage(SubSkillType.ARCHERY_SKILL_SHOT, skillShotBonus));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.ARCHERY);
return textComponents;
}
}

View File

@@ -1,109 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.axes.Axes;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class AxesCommand extends SkillCommand {
private String critChance;
private String critChanceLucky;
private double axeMasteryDamage;
private double impactDamage;
private String skullSplitterLength;
private String skullSplitterLengthEndurance;
private boolean canSkullSplitter;
private boolean canCritical;
private boolean canAxeMastery;
private boolean canImpact;
private boolean canGreaterImpact;
public AxesCommand() {
super(PrimarySkillType.AXES);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// ARMOR IMPACT
if (canImpact) {
impactDamage = UserManager.getPlayer(player).getAxesManager().getImpactDurabilityDamage();
}
// AXE MASTERY
if (canAxeMastery) {
axeMasteryDamage = Axes.getAxeMasteryBonusDamage(player);
}
// CRITICAL HIT
if (canCritical) {
String[] criticalHitStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.AXES_CRITICAL_STRIKES);
critChance = criticalHitStrings[0];
critChanceLucky = criticalHitStrings[1];
}
// SKULL SPLITTER
if (canSkullSplitter) {
String[] skullSplitterStrings = calculateLengthDisplayValues(player, skillValue);
skullSplitterLength = skullSplitterStrings[0];
skullSplitterLengthEndurance = skullSplitterStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canSkullSplitter = Permissions.skullSplitter(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.AXES_SKULL_SPLITTER);
canCritical = canUseSubskill(player, SubSkillType.AXES_CRITICAL_STRIKES);
canAxeMastery = canUseSubskill(player, SubSkillType.AXES_AXE_MASTERY);
canImpact = canUseSubskill(player, SubSkillType.AXES_ARMOR_IMPACT);
canGreaterImpact = canUseSubskill(player, SubSkillType.AXES_GREATER_IMPACT);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canImpact) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.2"), LocaleLoader.getString("Axes.Ability.Bonus.3", impactDamage)));
}
if (canAxeMastery) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.0"), LocaleLoader.getString("Axes.Ability.Bonus.1", axeMasteryDamage)));
}
if (canCritical) {
messages.add(getStatMessage(SubSkillType.AXES_CRITICAL_STRIKES, critChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", critChanceLucky) : ""));
}
if (canGreaterImpact) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Axes.Ability.Bonus.4"), LocaleLoader.getString("Axes.Ability.Bonus.5", Axes.greaterImpactBonusDamage)));
}
if (canSkullSplitter) {
messages.add(getStatMessage(SubSkillType.AXES_SKULL_SPLITTER, skullSplitterLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", skullSplitterLengthEndurance) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.AXES);
return textComponents;
}
}

View File

@@ -1,64 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class ExcavationCommand extends SkillCommand {
private String gigaDrillBreakerLength;
private String gigaDrillBreakerLengthEndurance;
private boolean canGigaDrill;
private boolean canTreasureHunt;
public ExcavationCommand() {
super(PrimarySkillType.EXCAVATION);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// GIGA DRILL BREAKER
if (canGigaDrill) {
String gigaDrillStrings[] = calculateLengthDisplayValues(player, skillValue);
gigaDrillBreakerLength = gigaDrillStrings[0];
gigaDrillBreakerLengthEndurance = gigaDrillStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canGigaDrill = Permissions.gigaDrillBreaker(player) && RankUtils.hasUnlockedSubskill(player, SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER);
canTreasureHunt = canUseSubskill(player, SubSkillType.EXCAVATION_ARCHAEOLOGY);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canGigaDrill) {
messages.add(getStatMessage(SubSkillType.EXCAVATION_GIGA_DRILL_BREAKER, gigaDrillBreakerLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
//messages.add(LocaleLoader.getString("Excavation.Effect.Length", gigaDrillBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", gigaDrillBreakerLengthEndurance) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.EXCAVATION);
return textComponents;
}
}

View File

@@ -1,177 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.config.treasure.TreasureConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.fishing.Fishing;
import com.gmail.nossr50.core.skills.primary.fishing.FishingManager;
import com.gmail.nossr50.core.skills.treasure.Rarity;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.random.RandomChanceUtil;
import com.gmail.nossr50.core.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class FishingCommand extends SkillCommand {
private int lootTier;
private String shakeChance;
private String shakeChanceLucky;
private int fishermansDietRank;
private String biteChance;
private String trapTreasure;
private String commonTreasure;
private String uncommonTreasure;
private String rareTreasure;
private String epicTreasure;
private String legendaryTreasure;
private String recordTreasure;
private String magicChance;
private boolean canTreasureHunt;
private boolean canMagicHunt;
private boolean canShake;
private boolean canFishermansDiet;
private boolean canMasterAngler;
private boolean canIceFish;
public FishingCommand() {
super(PrimarySkillType.FISHING);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
FishingManager fishingManager = UserManager.getPlayer(player).getFishingManager();
// TREASURE HUNTER
if (canTreasureHunt) {
lootTier = fishingManager.getLootTier();
// ItemStack drop rates
commonTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.COMMON) / 100.0);
uncommonTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.UNCOMMON) / 100.0);
rareTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RARE) / 100.0);
epicTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.EPIC) / 100.0);
legendaryTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.LEGENDARY) / 100.0);
recordTreasure = percent.format(TreasureConfig.getInstance().getItemDropRate(lootTier, Rarity.RECORD) / 100.0);
// Magic hunter drop rates
double totalEnchantChance = 0;
for (Rarity rarity : Rarity.values()) {
if (rarity != Rarity.RECORD) {
totalEnchantChance += TreasureConfig.getInstance().getEnchantmentDropRate(lootTier, rarity);
}
}
if (totalEnchantChance >= 1)
magicChance = percent.format(totalEnchantChance / 100.0);
else
magicChance = percent.format(0);
}
// FISHING_SHAKE
if (canShake) {
String[] shakeStrings = RandomChanceUtil.calculateAbilityDisplayValuesStatic(player, PrimarySkillType.FISHING, fishingManager.getShakeChance());
shakeChance = shakeStrings[0];
shakeChanceLucky = shakeStrings[1];
}
// FISHERMAN'S DIET
if (canFishermansDiet) {
fishermansDietRank = calculateRank(skillValue, Fishing.fishermansDietMaxLevel, Fishing.fishermansDietRankLevel1);
}
// MASTER ANGLER
if (canMasterAngler) {
double rawBiteChance = 1.0 / (player.getWorld().hasStorm() ? 300 : 500);
Location location = fishingManager.getHookLocation();
if (location == null) {
location = player.getLocation();
}
if (Fishing.masterAnglerBiomes.contains(location.getBlock().getBiome())) {
rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBiomeModifier();
}
if (player.isInsideVehicle() && player.getVehicle().getType() == EntityType.BOAT) {
rawBiteChance = rawBiteChance * AdvancedConfig.getInstance().getMasterAnglerBoatModifier();
}
double luckyModifier = Permissions.lucky(player, PrimarySkillType.FISHING) ? 1.333D : 1.0D;
biteChance = percent.format((rawBiteChance * 100.0D) * luckyModifier);
}
}
@Override
protected void permissionsCheck(Player player) {
canTreasureHunt = canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
canMagicHunt = canUseSubskill(player, SubSkillType.FISHING_MAGIC_HUNTER) && canUseSubskill(player, SubSkillType.FISHING_TREASURE_HUNTER);
canShake = canUseSubskill(player, SubSkillType.FISHING_SHAKE);
canFishermansDiet = canUseSubskill(player, SubSkillType.FISHING_FISHERMANS_DIET);
canMasterAngler = canUseSubskill(player, SubSkillType.FISHING_MASTER_ANGLER);
canIceFish = canUseSubskill(player, SubSkillType.FISHING_ICE_FISHING);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canFishermansDiet) {
messages.add(getStatMessage(false, true, SubSkillType.FISHING_FISHERMANS_DIET, String.valueOf(fishermansDietRank)));
}
if (canIceFish) {
messages.add(getStatMessage(SubSkillType.FISHING_ICE_FISHING, SubSkillType.FISHING_ICE_FISHING.getLocaleStatDescription()));
}
if (canMagicHunt) {
messages.add(getStatMessage(SubSkillType.FISHING_MAGIC_HUNTER, magicChance));
}
if (canMasterAngler) {
//TODO: Update this with more details
messages.add(getStatMessage(false, true, SubSkillType.FISHING_MASTER_ANGLER, biteChance));
}
if (canShake) {
messages.add(getStatMessage(SubSkillType.FISHING_SHAKE, shakeChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shakeChanceLucky) : ""));
}
if (canTreasureHunt) {
messages.add(getStatMessage(false, true, SubSkillType.FISHING_TREASURE_HUNTER, String.valueOf(lootTier), String.valueOf(RankUtils.getHighestRank(SubSkillType.FISHING_TREASURE_HUNTER))));
messages.add(getStatMessage(true, true, SubSkillType.FISHING_TREASURE_HUNTER,
String.valueOf(commonTreasure),
String.valueOf(uncommonTreasure),
String.valueOf(rareTreasure),
String.valueOf(epicTreasure),
String.valueOf(legendaryTreasure),
String.valueOf(recordTreasure)));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.FISHING);
return textComponents;
}
}

View File

@@ -1,152 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class HerbalismCommand extends SkillCommand {
private String greenTerraLength;
private String greenTerraLengthEndurance;
private String greenThumbChance;
private String greenThumbChanceLucky;
private int greenThumbStage;
private int farmersDietRank;
private String doubleDropChance;
private String doubleDropChanceLucky;
private String hylianLuckChance;
private String hylianLuckChanceLucky;
private String shroomThumbChance;
private String shroomThumbChanceLucky;
private boolean hasHylianLuck;
private boolean canGreenTerra;
private boolean canGreenThumbPlants;
private boolean canGreenThumbBlocks;
private boolean canFarmersDiet;
private boolean canDoubleDrop;
private boolean canShroomThumb;
public HerbalismCommand() {
super(PrimarySkillType.HERBALISM);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// DOUBLE DROPS
if (canDoubleDrop) {
String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_DOUBLE_DROPS);
;
doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1];
}
// FARMERS DIET
if (canFarmersDiet) {
farmersDietRank = RankUtils.getRank(player, SubSkillType.HERBALISM_FARMERS_DIET);
}
// GREEN TERRA
if (canGreenTerra) {
String[] greenTerraStrings = calculateLengthDisplayValues(player, skillValue);
greenTerraLength = greenTerraStrings[0];
greenTerraLengthEndurance = greenTerraStrings[1];
}
// GREEN THUMB
if (canGreenThumbBlocks || canGreenThumbPlants) {
greenThumbStage = RankUtils.getRank(player, SubSkillType.HERBALISM_GREEN_THUMB);
String[] greenThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_GREEN_THUMB);
greenThumbChance = greenThumbStrings[0];
greenThumbChanceLucky = greenThumbStrings[1];
}
// HYLIAN LUCK
if (hasHylianLuck) {
String[] hylianLuckStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_HYLIAN_LUCK);
hylianLuckChance = hylianLuckStrings[0];
hylianLuckChanceLucky = hylianLuckStrings[1];
}
// SHROOM THUMB
if (canShroomThumb) {
String[] shroomThumbStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.HERBALISM_SHROOM_THUMB);
shroomThumbChance = shroomThumbStrings[0];
shroomThumbChanceLucky = shroomThumbStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
hasHylianLuck = canUseSubskill(player, SubSkillType.HERBALISM_HYLIAN_LUCK);
canGreenTerra = Permissions.greenTerra(player);
canGreenThumbPlants = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbPlant(player, Material.WHEAT) || Permissions.greenThumbPlant(player, Material.CARROT) || Permissions.greenThumbPlant(player, Material.POTATO) || Permissions.greenThumbPlant(player, Material.BEETROOT) || Permissions.greenThumbPlant(player, Material.NETHER_WART) || Permissions.greenThumbPlant(player, Material.COCOA));
canGreenThumbBlocks = RankUtils.hasUnlockedSubskill(player, SubSkillType.HERBALISM_GREEN_THUMB) && (Permissions.greenThumbBlock(player, Material.DIRT) || Permissions.greenThumbBlock(player, Material.COBBLESTONE) || Permissions.greenThumbBlock(player, Material.COBBLESTONE_WALL) || Permissions.greenThumbBlock(player, Material.STONE_BRICKS));
canFarmersDiet = canUseSubskill(player, SubSkillType.HERBALISM_FARMERS_DIET);
canDoubleDrop = canUseSubskill(player, SubSkillType.HERBALISM_DOUBLE_DROPS) && !skill.getDoubleDropsDisabled();
canShroomThumb = canUseSubskill(player, SubSkillType.HERBALISM_SHROOM_THUMB);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canDoubleDrop) {
messages.add(getStatMessage(SubSkillType.HERBALISM_DOUBLE_DROPS, doubleDropChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
}
if (canFarmersDiet) {
messages.add(getStatMessage(false, true, SubSkillType.HERBALISM_FARMERS_DIET, String.valueOf(farmersDietRank)));
}
if (canGreenTerra) {
messages.add(getStatMessage(SubSkillType.HERBALISM_GREEN_TERRA, greenTerraLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", greenTerraLengthEndurance) : ""));
//messages.add(LocaleLoader.getString("Herbalism.Ability.GTe.Length", greenTerraLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", greenTerraLengthEndurance) : ""));
}
if (canGreenThumbBlocks || canGreenThumbPlants) {
messages.add(getStatMessage(SubSkillType.HERBALISM_GREEN_THUMB, greenThumbChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", greenThumbChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Herbalism.Ability.GTh.Chance", greenThumbChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", greenThumbChanceLucky) : ""));
}
if (canGreenThumbPlants) {
messages.add(getStatMessage(true, true, SubSkillType.HERBALISM_GREEN_THUMB, String.valueOf(greenThumbStage)));
}
if (hasHylianLuck) {
messages.add(getStatMessage(SubSkillType.HERBALISM_HYLIAN_LUCK, hylianLuckChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", hylianLuckChanceLucky) : ""));
}
if (canShroomThumb) {
messages.add(getStatMessage(SubSkillType.HERBALISM_SHROOM_THUMB, shroomThumbChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", shroomThumbChanceLucky) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.HERBALISM);
return textComponents;
}
}

View File

@@ -1,121 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class MiningCommand extends SkillCommand {
private String doubleDropChance;
private String doubleDropChanceLucky;
private String superBreakerLength;
private String superBreakerLengthEndurance;
private int blastMiningRank;
private int bonusTNTDrops;
private double blastRadiusIncrease;
private String oreBonus;
private String debrisReduction;
private String blastDamageDecrease;
private boolean canSuperBreaker;
private boolean canDoubleDrop;
private boolean canBlast;
private boolean canBiggerBombs;
private boolean canDemoExpert;
public MiningCommand() {
super(PrimarySkillType.MINING);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// BLAST MINING
if (canBlast || canDemoExpert || canBiggerBombs) {
MiningManager miningManager = UserManager.getPlayer(player).getMiningManager();
blastMiningRank = miningManager.getBlastMiningTier();
bonusTNTDrops = miningManager.getDropMultiplier();
oreBonus = percent.format(miningManager.getOreBonus() / 30.0D); // Base received in TNT is 30%
debrisReduction = percent.format(miningManager.getDebrisReduction() / 30.0D); // Base received in TNT is 30%
blastDamageDecrease = percent.format(miningManager.getBlastDamageModifier() / 100.0D);
blastRadiusIncrease = miningManager.getBlastRadiusModifier();
}
// DOUBLE DROPS
if (canDoubleDrop) {
String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.MINING_DOUBLE_DROPS);
doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1];
}
// SUPER BREAKER
if (canSuperBreaker) {
String[] superBreakerStrings = calculateLengthDisplayValues(player, skillValue);
superBreakerLength = superBreakerStrings[0];
superBreakerLengthEndurance = superBreakerStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canBiggerBombs = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BIGGER_BOMBS) && Permissions.biggerBombs(player);
canBlast = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_BLAST_MINING) && Permissions.remoteDetonation(player);
canDemoExpert = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_DEMOLITIONS_EXPERTISE) && Permissions.demolitionsExpertise(player);
canDoubleDrop = Permissions.isSubSkillEnabled(player, SubSkillType.MINING_DOUBLE_DROPS) && !skill.getDoubleDropsDisabled();
canSuperBreaker = RankUtils.hasUnlockedSubskill(player, SubSkillType.MINING_SUPER_BREAKER) && Permissions.superBreaker(player);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canBiggerBombs) {
messages.add(getStatMessage(true, true, SubSkillType.MINING_BLAST_MINING, String.valueOf(blastRadiusIncrease)));
//messages.add(LocaleLoader.getString("Mining.Blast.Radius.Increase", blastRadiusIncrease));
}
if (canBlast) {
messages.add(getStatMessage(false, true, SubSkillType.MINING_BLAST_MINING, String.valueOf(blastMiningRank), String.valueOf(RankUtils.getHighestRank(SubSkillType.MINING_BLAST_MINING)), LocaleLoader.getString("Mining.Blast.Effect", oreBonus, debrisReduction, bonusTNTDrops)));
//messages.add(LocaleLoader.getString("Mining.Blast.Rank", blastMiningRank, RankUtils.getHighestRank(SubSkillType.MINING_BLAST_MINING), LocaleLoader.getString("Mining.Blast.Effect", oreBonus, debrisReduction, bonusTNTDrops)));
}
if (canDemoExpert) {
messages.add(getStatMessage(SubSkillType.MINING_DEMOLITIONS_EXPERTISE, blastDamageDecrease));
//messages.add(LocaleLoader.getString("Mining.Effect.Decrease", blastDamageDecrease));
}
if (canDoubleDrop) {
messages.add(getStatMessage(SubSkillType.HERBALISM_DOUBLE_DROPS, doubleDropChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Mining.Effect.DropChance", doubleDropChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
}
if (canSuperBreaker) {
messages.add(getStatMessage(SubSkillType.MINING_SUPER_BREAKER, superBreakerLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", superBreakerLengthEndurance) : ""));
//messages.add(LocaleLoader.getString("Mining.Ability.Length", superBreakerLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", superBreakerLengthEndurance) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.MINING);
return textComponents;
}
}

View File

@@ -1,94 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.listeners.InteractionManager;
import com.google.common.collect.ImmutableList;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
import java.util.ArrayList;
import java.util.List;
/**
* This is the command that retrieves data about skills from in-game sources
*/
public class MmoInfoCommand implements TabExecutor {
@Override
public boolean onCommand(CommandSender commandSender, Command command, String s, String[] args) {
/*
* Only allow players to use this command
*/
if (commandSender instanceof Player) {
if (args.length < 1)
return false;
Player player = (Player) commandSender;
if (Permissions.mmoinfo(player)) {
if (args == null || args[0] == null)
return false;
if (args[0].equalsIgnoreCase("???")) {
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", "???"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Mystery"));
return true;
} else if (InteractionManager.getAbstractByName(args[0]) != null || PrimarySkillType.SUBSKILL_NAMES.contains(args[0])) {
displayInfo(player, args[0]);
return true;
}
//Not a real skill
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.NoMatch"));
return true;
}
}
return false;
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return StringUtil.copyPartialMatches(args[0], PrimarySkillType.SUBSKILL_NAMES, new ArrayList<String>(PrimarySkillType.SUBSKILL_NAMES.size()));
default:
return ImmutableList.of();
}
}
private void displayInfo(Player player, String subSkillName) {
//Check to see if the skill exists in the new system
AbstractSubSkill abstractSubSkill = InteractionManager.getAbstractByName(subSkillName);
if (abstractSubSkill != null) {
/* New System Skills are programmable */
abstractSubSkill.printInfo(player);
//TextComponentFactory.sendPlayerUrlHeader(player);
} else {
/*
* Skill is only in the old system
*/
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.Header"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.SubSkillHeader", subSkillName));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.DetailsHeader"));
player.sendMessage(LocaleLoader.getString("Commands.MmoInfo.OldSkill"));
}
for (SubSkillType subSkillType : SubSkillType.values()) {
if (subSkillType.getNiceNameNoSpaces(subSkillType).equalsIgnoreCase(subSkillName))
subSkillName = subSkillType.getWikiName(subSkillType.toString());
}
//Send Player Wiki Link
TextComponentFactory.sendPlayerSubSkillWikiLink(player, subSkillName);
}
}

View File

@@ -1,131 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.MaterialType;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.repair.ArcaneForging;
import com.gmail.nossr50.core.skills.primary.repair.Repair;
import com.gmail.nossr50.core.skills.primary.repair.RepairManager;
import com.gmail.nossr50.core.skills.primary.repair.repairables.Repairable;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import com.gmail.nossr50.mcMMO;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class RepairCommand extends SkillCommand {
private String repairMasteryBonus;
private String superRepairChance;
private String superRepairChanceLucky;
private boolean canSuperRepair;
private boolean canMasterRepair;
private boolean canArcaneForge;
private boolean canRepairStone;
private boolean canRepairIron;
private boolean canRepairGold;
private boolean canRepairDiamond;
private boolean canRepairString;
private boolean canRepairLeather;
private boolean canRepairWood;
private boolean arcaneBypass;
private int diamondLevel;
private int goldLevel;
private int ironLevel;
private int stoneLevel;
public RepairCommand() {
super(PrimarySkillType.REPAIR);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// We're using pickaxes here, not the best but it works
Repairable diamondRepairable = mcMMO.getRepairableManager().getRepairable(Material.DIAMOND_PICKAXE);
Repairable goldRepairable = mcMMO.getRepairableManager().getRepairable(Material.GOLDEN_PICKAXE);
Repairable ironRepairable = mcMMO.getRepairableManager().getRepairable(Material.IRON_PICKAXE);
Repairable stoneRepairable = mcMMO.getRepairableManager().getRepairable(Material.STONE_PICKAXE);
// TODO: This isn't really accurate - if they don't have pickaxes loaded it doesn't always mean the repair level is 0
diamondLevel = (diamondRepairable == null) ? 0 : diamondRepairable.getMinimumLevel();
goldLevel = (goldRepairable == null) ? 0 : goldRepairable.getMinimumLevel();
ironLevel = (ironRepairable == null) ? 0 : ironRepairable.getMinimumLevel();
stoneLevel = (stoneRepairable == null) ? 0 : stoneRepairable.getMinimumLevel();
// REPAIR MASTERY
if (canMasterRepair) {
repairMasteryBonus = percent.format(Math.min(((Repair.repairMasteryMaxBonus / Repair.repairMasteryMaxBonusLevel) * skillValue), Repair.repairMasteryMaxBonus) / 100D);
}
// SUPER REPAIR
if (canSuperRepair) {
String[] superRepairStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.REPAIR_SUPER_REPAIR);
superRepairChance = superRepairStrings[0];
superRepairChanceLucky = superRepairStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canSuperRepair = canUseSubskill(player, SubSkillType.REPAIR_SUPER_REPAIR);
canMasterRepair = canUseSubskill(player, SubSkillType.REPAIR_REPAIR_MASTERY);
canArcaneForge = canUseSubskill(player, SubSkillType.REPAIR_ARCANE_FORGING);
canRepairDiamond = Permissions.repairMaterialType(player, MaterialType.DIAMOND);
canRepairGold = Permissions.repairMaterialType(player, MaterialType.GOLD);
canRepairIron = Permissions.repairMaterialType(player, MaterialType.IRON);
canRepairStone = Permissions.repairMaterialType(player, MaterialType.STONE);
canRepairString = Permissions.repairMaterialType(player, MaterialType.STRING);
canRepairLeather = Permissions.repairMaterialType(player, MaterialType.LEATHER);
canRepairWood = Permissions.repairMaterialType(player, MaterialType.WOOD);
arcaneBypass = Permissions.arcaneBypass(player);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canArcaneForge) {
RepairManager repairManager = UserManager.getPlayer(player).getRepairManager();
messages.add(getStatMessage(false, true,
SubSkillType.REPAIR_ARCANE_FORGING,
String.valueOf(RankUtils.getRank(player, SubSkillType.REPAIR_ARCANE_FORGING)),
RankUtils.getHighestRankStr(SubSkillType.REPAIR_ARCANE_FORGING)));
if (ArcaneForging.arcaneForgingEnchantLoss || ArcaneForging.arcaneForgingDowngrades) {
messages.add(getStatMessage(true, true, SubSkillType.REPAIR_ARCANE_FORGING,
String.valueOf(arcaneBypass ? 100 : repairManager.getKeepEnchantChance()),
String.valueOf(arcaneBypass ? 0 : repairManager.getDowngradeEnchantChance()))); //Jesus those parentheses
}
}
if (canMasterRepair) {
messages.add(getStatMessage(false, true, SubSkillType.REPAIR_REPAIR_MASTERY, repairMasteryBonus));
}
if (canSuperRepair) {
messages.add(getStatMessage(SubSkillType.REPAIR_SUPER_REPAIR, superRepairChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", superRepairChanceLucky) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.REPAIR);
return textComponents;
}
}

View File

@@ -1,72 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.child.salvage.Salvage;
import com.gmail.nossr50.core.skills.child.salvage.SalvageManager;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SalvageCommand extends SkillCommand {
private boolean canAdvancedSalvage;
private boolean canArcaneSalvage;
public SalvageCommand() {
super(PrimarySkillType.SALVAGE);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// TODO Auto-generated method stub
}
@Override
protected void permissionsCheck(Player player) {
canAdvancedSalvage = canUseSubskill(player, SubSkillType.SALVAGE_ADVANCED_SALVAGE);
canArcaneSalvage = canUseSubskill(player, SubSkillType.SALVAGE_ARCANE_SALVAGE);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
SalvageManager salvageManager = UserManager.getPlayer(player).getSalvageManager();
if (canAdvancedSalvage) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Ability.Bonus.0"),
LocaleLoader.getString("Salvage.Ability.Bonus.1", salvageManager.getSalvageableAmount())));
}
if (canArcaneSalvage) {
messages.add(getStatMessage(false, true, SubSkillType.SALVAGE_ARCANE_SALVAGE,
String.valueOf(salvageManager.getArcaneSalvageRank()),
String.valueOf(RankUtils.getHighestRank(SubSkillType.SALVAGE_ARCANE_SALVAGE))));
if (Salvage.arcaneSalvageEnchantLoss) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Arcane.ExtractFull"), percent.format(salvageManager.getExtractFullEnchantChance() / 100)));
}
if (Salvage.arcaneSalvageDowngrades) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Salvage.Arcane.ExtractPartial"), percent.format(salvageManager.getExtractPartialEnchantChance() / 100)));
}
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SALVAGE);
return textComponents;
}
}

View File

@@ -1,290 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.child.FamilyTree;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.StringUtils;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.commands.CommandUtils;
import com.gmail.nossr50.core.util.random.RandomChanceUtil;
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
import com.gmail.nossr50.core.util.skills.PerksUtils;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import com.google.common.collect.ImmutableList;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.command.TabExecutor;
import org.bukkit.entity.Player;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
public abstract class SkillCommand implements TabExecutor {
protected PrimarySkillType skill;
protected DecimalFormat percent = new DecimalFormat("##0.00%");
protected DecimalFormat decimal = new DecimalFormat("##0.00");
private String skillName;
private CommandExecutor skillGuideCommand;
public SkillCommand(PrimarySkillType skill) {
this.skill = skill;
skillName = skill.getName();
skillGuideCommand = new SkillGuideCommand(skill);
}
public static String[] addItemToFirstPositionOfArray(String itemToAdd, String... existingArray) {
String[] newArray = new String[existingArray.length + 1];
newArray[0] = itemToAdd;
System.arraycopy(existingArray, 0, newArray, 1, existingArray.length);
return newArray;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (CommandUtils.noConsoleUsage(sender)) {
return true;
}
if (!CommandUtils.hasPlayerDataKey(sender)) {
return true;
}
switch (args.length) {
case 0:
Player player = (Player) sender;
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
boolean isLucky = Permissions.lucky(player, skill);
boolean hasEndurance = (PerksUtils.handleActivationPerks(player, 0, 0) != 0);
float skillValue = mcMMOPlayer.getSkillLevel(skill);
//Send the players a few blank lines to make finding the top of the skill command easier
if (AdvancedConfig.getInstance().doesSkillCommandSendBlankLines())
for (int i = 0; i < 2; i++) {
player.sendMessage("");
}
permissionsCheck(player);
dataCalculations(player, skillValue);
sendSkillCommandHeader(player, mcMMOPlayer, (int) skillValue);
//Make JSON text components
List<TextComponent> subskillTextComponents = getTextComponents(player);
//Subskills Header
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Effects.SubSkills.Overhaul")));
//Send JSON text components
TextComponentFactory.sendPlayerSubSkillList(player, subskillTextComponents);
/*for(TextComponent tc : subskillTextComponents)
{
player.spigot().sendMessage(new TextComponent[]{tc, new TextComponent(": TESTING")});
}*/
//Stats
getStatMessages(player, isLucky, hasEndurance, skillValue);
//Header
//Link Header
if (MainConfig.getInstance().getUrlLinksEnabled()) {
player.sendMessage(LocaleLoader.getString("Overhaul.mcMMO.Header"));
TextComponentFactory.sendPlayerUrlHeader(player);
}
if (MainConfig.getInstance().getScoreboardsEnabled() && MainConfig.getInstance().getSkillUseBoard()) {
ScoreboardManager.enablePlayerSkillScoreboard(player, skill);
}
return true;
default:
return skillGuideCommand.onCommand(sender, command, label, args);
}
}
private void getStatMessages(Player player, boolean isLucky, boolean hasEndurance, float skillValue) {
List<String> statsMessages = statsDisplay(player, skillValue, hasEndurance, isLucky);
if (!statsMessages.isEmpty()) {
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", LocaleLoader.getString("Commands.Stats.Self.Overhaul")));
for (String message : statsMessages) {
player.sendMessage(message);
}
}
player.sendMessage(LocaleLoader.getString("Guides.Available", skillName, skillName.toLowerCase()));
}
private void sendSkillCommandHeader(Player player, McMMOPlayer mcMMOPlayer, int skillValue) {
ChatColor hd1 = ChatColor.DARK_AQUA;
ChatColor c1 = ChatColor.GOLD;
ChatColor c2 = ChatColor.RED;
player.sendMessage(LocaleLoader.getString("Skills.Overhaul.Header", skillName));
if (!skill.isChildSkill()) {
/*
* NON-CHILD SKILLS
*/
//XP GAIN METHOD
player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
//LEVEL
player.sendMessage(LocaleLoader.getString("Effects.Level.Overhaul", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
} else {
/*
* CHILD SKILLS
*/
Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
ArrayList<PrimarySkillType> parentList = new ArrayList<>();
//TODO: Add JSON here
for (PrimarySkillType parent : parents) {
parentList.add(parent);
/*player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level.Overhaul", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)))*/
;
}
String parentMessage = "";
for (int i = 0; i < parentList.size(); i++) {
if (i + 1 < parentList.size()) {
parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
parentMessage += ChatColor.GRAY + ", ";
} else {
parentMessage += LocaleLoader.getString("Effects.Child.ParentList", parentList.get(i).getName(), mcMMOPlayer.getSkillLevel(parentList.get(i)));
}
}
//XP GAIN METHOD
player.sendMessage(LocaleLoader.getString("Commands.XPGain.Overhaul", LocaleLoader.getString("Commands.XPGain.Child")));
player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, parentMessage));
//LEVEL
//player.sendMessage(LocaleLoader.getString("Effects.Child.Overhaul", skillValue, skillValue));
}
/*
if (!skill.isChildSkill()) {
player.sendMessage(LocaleLoader.getString("Skills.Header", skillName));
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain." + StringUtils.getCapitalized(skill.toString()))));
player.sendMessage(LocaleLoader.getString("Effects.Level", skillValue, mcMMOPlayer.getSkillXpLevel(skill), mcMMOPlayer.getXpToLevel(skill)));
} else {
player.sendMessage(LocaleLoader.getString("Skills.Header", skillName + " " + LocaleLoader.getString("Skills.Child")));
player.sendMessage(LocaleLoader.getString("Commands.XPGain", LocaleLoader.getString("Commands.XPGain.Child")));
player.sendMessage(LocaleLoader.getString("Effects.Child", skillValue));
player.sendMessage(LocaleLoader.getString("Skills.Header", LocaleLoader.getString("Skills.Parents")));
Set<PrimarySkillType> parents = FamilyTree.getParents(skill);
for (PrimarySkillType parent : parents) {
player.sendMessage(parent.getName() + " - " + LocaleLoader.getString("Effects.Level", mcMMOPlayer.getSkillLevel(parent), mcMMOPlayer.getSkillXpLevel(parent), mcMMOPlayer.getXpToLevel(parent)));
}
}
*/
}
@Override
public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
switch (args.length) {
case 1:
return ImmutableList.of("?");
default:
return ImmutableList.of();
}
}
protected int calculateRank(float skillValue, int maxLevel, int rankChangeLevel) {
return Math.min((int) skillValue, maxLevel) / rankChangeLevel;
}
protected String[] getAbilityDisplayValues(SkillActivationType skillActivationType, Player player, SubSkillType subSkill) {
return RandomChanceUtil.calculateAbilityDisplayValues(skillActivationType, player, subSkill);
}
protected String[] calculateLengthDisplayValues(Player player, float skillValue) {
int maxLength = skill.getAbility().getMaxLength();
int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
int length;
if (abilityLengthCap <= 0) {
length = 2 + (int) (skillValue / abilityLengthVar);
} else {
length = 2 + (int) (Math.min(abilityLengthCap, skillValue) / abilityLengthVar);
}
int enduranceLength = PerksUtils.handleActivationPerks(player, length, maxLength);
if (maxLength != 0) {
length = Math.min(length, maxLength);
}
return new String[]{String.valueOf(length), String.valueOf(enduranceLength)};
}
protected String getStatMessage(SubSkillType subSkillType, String... vars) {
return getStatMessage(false, false, subSkillType, vars);
}
protected String getStatMessage(boolean isExtra, boolean isCustom, SubSkillType subSkillType, String... vars) {
String templateKey = isCustom ? "Ability.Generic.Template.Custom" : "Ability.Generic.Template";
String statDescriptionKey = !isExtra ? subSkillType.getLocaleKeyStatDescription() : subSkillType.getLocaleKeyStatExtraDescription();
if (isCustom)
//Cast to Object[] to suppress warnings
return LocaleLoader.getString(templateKey, LocaleLoader.getString(statDescriptionKey, (Object[]) vars));
else {
String[] mergedList = addItemToFirstPositionOfArray(LocaleLoader.getString(statDescriptionKey), vars);
//Cast to Object[] to suppress warnings
return LocaleLoader.getString(templateKey, (Object[]) mergedList);
}
}
protected abstract void dataCalculations(Player player, float skillValue);
protected abstract void permissionsCheck(Player player);
//protected abstract List<String> effectsDisplay();
protected abstract List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky);
protected abstract List<TextComponent> getTextComponents(Player player);
/**
* Checks if a player can use a skill
*
* @param player target player
* @param subSkillType target subskill
* @return true if the player has permission and has the skill unlocked
*/
protected boolean canUseSubskill(Player player, SubSkillType subSkillType) {
return Permissions.isSubSkillEnabled(player, subSkillType) && RankUtils.hasUnlockedSubskill(player, subSkillType);
}
}

View File

@@ -1,99 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.child.smelting.Smelting;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SmeltingCommand extends SkillCommand {
private String burnTimeModifier;
private String str_secondSmeltChance;
private String str_secondSmeltChanceLucky;
private String str_fluxMiningChance;
private String str_fluxMiningChanceLucky;
private boolean canFuelEfficiency;
private boolean canSecondSmelt;
private boolean canFluxMine;
private boolean canUnderstandTheArt;
public SmeltingCommand() {
super(PrimarySkillType.SMELTING);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// FUEL EFFICIENCY
if (canFuelEfficiency) {
burnTimeModifier = decimal.format(1 + ((skillValue / Smelting.burnModifierMaxLevel) * Smelting.burnTimeMultiplier));
}
// FLUX MINING
/*if (canFluxMine) {
String[] fluxMiningStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SMELTING_FLUX_MINING);
str_fluxMiningChance = fluxMiningStrings[0];
str_fluxMiningChanceLucky = fluxMiningStrings[1];
}*/
// SECOND SMELT
if (canSecondSmelt) {
String[] secondSmeltStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SMELTING_SECOND_SMELT);
str_secondSmeltChance = secondSmeltStrings[0];
str_secondSmeltChanceLucky = secondSmeltStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canFuelEfficiency = canUseSubskill(player, SubSkillType.SMELTING_FUEL_EFFICIENCY);
canSecondSmelt = canUseSubskill(player, SubSkillType.SMELTING_SECOND_SMELT);
canFluxMine = canUseSubskill(player, SubSkillType.SMELTING_FLUX_MINING);
canUnderstandTheArt = Permissions.vanillaXpBoost(player, skill) && RankUtils.hasUnlockedSubskill(player, SubSkillType.SMELTING_UNDERSTANDING_THE_ART);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
/*if (canFluxMine) {
messages.add(getStatMessage(SubSkillType.SMELTING_FLUX_MINING, str_fluxMiningChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", str_fluxMiningChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Smelting.Ability.FluxMining", str_fluxMiningChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", str_fluxMiningChanceLucky) : ""));
}*/
if (canFuelEfficiency) {
messages.add(getStatMessage(false, true, SubSkillType.SMELTING_FUEL_EFFICIENCY, burnTimeModifier));
}
if (canSecondSmelt) {
messages.add(getStatMessage(SubSkillType.SMELTING_SECOND_SMELT, str_secondSmeltChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", str_secondSmeltChanceLucky) : ""));
}
if (canUnderstandTheArt) {
messages.add(getStatMessage(false, true, SubSkillType.SMELTING_UNDERSTANDING_THE_ART,
String.valueOf(UserManager.getPlayer(player).getSmeltingManager().getVanillaXpMultiplier())));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SMELTING);
return textComponents;
}
}

View File

@@ -1,108 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class SwordsCommand extends SkillCommand {
private String counterChance;
private String counterChanceLucky;
private int bleedLength;
private String bleedChance;
private String bleedChanceLucky;
private String serratedStrikesLength;
private String serratedStrikesLengthEndurance;
private boolean canCounter;
private boolean canSerratedStrike;
private boolean canBleed;
public SwordsCommand() {
super(PrimarySkillType.SWORDS);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// SWORDS_COUNTER_ATTACK
if (canCounter) {
String[] counterStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_COUNTER_ATTACK);
counterChance = counterStrings[0];
counterChanceLucky = counterStrings[1];
}
// SWORDS_RUPTURE
if (canBleed) {
bleedLength = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
String[] bleedStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.SWORDS_RUPTURE);
bleedChance = bleedStrings[0];
bleedChanceLucky = bleedStrings[1];
}
// SERRATED STRIKES
if (canSerratedStrike) {
String[] serratedStrikesStrings = calculateLengthDisplayValues(player, skillValue);
serratedStrikesLength = serratedStrikesStrings[0];
serratedStrikesLengthEndurance = serratedStrikesStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canBleed = canUseSubskill(player, SubSkillType.SWORDS_RUPTURE);
canCounter = canUseSubskill(player, SubSkillType.SWORDS_COUNTER_ATTACK);
canSerratedStrike = RankUtils.hasUnlockedSubskill(player, SubSkillType.SWORDS_SERRATED_STRIKES) && Permissions.serratedStrikes(player);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
int ruptureTicks = UserManager.getPlayer(player).getSwordsManager().getRuptureBleedTicks();
double ruptureDamagePlayers = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamagePlayer() * 1.5D : AdvancedConfig.getInstance().getRuptureDamagePlayer();
double ruptureDamageMobs = RankUtils.getRank(player, SubSkillType.SWORDS_RUPTURE) >= 3 ? AdvancedConfig.getInstance().getRuptureDamageMobs() * 1.5D : AdvancedConfig.getInstance().getRuptureDamageMobs();
if (canCounter) {
messages.add(getStatMessage(SubSkillType.SWORDS_COUNTER_ATTACK, counterChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", counterChanceLucky) : ""));
}
if (canBleed) {
messages.add(getStatMessage(SubSkillType.SWORDS_RUPTURE, bleedChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", bleedChanceLucky) : ""));
messages.add(getStatMessage(true, true, SubSkillType.SWORDS_RUPTURE,
String.valueOf(ruptureTicks),
String.valueOf(ruptureDamagePlayers),
String.valueOf(ruptureDamageMobs)));
messages.add(LocaleLoader.getString("Swords.Combat.Rupture.Note"));
}
if (canSerratedStrike) {
messages.add(getStatMessage(SubSkillType.SWORDS_SERRATED_STRIKES, serratedStrikesLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", serratedStrikesLengthEndurance) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.SWORDS);
return textComponents;
}
}

View File

@@ -1,102 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.primary.taming.Taming;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class TamingCommand extends SkillCommand {
private String goreChance;
private String goreChanceLucky;
private boolean canBeastLore;
private boolean canGore;
private boolean canSharpenedClaws;
private boolean canEnvironmentallyAware;
private boolean canThickFur;
private boolean canShockProof;
private boolean canCallWild;
private boolean canFastFood;
private boolean canHolyHound;
public TamingCommand() {
super(PrimarySkillType.TAMING);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
if (canGore) {
String[] goreStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.TAMING_GORE);
goreChance = goreStrings[0];
goreChanceLucky = goreStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canBeastLore = canUseSubskill(player, SubSkillType.TAMING_BEAST_LORE);
canCallWild = Permissions.callOfTheWild(player, EntityType.HORSE) || Permissions.callOfTheWild(player, EntityType.WOLF) || Permissions.callOfTheWild(player, EntityType.OCELOT);
canEnvironmentallyAware = canUseSubskill(player, SubSkillType.TAMING_ENVIRONMENTALLY_AWARE);
canFastFood = canUseSubskill(player, SubSkillType.TAMING_FAST_FOOD_SERVICE);
canGore = canUseSubskill(player, SubSkillType.TAMING_GORE);
canSharpenedClaws = canUseSubskill(player, SubSkillType.TAMING_SHARPENED_CLAWS);
canShockProof = canUseSubskill(player, SubSkillType.TAMING_SHOCK_PROOF);
canThickFur = canUseSubskill(player, SubSkillType.TAMING_THICK_FUR);
canHolyHound = canUseSubskill(player, SubSkillType.TAMING_HOLY_HOUND);
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canEnvironmentallyAware) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.0"), LocaleLoader.getString("Taming.Ability.Bonus.1")));
}
if (canFastFood) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.8"), LocaleLoader.getString("Taming.Ability.Bonus.9", percent.format(Taming.fastFoodServiceActivationChance / 100D))));
}
if (canGore) {
messages.add(LocaleLoader.getString("Ability.Generic.Template",
LocaleLoader.getString("Taming.Combat.Chance.Gore"),
goreChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", goreChanceLucky) : ""));
}
if (canHolyHound) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.10"), LocaleLoader.getString("Taming.Ability.Bonus.11")));
}
if (canSharpenedClaws) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.6"), LocaleLoader.getString("Taming.Ability.Bonus.7", Taming.sharpenedClawsBonusDamage)));
}
if (canShockProof) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.4"), LocaleLoader.getString("Taming.Ability.Bonus.5", Taming.shockProofModifier)));
}
if (canThickFur) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Taming.Ability.Bonus.2"), LocaleLoader.getString("Taming.Ability.Bonus.3", Taming.thickFurModifier)));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, this.skill);
return textComponents;
}
}

View File

@@ -1,129 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class UnarmedCommand extends SkillCommand {
private String berserkLength;
private String berserkLengthEndurance;
private String deflectChance;
private String deflectChanceLucky;
private String disarmChance;
private String disarmChanceLucky;
private String ironGripChance;
private String ironGripChanceLucky;
private double ironArmBonus;
private boolean canBerserk;
private boolean canDisarm;
private boolean canIronArm;
private boolean canDeflect;
private boolean canIronGrip;
public UnarmedCommand() {
super(PrimarySkillType.UNARMED);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// UNARMED_ARROW_DEFLECT
if (canDeflect) {
String[] deflectStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_ARROW_DEFLECT);
;
deflectChance = deflectStrings[0];
deflectChanceLucky = deflectStrings[1];
}
// BERSERK
if (canBerserk) {
String[] berserkStrings = calculateLengthDisplayValues(player, skillValue);
berserkLength = berserkStrings[0];
berserkLengthEndurance = berserkStrings[1];
}
// UNARMED_DISARM
if (canDisarm) {
String[] disarmStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_DISARM);
;
disarmChance = disarmStrings[0];
disarmChanceLucky = disarmStrings[1];
}
// IRON ARM
if (canIronArm) {
ironArmBonus = UserManager.getPlayer(player).getUnarmedManager().getIronArmDamage();
}
// IRON GRIP
if (canIronGrip) {
String[] ironGripStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.UNARMED_IRON_GRIP);
ironGripChance = ironGripStrings[0];
ironGripChanceLucky = ironGripStrings[1];
}
}
@Override
protected void permissionsCheck(Player player) {
canBerserk = RankUtils.hasUnlockedSubskill(player, SubSkillType.UNARMED_BERSERK) && Permissions.berserk(player);
canIronArm = canUseSubskill(player, SubSkillType.UNARMED_IRON_ARM_STYLE);
canDeflect = canUseSubskill(player, SubSkillType.UNARMED_ARROW_DEFLECT);
canDisarm = canUseSubskill(player, SubSkillType.UNARMED_DISARM);
canIronGrip = canUseSubskill(player, SubSkillType.UNARMED_IRON_GRIP);
// TODO: Apparently we forgot about block cracker?
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canDeflect) {
messages.add(getStatMessage(SubSkillType.UNARMED_ARROW_DEFLECT, deflectChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", deflectChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.ArrowDeflect", deflectChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", deflectChanceLucky) : ""));
}
if (canBerserk) {
messages.add(getStatMessage(SubSkillType.UNARMED_BERSERK, berserkLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", berserkLengthEndurance) : ""));
//messages.add(LocaleLoader.getString("Unarmed.Ability.Berserk.Length", berserkLength) + (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", berserkLengthEndurance) : ""));
}
if (canDisarm) {
messages.add(getStatMessage(SubSkillType.UNARMED_DISARM, disarmChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", disarmChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.Disarm", disarmChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", disarmChanceLucky) : ""));
}
if (canIronArm) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Unarmed.Ability.Bonus.0"), LocaleLoader.getString("Unarmed.Ability.Bonus.1", ironArmBonus)));
}
if (canIronGrip) {
messages.add(getStatMessage(SubSkillType.UNARMED_IRON_GRIP, ironGripChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ironGripChanceLucky) : ""));
//messages.add(LocaleLoader.getString("Unarmed.Ability.Chance.IronGrip", ironGripChance) + (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", ironGripChanceLucky) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.UNARMED);
return textComponents;
}
}

View File

@@ -1,96 +0,0 @@
package com.gmail.nossr50.commands.skills;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.TextComponentFactory;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillActivationType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.entity.Player;
import java.util.ArrayList;
import java.util.List;
public class WoodcuttingCommand extends SkillCommand {
private String treeFellerLength;
private String treeFellerLengthEndurance;
private String doubleDropChance;
private String doubleDropChanceLucky;
private boolean canTreeFell;
private boolean canLeafBlow;
private boolean canDoubleDrop;
private boolean canSplinter;
private boolean canBarkSurgeon;
private boolean canNaturesBounty;
public WoodcuttingCommand() {
super(PrimarySkillType.WOODCUTTING);
}
@Override
protected void dataCalculations(Player player, float skillValue) {
// DOUBLE DROPS
if (canDoubleDrop) {
setDoubleDropClassicChanceStrings(player);
}
// TREE FELLER
if (canTreeFell) {
String[] treeFellerStrings = calculateLengthDisplayValues(player, skillValue);
treeFellerLength = treeFellerStrings[0];
treeFellerLengthEndurance = treeFellerStrings[1];
}
}
private void setDoubleDropClassicChanceStrings(Player player) {
String[] doubleDropStrings = getAbilityDisplayValues(SkillActivationType.RANDOM_LINEAR_100_SCALE_WITH_CAP, player, SubSkillType.WOODCUTTING_HARVEST_LUMBER);
;
doubleDropChance = doubleDropStrings[0];
doubleDropChanceLucky = doubleDropStrings[1];
}
@Override
protected void permissionsCheck(Player player) {
canTreeFell = RankUtils.hasUnlockedSubskill(player, SubSkillType.WOODCUTTING_TREE_FELLER) && Permissions.treeFeller(player);
canDoubleDrop = canUseSubskill(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) && !skill.getDoubleDropsDisabled() && RankUtils.getRank(player, SubSkillType.WOODCUTTING_HARVEST_LUMBER) >= 1;
canLeafBlow = canUseSubskill(player, SubSkillType.WOODCUTTING_LEAF_BLOWER);
/*canSplinter = canUseSubskill(player, SubSkillType.WOODCUTTING_SPLINTER);
canBarkSurgeon = canUseSubskill(player, SubSkillType.WOODCUTTING_BARK_SURGEON);
canNaturesBounty = canUseSubskill(player, SubSkillType.WOODCUTTING_NATURES_BOUNTY);*/
}
@Override
protected List<String> statsDisplay(Player player, float skillValue, boolean hasEndurance, boolean isLucky) {
List<String> messages = new ArrayList<String>();
if (canDoubleDrop) {
messages.add(getStatMessage(SubSkillType.WOODCUTTING_HARVEST_LUMBER, doubleDropChance)
+ (isLucky ? LocaleLoader.getString("Perks.Lucky.Bonus", doubleDropChanceLucky) : ""));
}
if (canLeafBlow) {
messages.add(LocaleLoader.getString("Ability.Generic.Template", LocaleLoader.getString("Woodcutting.Ability.0"), LocaleLoader.getString("Woodcutting.Ability.1")));
}
if (canTreeFell) {
messages.add(getStatMessage(SubSkillType.WOODCUTTING_TREE_FELLER, treeFellerLength)
+ (hasEndurance ? LocaleLoader.getString("Perks.ActivationTime.Bonus", treeFellerLengthEndurance) : ""));
}
return messages;
}
@Override
protected List<TextComponent> getTextComponents(Player player) {
List<TextComponent> textComponents = new ArrayList<>();
TextComponentFactory.getSubSkillTextComponents(player, textComponents, PrimarySkillType.WOODCUTTING);
return textComponents;
}
}

View File

@@ -1,566 +0,0 @@
package com.gmail.nossr50.listeners;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.config.ChunkConversionOptions;
import com.gmail.nossr50.core.config.WorldBlacklist;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SuperAbilityType;
import com.gmail.nossr50.core.skills.ToolType;
import com.gmail.nossr50.core.skills.child.salvage.Salvage;
import com.gmail.nossr50.core.skills.primary.alchemy.Alchemy;
import com.gmail.nossr50.core.skills.primary.excavation.ExcavationManager;
import com.gmail.nossr50.core.skills.primary.herbalism.Herbalism;
import com.gmail.nossr50.core.skills.primary.herbalism.HerbalismManager;
import com.gmail.nossr50.core.skills.primary.mining.MiningManager;
import com.gmail.nossr50.core.skills.primary.repair.Repair;
import com.gmail.nossr50.core.skills.primary.woodcutting.WoodcuttingManager;
import com.gmail.nossr50.core.util.BlockUtils;
import com.gmail.nossr50.core.util.EventUtils;
import com.gmail.nossr50.core.util.ItemUtils;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.skills.SkillUtils;
import com.gmail.nossr50.core.util.sounds.SoundManager;
import com.gmail.nossr50.core.util.sounds.SoundType;
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
import com.gmail.nossr50.core.events.fake.FakeBlockBreakEvent;
import com.gmail.nossr50.core.events.fake.FakeBlockDamageEvent;
import com.gmail.nossr50.mcMMO;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.block.*;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.metadata.MetadataValue;
import java.util.List;
public class BlockListener implements Listener {
private final mcMMO plugin;
public BlockListener(final mcMMO plugin) {
this.plugin = plugin;
}
/**
* Monitor BlockPistonExtend events.
*
* @param event The event to monitor
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPistonExtend(BlockPistonExtendEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
BlockFace direction = event.getDirection();
Block movedBlock = event.getBlock();
movedBlock = movedBlock.getRelative(direction, 2);
for (Block b : event.getBlocks()) {
if (BlockUtils.shouldBeWatched(b.getState()) && mcMMO.getPlaceStore().isTrue(b)) {
movedBlock = b.getRelative(direction);
mcMMO.getPlaceStore().setTrue(movedBlock);
}
}
}
/**
* Monitor BlockPistonRetract events.
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockPistonRetract(BlockPistonRetractEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
// Get opposite direction so we get correct block
BlockFace direction = event.getDirection();
Block movedBlock = event.getBlock().getRelative(direction);
mcMMO.getPlaceStore().setTrue(movedBlock);
for (Block block : event.getBlocks()) {
movedBlock = block.getRelative(direction);
mcMMO.getPlaceStore().setTrue(movedBlock);
}
}
/**
* Monitor blocks formed by entities (snowmen)
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEntityBlockFormEvent(EntityBlockFormEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
if (BlockUtils.shouldBeWatched(event.getBlock().getState())) {
mcMMO.getPlaceStore().setTrue(event.getBlock());
}
}
/**
* Monitor falling blocks.
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onFallingBlock(EntityChangeBlockEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
if (BlockUtils.shouldBeWatched(event.getBlock().getState()) && event.getEntityType().equals(EntityType.FALLING_BLOCK)) {
if (event.getTo().equals(Material.AIR) && mcMMO.getPlaceStore().isTrue(event.getBlock())) {
event.getEntity().setMetadata("mcMMOBlockFall", new FixedMetadataValue(plugin, event.getBlock().getLocation()));
} else {
List<MetadataValue> values = event.getEntity().getMetadata("mcMMOBlockFall");
if (!values.isEmpty()) {
if (values.get(0).value() == null) return;
Block spawn = ((org.bukkit.Location) values.get(0).value()).getBlock();
mcMMO.getPlaceStore().setTrue(event.getBlock());
mcMMO.getPlaceStore().setFalse(spawn);
}
}
}
}
/**
* Monitor BlockPlace events.
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onBlockPlace(BlockPlaceEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player)) {
return;
}
BlockState blockState = event.getBlock().getState();
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
if (BlockUtils.shouldBeWatched(blockState)) {
// Don't count de-barking wood
if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType()))
mcMMO.getPlaceStore().setTrue(blockState);
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
if (blockState.getType() == Repair.anvilMaterial && PrimarySkillType.REPAIR.getPermissions(player)) {
mcMMOPlayer.getRepairManager().placedAnvilCheck();
} else if (blockState.getType() == Salvage.anvilMaterial && PrimarySkillType.SALVAGE.getPermissions(player)) {
mcMMOPlayer.getSalvageManager().placedAnvilCheck();
}
}
/**
* Monitor BlockMultiPlace events.
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockMultiPlace(BlockMultiPlaceEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player)) {
return;
}
for (BlockState replacedBlockState : event.getReplacedBlockStates()) {
BlockState blockState = replacedBlockState.getBlock().getState();
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
if (BlockUtils.shouldBeWatched(blockState)) {
mcMMO.getPlaceStore().setTrue(blockState);
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockGrow(BlockGrowEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
BlockState blockState = event.getBlock().getState();
if (!BlockUtils.shouldBeWatched(blockState)) {
return;
}
mcMMO.getPlaceStore().setFalse(blockState);
}
/**
* Monitor BlockBreak events.
*
* @param event The event to monitor
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return;
}
if (event instanceof FakeBlockBreakEvent) {
return;
}
BlockState blockState = event.getBlock().getState();
Location location = blockState.getLocation();
if (!BlockUtils.shouldBeWatched(blockState)) {
return;
}
/* ALCHEMY - Cancel any brew in progress for that BrewingStand */
if (blockState instanceof BrewingStand && Alchemy.brewingStandMap.containsKey(location)) {
Alchemy.brewingStandMap.get(location).cancelBrew();
}
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
ItemStack heldItem = player.getInventory().getItemInMainHand();
/* HERBALISM */
if (BlockUtils.affectedByGreenTerra(blockState)) {
HerbalismManager herbalismManager = mcMMOPlayer.getHerbalismManager();
/* Green Terra */
if (herbalismManager.canActivateAbility()) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
}
/*
* We don't check the block store here because herbalism has too many unusual edge cases.
* Instead, we check it inside the drops handler.
*/
if (PrimarySkillType.HERBALISM.getPermissions(player)) {
herbalismManager.herbalismBlockCheck(blockState);
}
}
/* MINING */
else if (BlockUtils.affectedBySuperBreaker(blockState) && ItemUtils.isPickaxe(heldItem) && PrimarySkillType.MINING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
MiningManager miningManager = mcMMOPlayer.getMiningManager();
miningManager.miningBlockCheck(blockState);
}
/* WOOD CUTTING */
else if (BlockUtils.isLog(blockState) && ItemUtils.isAxe(heldItem) && PrimarySkillType.WOODCUTTING.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
WoodcuttingManager woodcuttingManager = mcMMOPlayer.getWoodcuttingManager();
if (woodcuttingManager.canUseTreeFeller(heldItem)) {
woodcuttingManager.processTreeFeller(blockState);
} else {
woodcuttingManager.woodcuttingBlockCheck(blockState);
}
}
/* EXCAVATION */
else if (BlockUtils.affectedByGigaDrillBreaker(blockState) && ItemUtils.isShovel(heldItem) && PrimarySkillType.EXCAVATION.getPermissions(player) && !mcMMO.getPlaceStore().isTrue(blockState)) {
ExcavationManager excavationManager = mcMMOPlayer.getExcavationManager();
excavationManager.excavationBlockCheck(blockState);
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER)) {
excavationManager.gigaDrillBreaker(blockState);
}
}
/* Remove metadata from placed watched blocks */
mcMMO.getPlaceStore().setFalse(blockState);
}
/**
* Handle BlockBreak events where the event is modified.
*
* @param event The event to modify
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreakHigher(BlockBreakEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return;
}
if (event instanceof FakeBlockBreakEvent) {
return;
}
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player) || player.getGameMode() == GameMode.CREATIVE) {
return;
}
BlockState blockState = event.getBlock().getState();
ItemStack heldItem = player.getInventory().getItemInMainHand();
if (Herbalism.isRecentlyRegrown(blockState)) {
event.setCancelled(true);
return;
}
if (ItemUtils.isSword(heldItem)) {
HerbalismManager herbalismManager = UserManager.getPlayer(player).getHerbalismManager();
if (herbalismManager.canUseHylianLuck()) {
if (herbalismManager.processHylianLuck(blockState)) {
blockState.update(true);
event.setCancelled(true);
} else if (blockState.getType() == Material.FLOWER_POT) {
blockState.setType(Material.AIR);
blockState.update(true);
event.setCancelled(true);
}
}
}
/*else if (!heldItem.containsEnchantment(Enchantment.SILK_TOUCH)) {
SmeltingManager smeltingManager = UserManager.getPlayer(player).getSmeltingManager();
if (smeltingManager.canUseFluxMining(blockState)) {
if (smeltingManager.processFluxMining(blockState)) {
blockState.update(true);
event.setCancelled(true);
}
}
}*/
}
/**
* Monitor BlockDamage events.
*
* @param event The event to watch
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockDamage(BlockDamageEvent event) {
Player player = event.getPlayer();
BlockState blockState = event.getBlock().getState();
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return;
}
if (event instanceof FakeBlockDamageEvent) {
return;
}
if (!UserManager.hasPlayerDataKey(player)) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
/*
* ABILITY PREPARATION CHECKS
*
* We check permissions here before processing activation.
*/
if (BlockUtils.canActivateAbilities(blockState)) {
ItemStack heldItem = player.getInventory().getItemInMainHand();
if (mcMMOPlayer.getToolPreparationMode(ToolType.HOE) && ItemUtils.isHoe(heldItem) && (BlockUtils.affectedByGreenTerra(blockState) || BlockUtils.canMakeMossy(blockState)) && Permissions.greenTerra(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.HERBALISM);
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.AXE) && ItemUtils.isAxe(heldItem) && BlockUtils.isLog(blockState) && Permissions.treeFeller(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.WOODCUTTING);
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.PICKAXE) && ItemUtils.isPickaxe(heldItem) && BlockUtils.affectedBySuperBreaker(blockState) && Permissions.superBreaker(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.MINING);
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.SHOVEL) && ItemUtils.isShovel(heldItem) && BlockUtils.affectedByGigaDrillBreaker(blockState) && Permissions.gigaDrillBreaker(player)) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.EXCAVATION);
} else if (mcMMOPlayer.getToolPreparationMode(ToolType.FISTS) && heldItem.getType() == Material.AIR && (BlockUtils.affectedByGigaDrillBreaker(blockState) || blockState.getType() == Material.SNOW || BlockUtils.affectedByBlockCracker(blockState) && Permissions.berserk(player))) {
mcMMOPlayer.checkAbilityActivation(PrimarySkillType.UNARMED);
}
}
/*
* TREE FELLER SOUNDS
*
* We don't need to check permissions here because they've already been checked for the ability to even activate.
*/
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.TREE_FELLER) && BlockUtils.isLog(blockState) && MainConfig.getInstance().getTreeFellerSoundsEnabled()) {
SoundManager.sendSound(player, blockState.getLocation(), SoundType.FIZZ);
}
}
private Player getPlayerFromFurnace(Block furnaceBlock) {
List<MetadataValue> metadata = furnaceBlock.getMetadata(mcMMO.furnaceMetadataKey);
if (metadata.isEmpty()) {
return null;
}
return plugin.getServer().getPlayerExact(metadata.get(0).asString());
}
/**
* Handle BlockDamage events where the event is modified.
*
* @param event The event to modify
*/
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockDamageHigher(BlockDamageEvent event) {
/* WORLD BLACKLIST CHECK */
if (WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
/* WORLD GUARD MAIN FLAG CHECK */
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasMainFlag(event.getPlayer()))
return;
}
if (event instanceof FakeBlockDamageEvent) {
return;
}
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player)) {
return;
}
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
ItemStack heldItem = player.getInventory().getItemInMainHand();
Block block = event.getBlock();
BlockState blockState = block.getState();
/*
* ABILITY TRIGGER CHECKS
*
* We don't need to check permissions here because they've already been checked for the ability to even activate.
*/
if (mcMMOPlayer.getAbilityMode(SuperAbilityType.GREEN_TERRA) && BlockUtils.canMakeMossy(blockState)) {
if (mcMMOPlayer.getHerbalismManager().processGreenTerra(blockState)) {
blockState.update(true);
}
} else if (mcMMOPlayer.getAbilityMode(SuperAbilityType.BERSERK) && heldItem.getType() == Material.AIR) {
if (SuperAbilityType.BERSERK.blockCheck(block.getState()) && EventUtils.simulateBlockBreak(block, player, true)) {
event.setInstaBreak(true);
SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
} else if (mcMMOPlayer.getUnarmedManager().canUseBlockCracker() && BlockUtils.affectedByBlockCracker(blockState) && EventUtils.simulateBlockBreak(block, player, true)) {
if (mcMMOPlayer.getUnarmedManager().blockCrackerCheck(blockState)) {
blockState.update();
}
}
} else if (mcMMOPlayer.getWoodcuttingManager().canUseLeafBlower(heldItem) && BlockUtils.isLeaves(blockState) && EventUtils.simulateBlockBreak(block, player, true)) {
event.setInstaBreak(true);
SoundManager.sendSound(player, block.getLocation(), SoundType.POP);
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onBlockDamageCleanup(BlockDamageEvent event) {
Player player = event.getPlayer();
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
BlockState blockState = event.getBlock().getState();
ItemStack heldItem = player.getInventory().getItemInMainHand();
cleanupAbilityTools(player, mcMMOPlayer, blockState, heldItem);
debugStickDump(player, blockState);
}
public void debugStickDump(Player player, BlockState blockState) {
if (player.getInventory().getItemInMainHand().getType() == Material.DEBUG_STICK) {
if (mcMMO.getPlaceStore().isTrue(blockState))
player.sendMessage("[mcMMO DEBUG] This block is not natural and does not reward treasures/XP");
else {
player.sendMessage("[mcMMO DEBUG] This block is considered natural by mcMMO");
UserManager.getPlayer(player).getExcavationManager().printExcavationDebug(player, blockState);
}
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (WorldGuardManager.getInstance().hasMainFlag(player))
player.sendMessage("[mcMMO DEBUG] World Guard main flag is permitted for this player in this region");
else
player.sendMessage("[mcMMO DEBUG] World Guard main flag is DENIED for this player in this region");
if (WorldGuardManager.getInstance().hasXPFlag(player))
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is permitted for this player in this region");
else
player.sendMessage("[mcMMO DEBUG] World Guard xp flag is not permitted for this player in this region");
}
if (blockState instanceof Furnace) {
Furnace furnace = (Furnace) blockState;
if (furnace.hasMetadata(mcMMO.furnaceMetadataKey)) {
player.sendMessage("[mcMMO DEBUG] This furnace has a registered owner");
Player furnacePlayer = getPlayerFromFurnace(furnace.getBlock());
if (furnacePlayer != null) {
player.sendMessage("[mcMMO DEBUG] This furnace is owned by player " + furnacePlayer.getName());
}
} else
player.sendMessage("[mcMMO DEBUG] This furnace does not have a registered owner");
}
if (ExperienceConfig.getInstance().isExperienceBarsEnabled())
player.sendMessage("[mcMMO DEBUG] XP bars are enabled, however you should check per-skill settings to make sure those are enabled.");
}
}
public void cleanupAbilityTools(Player player, McMMOPlayer mcMMOPlayer, BlockState blockState, ItemStack heldItem) {
if (ChunkConversionOptions.getInstance().useEnchantmentBuffs()) {
if ((ItemUtils.isPickaxe(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER)) || (ItemUtils.isShovel(heldItem) && !mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER))) {
SkillUtils.removeAbilityBuff(heldItem);
}
} else {
if ((mcMMOPlayer.getAbilityMode(SuperAbilityType.SUPER_BREAKER) && !BlockUtils.affectedBySuperBreaker(blockState)) || (mcMMOPlayer.getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER) && !BlockUtils.affectedByGigaDrillBreaker(blockState))) {
SkillUtils.handleAbilitySpeedDecrease(player);
}
}
}
}

View File

@@ -1,107 +0,0 @@
package com.gmail.nossr50.listeners;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import com.gmail.nossr50.core.skills.subskills.interfaces.InteractType;
import com.gmail.nossr50.core.skills.subskills.interfaces.Interaction;
import com.gmail.nossr50.mcMMO;
import org.bukkit.event.Event;
import java.util.ArrayList;
import java.util.HashMap;
public class InteractionManager {
private static HashMap<InteractType, ArrayList<Interaction>> interactRegister;
private static HashMap<String, AbstractSubSkill> subSkillNameMap; //Used for mmoinfo optimization
private static ArrayList<AbstractSubSkill> subSkillList;
/**
* Registers subskills with the Interaction registration
*
* @param abstractSubSkill the target subskill to register
*/
public static void registerSubSkill(AbstractSubSkill abstractSubSkill) {
/* INIT MAPS */
if (interactRegister == null)
interactRegister = new HashMap<>();
if (subSkillList == null)
subSkillList = new ArrayList<>();
if (subSkillNameMap == null)
subSkillNameMap = new HashMap<>();
//Store a unique copy of each subskill
if (!subSkillList.contains(abstractSubSkill))
subSkillList.add(abstractSubSkill);
//Init ArrayList
if (interactRegister.get(abstractSubSkill.getInteractType()) == null)
interactRegister.put(abstractSubSkill.getInteractType(), new ArrayList<>());
//Registration array reference
ArrayList<Interaction> arrayRef = interactRegister.get(abstractSubSkill.getInteractType());
//Register skill
arrayRef.add(abstractSubSkill);
String lowerCaseName = abstractSubSkill.getConfigKeyName().toLowerCase();
//Register in name map
if (subSkillNameMap.get(lowerCaseName) == null)
subSkillNameMap.put(lowerCaseName, abstractSubSkill);
System.out.println("[mcMMO] registered subskill: " + abstractSubSkill.getConfigKeyName());
}
/**
* Grabs the registered abstract skill by its name
* Is not case sensitive
*
* @param name name of subskill, not case sensitive
* @return null if the subskill is not registered
*/
public static AbstractSubSkill getAbstractByName(String name) {
return subSkillNameMap.get(name.toLowerCase());
}
/**
* Processes the associated Interactions for this event
*
* @param event target event
* @param plugin instance of mcMMO plugin
* @param curInteractType the associated interaction type
*/
public static void processEvent(Event event, mcMMO plugin, InteractType curInteractType) {
for (Interaction interaction : interactRegister.get(curInteractType)) {
interaction.doInteraction(event, plugin);
}
}
/**
* Returns the list that contains all unique instances of registered Interaction classes
* Interactions are extensions of abstract classes that represent modifying behaviours in Minecraft through events
*
* @return the unique collection of all registered Interaction classes
*/
public static ArrayList<AbstractSubSkill> getSubSkillList() {
return subSkillList;
}
public static boolean hasSubSkill(String name) {
return getAbstractByName(name) != null;
}
public static boolean hasSubSkill(SubSkillType subSkillType) {
return hasSubSkill(subSkillType.getNiceNameNoSpaces(subSkillType));
}
/**
* Returns the associative map which contains all registered interactions
*
* @return the interact register
*/
public static HashMap<InteractType, ArrayList<Interaction>> getInteractRegister() {
return interactRegister;
}
}

View File

@@ -1,133 +0,0 @@
package com.gmail.nossr50.listeners;
import com.gmail.nossr50.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
import com.gmail.nossr50.core.worldguard.WorldGuardManager;
import com.gmail.nossr50.core.worldguard.WorldGuardUtils;
import com.gmail.nossr50.core.events.experience.McMMOPlayerLevelUpEvent;
import com.gmail.nossr50.core.events.experience.McMMOPlayerXpGainEvent;
import com.gmail.nossr50.core.events.skills.abilities.McMMOPlayerAbilityActivateEvent;
import com.gmail.nossr50.mcMMO;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
public class SelfListener implements Listener {
//Used in task scheduling and other things
private final mcMMO plugin;
public SelfListener(mcMMO plugin) {
this.plugin = plugin;
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerLevelUp(McMMOPlayerLevelUpEvent event) {
Player player = event.getPlayer();
PrimarySkillType skill = event.getSkill();
//Players can gain multiple levels especially during xprate events
for (int i = 0; i < event.getLevelsGained(); i++) {
int previousLevelGained = event.getSkillLevel() - i;
//Send player skill unlock notifications
UserManager.getPlayer(player).processUnlockNotifications(plugin, event.getSkill(), previousLevelGained);
}
if (MainConfig.getInstance().getScoreboardsEnabled())
ScoreboardManager.handleLevelUp(player, skill);
if (!MainConfig.getInstance().getLevelUpEffectsEnabled()) {
return;
}
if ((event.getSkillLevel() % MainConfig.getInstance().getLevelUpEffectsTier()) == 0) {
skill.celebrateLevelUp(player);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onPlayerXp(McMMOPlayerXpGainEvent event) {
if (MainConfig.getInstance().getScoreboardsEnabled())
ScoreboardManager.handleXp(event.getPlayer(), event.getSkill());
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onAbility(McMMOPlayerAbilityActivateEvent event) {
if (MainConfig.getInstance().getScoreboardsEnabled())
ScoreboardManager.cooldownUpdate(event.getPlayer(), event.getSkill());
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onPlayerXpGain(McMMOPlayerXpGainEvent event) {
Player player = event.getPlayer();
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
PrimarySkillType primarySkillType = event.getSkill();
//WorldGuard XP Check
if (event.getXpGainReason() == XPGainReason.PVE ||
event.getXpGainReason() == XPGainReason.PVP ||
event.getXpGainReason() == XPGainReason.SHARED_PVE ||
event.getXpGainReason() == XPGainReason.SHARED_PVP) {
if (WorldGuardUtils.isWorldGuardLoaded()) {
if (!WorldGuardManager.getInstance().hasXPFlag(player)) {
event.setRawXpGained(0);
event.setCancelled(true);
}
}
}
if (event.getXpGainReason() == XPGainReason.COMMAND) {
return;
}
int threshold = ExperienceConfig.getInstance().getDiminishedReturnsThreshold(primarySkillType);
if (threshold <= 0 || !ExperienceConfig.getInstance().getDiminishedReturnsEnabled()) {
// Diminished returns is turned off
return;
}
final float rawXp = event.getRawXpGained();
if (rawXp < 0) {
// Don't calculate for XP subtraction
return;
}
if (primarySkillType.isChildSkill()) {
return;
}
float guaranteedMinimum = ExperienceConfig.getInstance().getDiminishedReturnsCap() * rawXp;
float modifiedThreshold = (float) (threshold / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier());
float difference = (mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) - modifiedThreshold) / modifiedThreshold;
if (difference > 0) {
// System.out.println("Total XP Earned: " + mcMMOPlayer.getProfile().getRegisteredXpGain(primarySkillType) + " / Threshold value: " + threshold);
// System.out.println(difference * 100 + "% over the threshold!");
// System.out.println("Previous: " + event.getRawXpGained());
// System.out.println("Adjusted XP " + (event.getRawXpGained() - (event.getRawXpGained() * difference)));
float newValue = rawXp - (rawXp * difference);
/*
* Make sure players get a guaranteed minimum of XP
*/
//If there is no guaranteed minimum proceed, otherwise only proceed if newValue would be higher than our guaranteed minimum
if (guaranteedMinimum <= 0 || newValue > guaranteedMinimum) {
if (newValue > 0) {
event.setRawXpGained(newValue);
} else {
event.setCancelled(true);
}
} else {
event.setRawXpGained(guaranteedMinimum);
}
}
}
}

View File

@@ -1,624 +0,0 @@
package util.java.mcMMO;
import org.bukkit.Material;
import org.bukkit.potion.PotionData;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class PotionConfigGenerator {
public static void main(String[] args) {
Map<WriteablePotion, Map<Ingredient, WriteablePotion>> vanillaPotions = new HashMap<>();
populateVanillaPotions(vanillaPotions);
Map<WriteablePotion, Map<Ingredient, WriteablePotion>> mcMMOPotions = new HashMap<>();
populateCustomPotions(mcMMOPotions);
List<WriteablePotion> sorted = new ArrayList<>();
sorted.addAll(vanillaPotions.keySet());
sorted.addAll(mcMMOPotions.keySet());
sorted.sort((a, b) -> {
// All normal potions first
if (a.mat == Material.POTION && b.mat != Material.POTION) {
return -1;
}
if (b.mat == Material.POTION && a.mat != Material.POTION) {
return 1;
}
// All splash potions second
if (a.mat == Material.SPLASH_POTION && b.mat != Material.SPLASH_POTION) {
return -1;
}
if (b.mat == Material.SPLASH_POTION && a.mat != Material.SPLASH_POTION) {
return 1;
}
// Vanilla Potions first
if (a.effect == null && b.effect != null) {
return -1;
}
if (b.effect == null && a.effect != null) {
return 1;
}
// Vanilla potions
if (a.effect == null && b.effect == null) {
// Order by PotionType
if (a.data.getType() != b.data.getType()) {
return Integer.compare(a.data.getType().ordinal(), b.data.getType().ordinal());
}
// Plain before extended or upgraded
if (!a.data.isExtended() && !a.data.isUpgraded() && (b.data.isExtended() || b.data.isUpgraded())) {
return -1;
}
if (!b.data.isExtended() && !b.data.isUpgraded() && (a.data.isExtended() || a.data.isUpgraded())) {
return 1;
}
// Extended before Upgraded
if (a.data.isExtended() && b.data.isUpgraded()) {
return -1;
}
if (b.data.isExtended() && a.data.isUpgraded()) {
return -1;
}
// Same potion somehow?
return 0;
}
// mcMMO Potions
else {
if ((a.baseName.contains("II") || a.baseName.contains("EXTENDED")) && !(b.baseName.contains("II") || b.baseName.contains("EXTENDED"))) {
return 1;
}
if ((b.baseName.contains("II") || b.baseName.contains("EXTENDED")) && !(a.baseName.contains("II") || a.baseName.contains("EXTENDED"))) {
return -1;
}
if (!a.baseName.contains("II") && b.baseName.contains("II")) {
return -1;
}
if (!b.baseName.contains("II") && a.baseName.contains("II")) {
return 1;
}
return a.baseName.split("_")[0].compareTo(b.baseName.split("_")[0]);
}
});
for (WriteablePotion potion : sorted) {
System.out.println(" " + potion.name + ":");
Map<Ingredient, WriteablePotion> children;
if (vanillaPotions.containsKey(potion)) {
children = vanillaPotions.get(potion);
} else {
System.out.println(" Name: " + prettify(potion.name));
children = mcMMOPotions.get(potion);
}
System.out.println(" Material: " + potion.mat.name());
System.out.println(" PotionData:");
System.out.println(" PotionType: " + potion.data.getType().name());
if (potion.data.isExtended()) {
System.out.println(" Extended: true");
}
if (potion.data.isUpgraded()) {
System.out.println(" Upgraded: true");
}
if (potion.effect != null) {
System.out.println(" Effects: [\"" + getName(potion.effect.getType()) + " " + potion.effect.getAmplifier() + " " + potion.effect.getDuration() + "\"]");
}
if (children == null || children.isEmpty()) {
continue;
}
System.out.println(" Children:");
for (Entry<Ingredient, WriteablePotion> child : children.entrySet()) {
System.out.println(" " + child.getKey().name + ": " + child.getValue().name);
}
}
}
private static String prettify(String name) {
String[] substrings = name.split("_");
String prettyString = "";
int size = 1;
for (String string : substrings) {
prettyString = prettyString.concat(getCapitalized(string));
if (size < substrings.length) {
prettyString = prettyString.concat(" ");
}
size++;
}
return prettyString;
}
public static String getCapitalized(String target) {
if (target.equals("II")) { // hacks
return target;
}
return target.substring(0, 1).toUpperCase() + target.substring(1).toLowerCase();
}
private static String getName(PotionEffectType type) {
switch (type.getId()) {
case 1:
return "SPEED";
case 2:
return "SLOW";
case 3:
return "FAST_DIGGING";
case 4:
return "SLOW_DIGGING";
case 5:
return "INCREASE_DAMAGE";
case 6:
return "HEAL";
case 7:
return "HARM";
case 8:
return "JUMP";
case 9:
return "CONFUSION";
case 10:
return "REGENERATION";
case 11:
return "DAMAGE_RESISTANCE";
case 12:
return "FIRE_RESISTANCE";
case 13:
return "WATER_BREATHING";
case 14:
return "INVISIBILITY";
case 15:
return "BLINDNESS";
case 16:
return "NIGHT_VISION";
case 17:
return "HUNGER";
case 18:
return "WEAKNESS";
case 19:
return "POISON";
case 20:
return "WITHER";
case 21:
return "HEALTH_BOOST";
case 22:
return "ABSORPTION";
case 23:
return "SATURATION";
case 24:
return "GLOWING";
case 25:
return "LEVITATION";
case 26:
return "LUCK";
case 27:
return "UNLUCK";
case 28:
return "SLOW_FALLING";
case 29:
return "CONDUIT_POWER";
case 30:
return "DOLPHINS_GRACE";
default:
return "UNKNOWN_EFFECT_TYPE_" + type.getId();
}
}
private static void populateVanillaPotions(Map<WriteablePotion, Map<Ingredient, WriteablePotion>> vanillaPotions) {
for (PotionType type : PotionType.values()) {
for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) {
WriteablePotion data = new WriteablePotion(material, type);
HashMap<Ingredient, WriteablePotion> children = new HashMap<>();
getChildren(data, children);
vanillaPotions.put(data, children);
if (type.isExtendable()) {
data = new WriteablePotion(material, new PotionData(type, true, false));
children = new HashMap<>();
getChildren(data, children);
vanillaPotions.put(data, children);
}
if (type.isUpgradeable()) {
data = new WriteablePotion(material, new PotionData(type, false, true));
children = new HashMap<>();
getChildren(data, children);
vanillaPotions.put(data, children);
}
}
}
for (Entry<WriteablePotion, Map<Ingredient, WriteablePotion>> entry : vanillaPotions.entrySet()) {
if (entry.getKey().mat == Material.POTION) {
entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data));
}
if (entry.getKey().mat == Material.SPLASH_POTION) {
entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data));
}
}
}
private static void getChildren(WriteablePotion current, HashMap<Ingredient, WriteablePotion> children) {
switch (current.data.getType()) {
case WATER:
assert (!current.data.isExtended());
assert (!current.data.isUpgraded());
children.put(new Ingredient(Material.NETHER_WART), new WriteablePotion(current.mat, PotionType.AWKWARD));
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.WEAKNESS));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, PotionType.THICK));
children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.SUGAR), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(current.mat, PotionType.MUNDANE));
children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(current.mat, PotionType.MUNDANE));
return;
case AWKWARD:
assert (!current.data.isExtended());
assert (!current.data.isUpgraded());
children.put(new Ingredient(Material.GOLDEN_CARROT), new WriteablePotion(current.mat, PotionType.NIGHT_VISION));
children.put(new Ingredient(Material.RABBIT_FOOT), new WriteablePotion(current.mat, PotionType.JUMP));
children.put(new Ingredient(Material.MAGMA_CREAM), new WriteablePotion(current.mat, PotionType.FIRE_RESISTANCE));
children.put(new Ingredient(Material.SUGAR), new WriteablePotion(current.mat, PotionType.SPEED));
children.put(new Ingredient(Material.PUFFERFISH), new WriteablePotion(current.mat, PotionType.WATER_BREATHING));
children.put(new Ingredient(Material.GLISTERING_MELON_SLICE), new WriteablePotion(current.mat, PotionType.INSTANT_HEAL));
children.put(new Ingredient(Material.SPIDER_EYE), new WriteablePotion(current.mat, PotionType.POISON));
children.put(new Ingredient(Material.GHAST_TEAR), new WriteablePotion(current.mat, PotionType.REGEN));
children.put(new Ingredient(Material.BLAZE_POWDER), new WriteablePotion(current.mat, PotionType.STRENGTH));
children.put(new Ingredient(Material.TURTLE_HELMET), new WriteablePotion(current.mat, PotionType.TURTLE_MASTER));
children.put(new Ingredient(Material.PHANTOM_MEMBRANE), new WriteablePotion(current.mat, PotionType.SLOW_FALLING));
// mcMMO custom potions
double mod = 1;
if (current.mat == Material.SPLASH_POTION) {
mod = 0.75;
}
if (current.mat == Material.LINGERING_POTION) {
mod = 0.25;
}
children.put(new Ingredient(Material.BROWN_MUSHROOM), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA"));
children.put(new Ingredient(Material.CARROT), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE"));
children.put(new Ingredient(Material.SLIME_BALL), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS"));
children.put(new Ingredient(Material.GOLDEN_APPLE), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE"));
children.put(new Ingredient(Material.INK_SAC), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS"));
children.put(new Ingredient(Material.ROTTEN_FLESH), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER"));
children.put(new Ingredient(Material.POISONOUS_POTATO), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY"));
children.put(new Ingredient(Material.QUARTZ), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION"));
children.put(new Ingredient(Material.FERN), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION"));
children.put(new Ingredient(Material.APPLE), new WriteablePotion(current.mat, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST"));
return;
case FIRE_RESISTANCE:
assert (!current.data.isUpgraded());
if (current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.SLOWNESS, true, false)));
} else {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case INSTANT_DAMAGE:
assert (!current.data.isExtended());
if (!current.data.isUpgraded()) {
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
}
return;
case INSTANT_HEAL:
assert (!current.data.isExtended());
if (!current.data.isUpgraded()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
} else {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true)));
}
return;
case INVISIBILITY:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case JUMP:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case NIGHT_VISION:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INVISIBILITY));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
} else {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INVISIBILITY, true, false)));
}
return;
case POISON:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
} else {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.INSTANT_DAMAGE, false, true)));
}
return;
case REGEN:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case SLOWNESS:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case SLOW_FALLING:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case SPEED:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.SLOWNESS));
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
} else {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, new PotionData(PotionType.SLOWNESS, true, false)));
}
return;
case STRENGTH:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case TURTLE_MASTER:
if (!current.data.isUpgraded() && !current.data.isExtended()) {
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(current.mat, new PotionData(current.data.getType(), false, true)));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case WATER_BREATHING:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.FERMENTED_SPIDER_EYE), new WriteablePotion(current.mat, PotionType.INSTANT_DAMAGE));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case WEAKNESS:
assert (!current.data.isUpgraded());
if (!current.data.isExtended()) {
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(current.mat, new PotionData(current.data.getType(), true, false)));
}
return;
case LUCK:
case MUNDANE:
case THICK:
case UNCRAFTABLE:
assert (!current.data.isExtended());
assert (!current.data.isUpgraded());
return;
default:
assert (false);
break;
}
}
private static void populateCustomPotions(Map<WriteablePotion, Map<Ingredient, WriteablePotion>> mcMMOPotions) {
for (Material material : new Material[]{Material.POTION, Material.SPLASH_POTION, Material.LINGERING_POTION}) {
WriteablePotion data;
double mod = 1;
if (material == Material.SPLASH_POTION) {
mod = 0.75;
}
if (material == Material.LINGERING_POTION) {
mod = 0.25;
}
HashMap<Ingredient, WriteablePotion> children;
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.CONFUSION, (int) (450 * mod), 0), "NAUSEA");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.FAST_DIGGING, (int) (3600 * mod), 0), "HASTE");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SLOW_DIGGING, (int) (3600 * mod), 0), "DULLNESS");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE, (int) (450 * mod), 0), "RESISTANCE");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.BLINDNESS, (int) (225 * mod), 0), "BLINDNESS");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HUNGER, (int) (900 * mod), 0), "HUNGER");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.WITHER, (int) (450 * mod), 0), "DECAY");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.ABSORPTION, (int) (1800 * mod), 0), "ABSORPTION");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.SATURATION, (int) (8 * mod), 0), "SATURATION");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
data = new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(PotionEffectType.HEALTH_BOOST, (int) (1800 * mod), 0), "HEALTH_BOOST");
children = new HashMap<>();
children.put(new Ingredient(Material.GLOWSTONE_DUST), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() / 2, 1), data.baseName + "_II"));
children.put(new Ingredient(Material.REDSTONE), new WriteablePotion(material, PotionType.UNCRAFTABLE, new PotionEffect(data.effect.getType(), data.effect.getDuration() * 2, 0), data.baseName + "_EXTENDED"));
for (WriteablePotion child : children.values()) {
mcMMOPotions.put(child, new HashMap<>());
}
mcMMOPotions.put(data, children);
}
// Add all material state changes
for (Entry<WriteablePotion, Map<Ingredient, WriteablePotion>> entry : mcMMOPotions.entrySet()) {
if (entry.getKey().mat == Material.POTION) {
PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.75), entry.getKey().effect.getAmplifier());
entry.getValue().put(new Ingredient(Material.GUNPOWDER), new WriteablePotion(Material.SPLASH_POTION, entry.getKey().data, effect, entry.getKey().baseName));
} else if (entry.getKey().mat == Material.SPLASH_POTION) {
PotionEffect effect = new PotionEffect(entry.getKey().effect.getType(), (int) (entry.getKey().effect.getDuration() * 0.33), entry.getKey().effect.getAmplifier());
entry.getValue().put(new Ingredient(Material.DRAGON_BREATH), new WriteablePotion(Material.LINGERING_POTION, entry.getKey().data, effect, entry.getKey().baseName));
}
}
}
public static class Ingredient {
public Material mat;
public int data;
public String name;
public Ingredient(Material mat) {
this.mat = mat;
this.data = 0;
name = mat.name();
}
}
public static class WriteablePotion {
public String name;
public Material mat;
public PotionData data;
public PotionEffect effect;
public String baseName;
public WriteablePotion(PotionData data) {
this(Material.POTION, data);
}
public WriteablePotion(Material type, PotionData data) {
this(type, data, null, getMCName(data.getType()));
}
public WriteablePotion(Material mat, PotionType type, PotionEffect effect, String baseName) {
this(mat, new PotionData(type, false, false), effect, baseName);
}
public WriteablePotion(Material type, PotionData data, PotionEffect effect, String baseName) {
this.data = data;
this.effect = effect;
this.mat = type;
this.baseName = baseName;
this.name = "POTION_OF_" + baseName;
if (mat == Material.SPLASH_POTION) {
this.name = "SPLASH_" + this.name;
}
if (mat == Material.LINGERING_POTION) {
this.name = "LINGERING_" + this.name;
}
if (data.isExtended()) {
this.name += "_EXTENDED";
}
if (data.isUpgraded()) {
this.name += "_II";
}
}
public WriteablePotion(PotionType type) {
this(new PotionData(type, false, false));
}
public WriteablePotion(Material mat, PotionType type) {
this(mat, new PotionData(type, false, false));
}
private static String getMCName(PotionType type) {
switch (type) {
case INSTANT_DAMAGE:
return "HARMING";
case INSTANT_HEAL:
return "HEALING";
case JUMP:
return "LEAPING";
case REGEN:
return "REGENERATION";
case SPEED:
return "SWIFTNESS";
case UNCRAFTABLE:
return "EMPTY";
case LUCK:
case MUNDANE:
case NIGHT_VISION:
case POISON:
case INVISIBILITY:
case SLOWNESS:
case AWKWARD:
case STRENGTH:
case THICK:
case FIRE_RESISTANCE:
case WATER:
case WATER_BREATHING:
case WEAKNESS:
case TURTLE_MASTER:
case SLOW_FALLING:
return type.name();
default:
return "";
}
}
public int hashCode() {
return name.hashCode();
}
public boolean equals(Object obj) {
if (!(obj instanceof WriteablePotion)) {
return false;
}
return name.equals(((WriteablePotion) obj).name);
}
}
}

View File

@@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: com.gmail.nossr50.mcMMO

View File

@@ -1,9 +0,0 @@
#
# This file includes a few settings for each skill in mcMMO
#Acrobatics
Acrobatics:
# turn this to false to disable all subskills for this skill
Enabled: true
Roll:
Enabled: true

View File

@@ -1,440 +0,0 @@
#
# Experience configuration
# Last updated on ${project.version}-b${BUILD_NUMBER}
#
# Configure the experience formula and experience settings here.
#
#####
# https://hub.spigotmc.org/javadocs/spigot/org/bukkit/boss/BarColor.html
# These are the only valid colors for Experience Bars, use the exact name found here
# BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW (As of the time of this update these are the only Bar colors available, this could change in the future so check the BarColor enum to see if it has)
# BarStyle Settings (USE THE EXACT NAME) :
#SEGMENTED_10
# Splits the boss bar into 10 segments
#SEGMENTED_12
# Splits the boss bar into 12 segments
#SEGMENTED_20
# Splits the boss bar into 20 segments
#SEGMENTED_6
# Splits the boss bar into 6 segments
#SOLID
# The bar is one solid piece
ExploitFix:
EndermanEndermiteFarms: true
Experience_Bars:
# Turn this to false if you wanna disable XP bars
Enable: true
Update:
# XP that you gained from your party but not yourself
Party: true
# Passive is stuff like smelting, brewing
Passive: true
# If you want to use a fancy edited title from the locale, then you'll probably want to turn this on, but it will make your server do a lot more work!
# I recommend leaving this off!
ThisMayCauseLag:
AlwaysUpdateTitlesWhenXPIsGained:
Enable: false
# You can make your own custom details in the locale file without having to use the ExtraDetails setting!
ExtraDetails: false
Acrobatics:
Enable: true
Color: PINK
BarStyle: SEGMENTED_6
Alchemy:
Enable: true
Color: PURPLE
BarStyle: SEGMENTED_6
Archery:
Enable: true
Color: BLUE
BarStyle: SEGMENTED_6
Axes:
Enable: true
Color: BLUE
BarStyle: SEGMENTED_6
Excavation:
Enable: true
Color: YELLOW
BarStyle: SEGMENTED_6
Fishing:
Enable: true
Color: PURPLE
BarStyle: SEGMENTED_6
Herbalism:
Enable: true
Color: GREEN
BarStyle: SEGMENTED_6
Mining:
Enable: true
Color: YELLOW
BarStyle: SEGMENTED_6
Repair:
Enable: true
Color: PURPLE
BarStyle: SEGMENTED_6
Salvage:
Enable: true
Color: PURPLE
BarStyle: SEGMENTED_6
Smelting:
Enable: true
Color: PURPLE
BarStyle: SEGMENTED_6
Swords:
Enable: true
Color: BLUE
BarStyle: SEGMENTED_6
Taming:
Enable: true
Color: RED
BarStyle: SEGMENTED_6
Unarmed:
Enable: true
Color: BLUE
BarStyle: SEGMENTED_6
Woodcutting:
Enable: true
Color: GREEN
BarStyle: SEGMENTED_6
#
# Settings for XP formula
###
Experience_Formula:
# Valid values are: LINEAR and EXPONENTIAL
# If an invalid value is entered, this will reset to the default setting, which is LINEAR
# LINEAR: base + (level * multiplier)
# EXPONENTIAL: multiplier * level ^ exponent + base
Curve: LINEAR
# If invalid values are entered mcMMO will not start and print an error in the console
Linear_Values:
base: 1020
multiplier: 20
Exponential_Values:
multiplier: 0.1
exponent: 1.80
base: 2000
# Cumulative experience curves will use a players power level instead of their skill level,
# players with high power levels will have to gain a lot more experience to reach the next level in every skill.
Cumulative_Curve: false
# Experience gained in every skill will get multiplied by this value. 1.0 by default, 2.0 means two times as much
Multiplier:
Global: 1.0
PVP: 1.0
# Experience gained from mobs not naturally spawned will get multiplied by this value. 0 by default.
Mobspawners:
Multiplier: 0
Breeding:
Multiplier: 1.0
# Experience gained will get divided by these values. 1.0 by default, 2.0 means two times less XP gained.
Modifier:
Swords: 1.0
Taming: 1.0
Acrobatics: 1.0
Excavation: 1.0
Herbalism: 1.0
Unarmed: 1.0
Woodcutting: 1.0
Mining: 1.0
Archery: 1.0
Axes: 1.0
Repair: 1.0
Fishing: 1.0
Alchemy: 1.0
# XP earned by players with the permission mcmmo.perks.xp.customboost.<skillname> will get multiplied
# with 1.25 by default, resulting in a 25% XP boost
Custom_XP_Perk:
Boost: 1.25
#
# Settings for Diminished Returns
###
Diminished_Returns:
#This is the minimum amount of XP a player will earn after reaching the timed threshold (this is to prevent punishing a player too hard for earning XP)
## A value of 1 would mean that a player gets FULL XP, which defeats the purpose of diminished returns, the default value is 0.05 (5% minimum XP)
### Set this value to 0 to turn it off
Guaranteed_Minimum_Percentage: 0.05
Enabled: false
# Limit the amount of experience a player can earn:
# Threshold (amount of experience) per Time_Interval (in minutes)
Threshold:
Swords: 20000
Taming: 20000
Acrobatics: 20000
Excavation: 20000
Herbalism: 20000
Unarmed: 20000
Woodcutting: 20000
Mining: 20000
Archery: 20000
Axes: 20000
Repair: 20000
Fishing: 20000
Alchemy: 20000
Time_Interval: 10
#
# Settings for XP conversion with '/mcconvert experience'
###
Conversion:
# Old experience will get divided by this modifier
Exp_Modifier: 1
#
# Settings for XP distribution
###
Experience:
PVP:
Rewards: true
Acrobatics:
Dodge: 120
Roll: 80
Fall: 120
# FeatherFall_Multiplier: Multiply Acrobatics XP by this value when wearing boots with the Feather Fall enchant
FeatherFall_Multiplier: 2.0
Alchemy:
# Alchemy potion stages are based on the number of ingredients added
# Potion_Stage_1 represents a base potion
# Potion_Stage_2 represents a base potion with one ingredient
# Potion_Stage_3 represents a base potion with one ingredient and one amplifier
# Potion_Stage_4 represents a base potion with one ingredient and two amplifiers
# Potion_Stage_5 represents a base potion with one ingredient where the amplifiers are swapped
Potion_Stage_1: 15
Potion_Stage_2: 30
Potion_Stage_3: 60
Potion_Stage_4: 120
Potion_Stage_5: 0
Archery:
Distance_Multiplier: 0.025
Fishing:
Cod: 100
Salmon: 600
Tropical_Fish: 10000
Pufferfish: 2400
Shake: 50
Excavation:
Clay: 40
Dirt: 40
Coarse_Dirt: 40
Podzol: 40
Grass_Block: 40
Gravel: 40
Mycelium: 40
Sand: 40
Red_Sand: 40
Snow: 20
Snow_Block: 40
Soul_Sand: 40
Woodcutting:
Oak_Log: 70
Spruce_Log: 80
Birch_Log: 90
Jungle_Log: 100
Acacia_Log: 90
Dark_Oak_Log: 90
Stripped_Oak_Log: 70
Stripped_Spruce_Log: 80
Stripped_Birch_Log: 90
Stripped_Jungle_Log: 100
Stripped_Acacia_Log: 90
Stripped_Dark_Oak_Log: 90
Oak_Wood: 70
Spruce_Wood: 70
Birch_Wood: 70
Jungle_Wood: 70
Acacia_Wood: 70
Dark_Oak_Wood: 70
Mycelium: 70
Red_Mushroom_Block: 70
Brown_Mushroom_Block: 70
Mushroom_Stem: 80
Herbalism:
Tube_Coral_Fan: 80
Brain_Coral: 90
Bubble_Coral: 75
Fire_Coral: 120
Horn_Coral: 175
Dead_Tube_Coral: 30
Dead_Brain_Coral: 30
Dead_Bubble_Coral: 30
Dead_Fire_Coral: 30
Dead_Horn_Coral: 30
Allium: 300
Azure_Bluet: 150
Beetroots_Ripe: 50
Blue_Orchid: 150
Brown_Mushroom: 150
Cactus: 30
Carrots_Ripe: 50
Chorus_Flower_Ripe: 25
Chorus_Plant: 1
Cocoa_Ripe: 30
Wheat_Ripe: 50
Dead_Bush: 30
Lilac: 50
Melon: 20
Nether_Wart_Ripe: 50
Orange_Tulip: 150
Oxeye_Daisy: 150
Peony: 50
Pink_Tulip: 150
Poppy: 100
Potatoes_Ripe: 50
Pumpkin: 20
Red_Mushroom: 150
Red_Tulip: 150
Rose_Bush: 50
Fern: 10
Grass: 10
Sugar_Cane: 30
Sunflower: 50
Tall_Grass: 50
Large_Fern: 50
Vine: 10
Lily_Pad: 100
White_Tulip: 150
Dandelion: 100
Mining:
Tube_Coral_Block: 75
Brain_Coral_Block: 80
Bubble_Coral_Block: 70
Fire_Coral_Block: 90
Horn_Coral_Block: 125
Coal_Ore: 100
Diamond_Ore: 750
Emerald_Ore: 1000
End_Bricks: 200
Nether_Brick: 50
End_Stone: 30
Glowstone: 30
Gold_Ore: 350
Terracotta: 30
Iron_Ore: 250
Lapis_Ore: 400
Mossy_Cobblestone: 30
Netherrack: 30
Obsidian: 150
Packed_Ice: 50
Blue_Ice: 100
Nether_Quartz_Ore: 100
Redstone_Ore: 150
Sandstone: 30
Black_Terracotta: 50
Blue_Terracotta: 50
Brown_Terracotta: 50
Cyan_Terracotta: 50
Gray_Terracotta: 50
Green_Terracotta: 50
Light_Blue_Terracotta: 50
Light_Gray_Terracotta: 50
Lime_Terracotta: 50
Magenta_Terracotta: 50
Orange_Terracotta: 50
Pink_Terracotta: 50
Purple_Terracotta: 50
Red_Terracotta: 50
White_Terracotta: 50
Yellow_Terracotta: 50
Stone: 30
Granite: 30
Andesite: 30
Diorite: 30
Red_Sandstone: 100
Prismarine: 70
Purpur_Block: 200
Purpur_Pillar: 250
Purpur_Slab: 150
Purpur_Stairs: 250
Repair:
Base: 1000.0
Wood: 0.6
Stone: 1.3
Iron: 2.5
Gold: 0.3
Diamond: 5.0
Leather: 1.6
String: 1.8
Other: 1.5
Smelting:
Coal_Ore: 10
Diamond_Ore: 75
Emerald_Ore: 100
Gold_Ore: 35
Iron_Ore: 25
Lapis_Ore: 40
Nether_Quartz_Ore: 25
Redstone_Ore: 15
Taming:
Animal_Taming:
Wolf: 250
Ocelot: 500
Horse: 1000
Donkey: 1000
Mule: 1000
Skeleton_Horse: 1000
Zombie_Horse: 1000
Combat:
Multiplier:
Animals: 1.0
Creeper: 4.0
Skeleton: 3.0
Spider: 2.0
Giant: 4.0
Zombie: 2.0
Slime: 2.0
Ghast: 3.0
Pig_Zombie: 3.0
Enderman: 1.0
Cave_Spider: 3.0
Silverfish: 3.0
Blaze: 3.0
Magma_Cube: 2.0
Ender_Dragon: 1.0
Wither: 1.0
Witch: 0.1
Iron_Golem: 2.0
Wither_Skeleton: 4.0
Endermite: 2.0
Guardian: 3.0
Elder_Guardian: 4.0
Shulker: 2.0
Donkey: 1.0
Mule: 1.0
Horse: 1.0
Zombie_Villager: 2.0
Skeleton_Horse: 1.0
Zombie_Horse: 1.2
Husk: 3.0
Evoker: 3.0
Polar_Bear: 2.0
Llama: 1.0
Vindicator: 3.0
Stray: 2.0
Rabbit: 1.0
Chicken: 1.0
Bat: 1.0
Mushroom_Cow: 1.2
Cow: 1.0
Turtle: 1.1
Sheep: 1.0
Pig: 1.0
Squid: 1.0
Ocelot: 1.0
Villager: 1.0
Snowman: 0.0
Parrot: 1.0
Illusioner: 3.0
Drowned: 1.0
Dolphin: 1.3
Phantom: 4.0

View File

@@ -1,96 +0,0 @@
#
# ItemStack Weights configuration
#
# This file is used to determine the value of an item. This will only
# happen when users are sharing items in a party using the EQUAL item share mode.
#
# Rare items should have a higher value than common items. If an item is not listed
# here, the value from "Default" will be used instead.
#
#####
Item_Weights:
Default: 5
Quartz: 200
Nether_Quartz_Ore: 200
Emerald: 150
Emerald_Ore: 150
Diamond: 100
Diamond_Ore: 100
Gold_Ingot: 50
Gold_Ore: 50
Iron_Ingot: 40
Iron_Ore: 40
Lapis_Ore: 30
Redstone: 30
Redstone_Ore: 30
Glowstone_Dust: 20
Coal: 10
Coal_Ore: 10
# ItemStack weights for armor and tools
Diamond_Sword: 150
Diamond_Shovel: 150
Diamond_Pickaxe: 150
Diamond_Axe: 150
Diamond_Helmet: 150
Diamond_Chestplate: 150
Diamond_Leggings: 150
Diamond_Boots: 150
Golden_Sword: 75
Golden_Shovel: 75
Golden_Pickaxe: 75
Golden_Axe: 75
Golden_Helmet: 75
Golden_Chestplate: 75
Golden_Leggings: 75
Golden_Boots: 75
Iron_Sword: 60
Iron_Shovel: 60
Iron_Pickaxe: 60
Iron_Axe: 60
Iron_Helmet: 60
Iron_Chestplate: 60
Iron_Leggings: 60
Iron_Boots: 60
# Items in this section will get added to the Misc share category.
# Case insensitive, though the name must be exactly the same as set in the Bukkit Material enum.
Party_Shareables:
Misc_Items:
- Diamond_Sword
- Diamond_Shovel
- Diamond_Pickaxe
- Diamond_Axe
- Golden_Sword
- Golden_Shovel
- Golden_Pickaxe
- Golden_Axe
- Iron_Sword
- Iron_Shovel
- Iron_Pickaxe
- Iron_Axe
- Stone_Sword
- Stone_Shovel
- Stone_Pickaxe
- Stone_Axe
- Wooden_Sword
- Wooden_Shovel
- Wooden_Pickaxe
- Wooden_Axe
- Bow
- Diamond_Helmet
- Diamond_Chestplate
- Diamond_Leggings
- Diamond_Boots
- Golden_Helmet
- Golden_Chestplate
- Golden_Leggings
- Golden_Boots
- Iron_Helmet
- Iron_Chestplate
- Iron_Leggings
- Iron_Boots
- Leather_Helmet
- Leather_Chestplate
- Leather_Leggings
- Leather_Boots

View File

@@ -1,467 +0,0 @@
Acrobatics.Ability.Proc=[[GREEN]]**Graceful Landing**
Acrobatics.Combat.Proc=[[GREEN]] **osgoi\'r**
Acrobatics.DodgeChance=Dodge Chance: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=Roll
Acrobatics.SubSkill.Roll.Description=Reduces or Negates fall damage
Acrobatics.SubSkill.GracefulRoll.Name=Graceful Roll
Acrobatics.SubSkill.GracefulRoll.Description=Twice as effective as a normal Roll
Acrobatics.SubSkill.Dodge.Name=Dodge
Acrobatics.SubSkill.Dodge.Description=Reduce attack damage by half
Acrobatics.Listener=Acrobateg
Acrobatics.SubSkill.Roll.Chance=Roll Chance: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=Graceful Roll Chance: [[YELLOW]]{0}
Acrobatics.Roll.Text=**Rolled**
Acrobatics.SkillName=ACROBATEG
Acrobatics.Skillup=Acrobateg sgil cynyddu {0}. Cyfanswm ({1})
Archery.Combat.DazeChance=Chance to Daze: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=Chance to Retrieve Arrows: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=Skill Shot Bonus Damage: [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=Skill Shot
Archery.SubSkill.SkillShot.Description=Increases damage done with bows
Archery.SubSkill.Daze.Name=Daze (Players)
Archery.SubSkill.ArrowRetrieval.Name=Arrow Retrieval
Archery.SubSkill.ArrowRetrieval.Description=Chance to retrieve arrows from corpses
Archery.Listener=Archery:
Archery.SkillName=ARCHERY
Archery.Skillup=sgiliau Saethyddiaeth cynyddu {0}. Cyfanswm ({1})
Axes.Ability.Bonus.0=Axe Mastery
Axes.Ability.Bonus.1=Bonus {0} damage
Axes.Ability.Bonus.2=Impact
Axes.Ability.Bonus.3=Deal {0} Bonus DMG to armor
Axes.Ability.Bonus.4=Greater Impact
Axes.Ability.Bonus.5=Deal {0} Bonus DMG to unarmored foes
Axes.Ability.Lower=[[GRAY]]**YOU LOWER YOUR AXE**
Axes.Ability.Ready=[[GREEN]]**YOU READY YOUR AXE**
Axes.Combat.CritStruck=[[DARK_RED]]You were CRITICALLY hit!
Axes.Combat.CritChance=Chance to critically strike: [[YELLOW]]{0}
Axes.Combat.CriticalHit=CRITICAL HIT!
Axes.Combat.GI.Proc=[[GREEN]]**STRUCK WITH GREAT FORCE**
Axes.Combat.GI.Struck=** ** BRIFO GAN EFFAITH FWYAF
Axes.Combat.SS.Length=Skull Splitter Length: [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=Skull Splitter
Axes.SubSkill.SkullSplitter.Description=Deal AoE Damage
Axes.SubSkill.CriticalStrikes.Name=Critical Strikes
Axes.SubSkill.CriticalStrikes.Description=Double Damage
Axes.SubSkill.AxeMastery.Name=Axe Mastery
Axes.SubSkill.AxeMastery.Description=Adds bonus DMG
Axes.SubSkill.ArmorImpact.Name=Impact
Axes.SubSkill.ArmorImpact.Description=Strike with enough force to shatter armor
Axes.SubSkill.GreaterImpact.Name=Greater Impact
Axes.SubSkill.GreaterImpact.Description=Deal bonus damage to unarmored foes
Axes.Listener=Axes:
Axes.SkillName=AXES
Axes.Skills.SS.Off=**Skull Splitter has worn off**
Axes.Skills.SS.On=actifadu Penglog Llorweddol
Axes.Skills.SS.Refresh=[[GREEN]] Eich [[YELLOW]] Penglog Llorweddol [[GREEN]] gallu ei hadnewyddu!
Axes.Skills.SS.Other.Off=Skull Splitter[[GREEN]] has worn off for [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]] {0} [[DARK_GREEN]] wedi defnyddio [[RED]] Llorweddol Benglog!
Axes.Skillup=sgiliau Echelau cynyddu {0}. Cyfanswm ({1})
Excavation.Ability.Lower=[[GRAY]]**YOU LOWER YOUR SHOVEL**
Excavation.Ability.Ready=[[GREEN]]**YOU READY YOUR SHOVEL**
Excavation.SubSkill.GigaDrillBreaker.Name=Giga Drill Breaker
Excavation.SubSkill.GigaDrillBreaker.Description=3x Drop Rate, 3x EXP, +Speed
Excavation.SubSkill.TreasureHunter.Name=Treasure Hunter
Excavation.SubSkill.TreasureHunter.Description=Ability to dig for treasure
Excavation.Effect.Length=Giga Drill Breaker Length: [[YELLOW]]{0}s
Excavation.Listener=Cloddio:
Excavation.SkillName=CLODDIO
Excavation.Skills.GigaDrillBreaker.Off=**Giga Drill Breaker has worn off**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA DRILL BREAKER ACTIVATED**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Your [[YELLOW]]Giga Drill Breaker [[GREEN]]ability is refreshed!
Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Drill Breaker[[GREEN]] has worn off for [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Giga Drill Breaker!
Excavation.Skillup=Excavation skill increased by {0}. Total ({1})
Fishing.Ability.Info=Magic Hunter: [[GRAY]] **Improves With Treasure Hunter Rank**
Fishing.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (SHAKE)
Fishing.Ability.Rank=Treasure Hunter Rank: [[YELLOW]]{0}/5
Fishing.Ability.TH.MagicRate=Magic Hunter Chance: [[YELLOW]]{0}
Fishing.Ability.Shake=Shake Chance: [[YELLOW]]{0}
Fishing.Ability.FD=Fisherman\'\'s Diet: [[YELLOW]]Rank {0}
Fishing.SubSkill.TreasureHunter.Name=Treasure Hunter (Passive)
Fishing.SubSkill.TreasureHunter.Description=Fish up misc. objects
Fishing.SubSkill.MagicHunter.Name=Magic Hunter
Fishing.SubSkill.MagicHunter.Description=Find Enchanted Items
Fishing.SubSkill.Shake.Name=Shake (vs. Entities)
Fishing.SubSkill.Shake.Description=Shake items off of mobs w/ fishing pole
Fishing.SubSkill.FishermansDiet.Name=Fisherman\'s Diet
Fishing.SubSkill.FishermansDiet.Description=Improves hunger restored from fished foods
Fishing.Chance.Raining=[[BLUE]] Rain Bonus
Fishing.Listener=Fishing:
Fishing.Ability.TH.MagicFound=[[GRAY]]You feel a touch of magic with this catch...
Fishing.SkillName=FISHING
Fishing.Skillup=Fishing skill increased by {0}. Total ({1})
Herbalism.Ability.DoubleDropChance=Double Drop Chance: [[YELLOW]]{0}
Herbalism.Ability.GTe.Length=Green Terra Length: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=You need more seeds to spread Green Terra.
Herbalism.Ability.GTh.Chance=Green Thumb Chance: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=**GREEN THUMB FAIL**
Herbalism.Ability.GTh.Stage=Green Thumb Stage: [[YELLOW]] Crops grow in stage {0}
Herbalism.Ability.GTh=[[GREEN]]**GREEN THUMB**
Herbalism.Ability.Lower=[[GRAY]]**YOU LOWER YOUR HOE**
Herbalism.Ability.Ready=[[GREEN]]**YOU READY YOUR HOE**
Herbalism.SubSkill.GreenTerra.Name=Green Terra
Herbalism.SubSkill.GreenTerra.Description=Spread the Terra, 3x Drops
Herbalism.SubSkill.GreenThumb.Name=Green Thumb (Wheat)
Herbalism.SubSkill.GreenThumb.Description=Auto-Plants crops when harvesting
Herbalism.SubSkill.GreenThumb.Description.2=Make bricks mossy, or make grass grow
Herbalism.SubSkill.FarmersDiet.Name=Farmer\'s Diet
Herbalism.SubSkill.FarmersDiet.Description=Improves hunger restored from farmed foods
Herbalism.SubSkill.DoubleDrops.Name=Double Drops (All Herbs)
Herbalism.SubSkill.DoubleDrops.Description=Double the normal loot
Herbalism.Listener=Meddygaeth lysieuol:
Herbalism.SkillName=HERBALISM
Herbalism.Skills.GTe.On=[[GREEN]]**GREEN TERRA ACTIVATED**
Herbalism.Skills.GTe.Refresh=[[GREEN]] Eich [[YELLOW]] Green Terra [[GREEN]] gallu ei hadnewyddu!
Herbalism.Skills.GTe.Other.Off=Green terra [[GREEN]] wedi gwisgo i ffwrdd ar gyfer [[YELLOW]] {0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Green Terra!
Herbalism.Skillup=Herbalism skill increased by {0}. Total ({1})
Mining.Ability.Length=Hyd Torri\'r Super: [[YELLOW]] {0} s
Mining.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (BLAST MINING)
Mining.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (BIGGER BOMBS)
Mining.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (DEMOLITIONS EXPERTISE)
Mining.Ability.Lower=[[GRAY]]You lower your Pickaxe.
Mining.Ability.Ready=[[GREEN]] ** CHI'N BAROD EICH PICKAXE **
Mining.SubSkill.SuperBreaker.Name=Super Breaker
Mining.SubSkill.SuperBreaker.Description=Speed+, Triple Drop Chance
Mining.SubSkill.DoubleDrops.Name=Double Drops
Mining.SubSkill.DoubleDrops.Description=Double the normal loot
Mining.SubSkill.BlastMining.Name=Blast Mining
Mining.SubSkill.BlastMining.Description=Bonuses to mining with TNT
Mining.SubSkill.BiggerBombs.Name=Bigger Bombs
Mining.SubSkill.BiggerBombs.Description=Increases TNT explosion radius
Mining.SubSkill.DemolitionsExpertise.Name=Demolitions Expertise
Mining.SubSkill.DemolitionsExpertise.Description=Decreases damage from TNT explosions
Mining.Effect.Decrease=Demolitions Expert Damage Decrease: [[YELLOW]]{0}
Mining.Effect.DropChance=Double Drop Chance: [[YELLOW]]{0}
Mining.Listener=Mwyngloddio:
Mining.SkillName=MINING
Mining.Skills.SuperBreaker.Off=**Super Breaker has worn off**
Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER BREAKER ACTIVATED**
Mining.Skills.SuperBreaker.Other.Off=Super Breaker[[GREEN]] has worn off for [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Super Breaker!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]] Eich [[YELLOW]] Super Torri\'r [[GREEN]] gallu ei hadnewyddu!
Mining.Skillup=sgiliau Mwyngloddio cynyddu {0}. Cyfanswm ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Radius.Increase=Chwyth Cynnydd Radiws [[YELLOW]] {0}
Mining.Blast.Rank=Blast Mining: [[YELLOW]] Rank {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Blast Mining!
Mining.Blast.Refresh=[[GREEN]] Eich [[YELLOW]] Mwyngloddio Chwyth [[GREEN]] gallu ei hadnewyddu!
Repair.SubSkill.Repair.Name=Repair
Repair.SubSkill.Repair.Description=Repair Tools & Armor
Repair.SubSkill.GoldRepair.Name=Gold Repair ({0}+ SKILL)
Repair.SubSkill.GoldRepair.Description=Repair Gold Tools & Armor
Repair.SubSkill.IronRepair.Name=Iron Repair ({0}+ SKILL)
Repair.SubSkill.IronRepair.Description=Repair Iron Tools & Armor
Repair.SubSkill.StoneRepair.Name=Stone Repair ({0}+ SKILL)
Repair.SubSkill.StoneRepair.Description=Repair Stone Tools
Repair.SubSkill.RepairMastery.Name=Repair Mastery
Repair.SubSkill.RepairMastery.Description=Increased repair amount
Repair.SubSkill.SuperRepair.Name=Super Repair
Repair.SubSkill.SuperRepair.Description=Double effectiveness
Repair.SubSkill.DiamondRepair.Name=Diamond Repair ({0}+ SKILL)
Repair.SubSkill.DiamondRepair.Description=Repair Diamond Tools & Armor
Repair.SubSkill.ArcaneForging.Name=Arcane Forging
Repair.SubSkill.ArcaneForging.Description=Atgyweiriwch eitemau sydd hud
Repair.SubSkill.Salvage.Name=Salvage ({0}+ SKILL)
Repair.SubSkill.Salvage.Description=Salvage Tools & Armor
Repair.Error=[[DARK_RED]]mcMMO encountered an error attempting to repair this item!
Repair.Listener.Anvil=[[DARK_RED]]You have placed an anvil, anvils can repair tools and armor.
Repair.Listener.Anvil2=[[DARK_RED]]You have placed a Salvage anvil, use this to Salvage tools and armor.
Repair.Listener=Atgyweirio:
Repair.SkillName=ATGYWEIRIO:
Repair.Skills.AdeptSalvage=[[DARK_RED]]You\'re not skilled enough to Salvage items.
Repair.Skills.AdeptDiamond=[[DARK_RED]] Dydych chi ddim yn ddigon medrus i drwsio Diemwnt.
Repair.Skills.AdeptGold=[[DARK RED]] Dydych chi ddim yn ddigon medrus i drwsio Aur.
Repair.Skills.AdeptIron=[[DARK_RED]]You\'re not skilled enough to repair Iron.
Repair.Skills.AdeptStone=[[DARK_RED]] Dydych chi ddim yn ddigon medrus i drwsio cerrig.
Repair.Skills.Adept=You must be level [[YELLOW]]{0}[[RED]] to repair [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]That felt easy.
Repair.Skills.FullDurability=[[GRAY]]That is at full durability.
Repair.Skills.SalvageSuccess=[[GRAY]]Item salvaged!
Repair.Skills.NotFullDurability=[[DARK_RED]]You can\'t salvage damaged items.
Repair.Skills.Mastery=Repair Mastery: [[YELLOW]]Extra {0} durability restored
Repair.Skills.StackedItems=[[DARK_RED]]You can\'t repair stacked items.
Repair.Skills.Super.Chance=Super Repair Chance: [[YELLOW]]{0}
Repair.Skillup=sgiliau Atgyweirio cynyddu {0}. Cyfanswm ({1})
Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Downgrade Chance: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]] Cyfradd Llwyddiant AF: [[YELLOW]] {0}%
Repair.Arcane.Downgrade=Arcane power has decreased for this item.
Repair.Arcane.Fail=P\u0175er dirgel wedi gadael yr eitem barhaol
Repair.Arcane.Lost=You were not skilled enough to keep any enchantments.
Repair.Arcane.Perfect=[[GREEN]]You have sustained the arcane energies in this item.
Repair.Arcane.Rank=Arcane Forging: [[YELLOW]]Rank {0}/4
Swords.Ability.Lower=[[GRAY]] ** I LEIHAU EICH CLEDDYF **
Swords.Ability.Ready=[[GREEN]] ** CHI\'N BAROD EICH SWORD **
Swords.Combat.Bleed.Chance=Bleed Chance: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=Bleed Length: [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 Tick happens every 2 seconds
Swords.Combat.Bleeding.Started=[[DARK_RED]] You\'re bleeding!
Swords.Combat.Bleeding.Stopped=[[GRAY]] y gwaedu wedi [[GREEN]] rhoi\'r gorau i [[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]** GELYN GWAEDU\'N**
Swords.Combat.Counter.Chance=Counter Attack Chance: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]Hit with a counter-attack!
Swords.Combat.Countered=[[GREEN]] ** GWRTH-YMOSOD **
Swords.Combat.SS.Struck=[[DARK_RED]] Taro gan Streiciau danheddog!
Swords.SubSkill.CounterAttack.Name=Counter Attack
Swords.SubSkill.SerratedStrikes.Name=Serrated Strikes
Swords.Effect.4=Serrated Strikes Bleed+
Swords.SubSkill.Bleed.Name=Bleed
Swords.SubSkill.Bleed.Description=Apply a bleed DoT
Swords.Listener=Swords:
Swords.SkillName=SWORDS
Swords.Skills.SS.Off=**Serrated Strikes has worn off**
Swords.Skills.SS.On=[[GREEN]] ** Streiciau danheddog actifadu **
Swords.Skills.SS.Refresh=[[GREEN]]Your [[YELLOW]]Serrated Strikes [[GREEN]]ability is refreshed!
Swords.Skills.SS.Other.Off=Streiciau danheddog [[GREEN]] wedi gwisgo i ffwrdd ar gyfer [[YELLOW]] {0}
Swords.Skills.SS.Other.On=[[GREEN]] {0} [[DARK_GREEN]] wedi defnyddio [[RED]] Streiciau danheddog!
Swords.Skillup=Swords skill increased by {0}. Total ({1})
Swords.SS.Length=Serrated Strikes Length: [[YELLOW]]{0}s
Taming.Ability.Bonus.0=Environmentally Aware
Taming.Ability.Bonus.1=Wolves avoid danger
Taming.Ability.Bonus.2=Ffwr Trwchus
Taming.Ability.Bonus.4=Shock Proof
Taming.Ability.Bonus.6=Sharpened Claws
Taming.Ability.Bonus.8=Fast Food Service
Taming.Ability.Bonus.9={0}% Chance for heal on attack
Taming.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (ENVIRONMENTALLY AWARE)
Taming.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (THICK FUR)
Taming.Ability.Locked.2=LOCKED UNTIL {0}+ SKILL (SHOCK PROOF)
Taming.Ability.Locked.3=LOCKED UNTIL {0}+ SKILL (SHARPENED CLAWS)
Taming.Ability.Locked.4=LOCKED UNTIL {0}+ SKILL (FAST FOOD SERVICE)
Taming.Combat.Chance.Gore=Gore Chance: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=Beast Lore
Taming.SubSkill.BeastLore.Description=Bone-whacking inspects wolves & ocelots
Taming.SubSkill.ShockProof.Name=Shock Proof
Taming.SubSkill.ShockProof.Description=Explosive Damage Reduction
Taming.SubSkill.CallOfTheWild.Name=Call of the Wild
Taming.SubSkill.CallOfTheWild.Description=Summon an animal to your side
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Crouch and left-click with {0} Fish in hand
Taming.Effect.15=[[GRAY]]COTW (Wolf): Crouch and left-click with {0} Bones in hand
Taming.SubSkill.FastFoodService.Name=Fast Food Service
Taming.SubSkill.FastFoodService.Description=Chance for wolves to heal on attack
Taming.SubSkill.Gore.Name=Gore
Taming.SubSkill.Gore.Description=Critical Strike that applies Bleed
Taming.SubSkill.SharpenedClaws.Name=Sharpened Claws
Taming.SubSkill.SharpenedClaws.Description=Damage Bonus
Taming.SubSkill.EnvironmentallyAware.Name=Environmentally Aware
Taming.SubSkill.EnvironmentallyAware.Description=Cactus/Lava Phobia, Fall DMG Immune
Taming.SubSkill.ThickFur.Name=Thick Fur
Taming.SubSkill.ThickFur.Description=DMG Reduction, Fire Resistance
Taming.Listener.Wolf=[[DARK_GRAY]] Eich sgrialu i blaidd yn \u00f4l i chi ...
Taming.Listener=Taming:
Taming.SkillName=TAMING
Taming.Skillup=sgiliau Ddofi cynyddu {0}.\u00a0Cyfanswm ({1})
Taming.Summon.Complete=[[GREEN]]Summoning complete
Taming.Summon.Fail.Ocelot=You have too many ocelots nearby to summon any more.
Taming.Summon.Fail.Wolf=You have too many wolves nearby to summon any more.
Unarmed.Ability.Berserk.Length=Berserk Length: [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=Iron Arm Style
Unarmed.Ability.Bonus.1=+{0} DMG Upgrade
Unarmed.Ability.Chance.ArrowDeflect=Saeth wyro cyfle: [[YELLOW]] {0}
Unarmed.Ability.Chance.Disarm=Disarm Chance: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=Your opponent has an iron grip!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Your iron grip kept you from being disarmed!
Unarmed.Ability.Lower=[[GRAY]]**YOU LOWER YOUR FISTS**
Unarmed.Ability.Ready=[[GREEN]]**YOU READY YOUR FISTS**
Unarmed.SubSkill.Berserk.Name=Berserk
Unarmed.SubSkill.Berserk.Description=+50% DMG, Breaks weak materials
Unarmed.SubSkill.Disarm.Name=Disarm (Players)
Unarmed.SubSkill.Disarm.Description=Drops the foes item held in hand
Unarmed.SubSkill.IronArmStyle.Name=Iron Arm Style
Unarmed.SubSkill.IronArmStyle.Description=Hardens your arm over time
Unarmed.SubSkill.ArrowDeflect.Name=Arrow Deflect
Unarmed.SubSkill.ArrowDeflect.Description=Deflect arrows
Unarmed.Listener=Dim Arfau:
Unarmed.SkillName=UNARMED
Unarmed.Skills.Berserk.Off=** arno\\\'i hun wedi gwisgo i ffwrdd **
Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIVATED**
Unarmed.Skills.Berserk.Other.Off=arno\'i hun [[GREEN]] wedi gwisgo i ffwrdd ar gyfer [[YELLOW]] {0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]] {0} [[DARK_GREEN]] wedi defnyddio [[RED]] arno\'i hun!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Your [[YELLOW]]Berserk [[GREEN]]ability is refreshed!
Unarmed.Skillup=Unarmed skill increased by {0}. Total ({1})
Woodcutting.Ability.0=Chwythwr o ddail
Woodcutting.Ability.1=Chwythu i ffwrdd yn gadael
Woodcutting.Ability.Chance.DDrop=Double Drop Chance: [[YELLOW]]{0}
Woodcutting.Ability.Length=Tree Feller Length: [[YELLOW]]{0}s
Woodcutting.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (LEAF BLOWER)
Woodcutting.SubSkill.TreeFeller.Name=Tree Feller
Woodcutting.SubSkill.TreeFeller.Description=Make trees explode
Woodcutting.SubSkill.LeafBlower.Name=Leaf Blower
Woodcutting.SubSkill.LeafBlower.Description=Blow Away Leaves
Woodcutting.SubSkill.HarvestLumber.Name=Double Drops
Woodcutting.SubSkill.HarvestLumber.Description=Double the normal loot
Woodcutting.Listener=Woodcutting:
Woodcutting.SkillName=Torri coed
Woodcutting.Skills.TreeFeller.Off=**Tree Feller has worn off**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TREE FELLER ACTIVATED**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]] Eich [[YELLOW]] Feller Coed [[GREEN]] gallu ei hadnewyddu!
Woodcutting.Skills.TreeFeller.Other.Off=Feller Coed [[GREEN]] wedi gwisgo i ffwrdd ar gyfer [[YELLOW]] {0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] has used [[RED]]Tree Feller!
Woodcutting.Skills.TreeFeller.Splinter=EICH AXE GWAHANU I DDWSINAU O DARNAU!
Woodcutting.Skills.TreeFeller.Threshold=That tree is too large!
Woodcutting.Skillup=Woodcutting skill increased by {0}. Total ({1})
Ability.Generic.Refresh=[[GREEN]]**ABILITIES REFRESHED!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
Combat.ArrowDeflect=[[WHITE]]**ARROW DEFLECT**
Combat.BeastLore=[[GREEN]] ** bwystfil ll\u00ean **
Combat.BeastLoreHealth=[[DARK_AQUA]] Iechyd ([[GREEN]] {0} [[DARK_AQUA]] / {1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Owner ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**GORED**
Combat.StruckByGore=**YOU HAVE BEEN GORED**
Combat.TargetDazed=Target was [[DARK_RED]]Dazed
Combat.TouchedFuzzy=[[DARK_RED]] cyffwrdd Fuzzy. Teimlo benysgafn.
Commands.addlevels.AwardAll.1=[[GREEN]]You were awarded {0} levels in all skills!
Commands.addlevels.AwardAll.2=All skills have been modified for {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]You were awarded {0} levels in {1}!
Commands.addlevels.AwardSkill.2={0} has been modified for {1}.
Commands.addxp.AwardAll=[[GREEN]]You were awarded {0} experience in all skills!
Commands.addxp.AwardSkill=[[GREEN]]You were awarded {0} experience in {1}!
Commands.Ability.Off=Ability use toggled [[RED]]off
Commands.Ability.On=Ability use toggled [[GREEN]]on
Commands.AdminChat.Off=Admin Sgwrs unig [[RED]] Oddi ar
Commands.AdminChat.On=Admin Chat only [[GREEN]]On
Commands.AdminToggle=- sgwrs gweinyddol Toggle
Commands.Chat.Console=*Console*
Commands.Disabled=Mae\'r gorchymyn yn anabl.
Commands.DoesNotExist=nid Chwaraewr yn bodoli yn y gronfa ddata!
Commands.GodMode.Disabled=mcMMO Godmode Disabled
Commands.GodMode.Enabled=mcMMO Godmode Enabled
Commands.GodMode.Forbidden=[mcMMO] God Mode not permitted on this world (See Permissions)
Commands.Inspect=<player> [[RED]]- View detailed player info
Commands.Party.Invite.Accepted=[[GREEN]] Gwahodd Derbyniwyd. Yr ydych wedi ymuno parti {0}
Commands.Invite.Success=[[GREEN]]Invite sent successfully.
Commands.Leaderboards=<skill> <page> [[RED]]- Leaderboards
Commands.mcc.Header=---[][[YELLOW]]mcMMO Commands[[RED]][]---
Commands.mcgod=- Toggle GodMode
Commands.mchud.Invalid=That is not a valid HUD type.
Commands.mcpurge.Success=[[GREEN]]The database was successfully purged!
Commands.mcrank.Heading=[[GOLD]]-=PERSONAL RANKINGS=-
Commands.mcrank.Overall=Overall[[GREEN]] - [[GOLD]]Rank [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=TARGET: [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Rank [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]Unranked
Commands.mcremove.Success=[[GREEN]]{0} was successfully removed from the database!
Commands.mctop.Tip=[[GOLD]]Tip: Use [[RED]]/mcrank[[GOLD]] to view all of your personal rankings!
Commands.mmoedit=[chwaraewr] <skill> <newvalue> [[RED]] - Targed addasu
Commands.mmoedit.Modified.1=[[GREEN]]Your level in {0} was set to {1}!
Commands.mmoedit.Modified.2={0} has been modified for {1}.
Commands.ModDescription=- Read brief mod description
Commands.NoConsole=This command does not support console usage.
Commands.Other=[[GREEN]]--OTHER COMMANDS--
Commands.Party.Accept=- Accept party invite
Commands.Party.Chat.Off=Party Chat only [[RED]]Off
Commands.Party.Chat.On=Party Chat only [[GREEN]]On
Commands.Party.Commands=[[GREEN]]--PARTY COMMANDS--
Commands.Party.Invite.0=RHYBUDD: [[GREEN]] fod wedi derbyn gwahoddiad i barti {0} o {1}
Commands.Party.Kick=oeddech yn cicio o blaid {0}!
Commands.Party.Leave=Yr ydych wedi gadael y blaid honno
Commands.Party.None=You are not in a party.
Commands.Party.Quit=- Leave your current party
Commands.Party.Teleport=<player> [[RED]]- Teleport to party member
Commands.Party.Toggle=- Toggle Party Chat
Commands.PowerLevel.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Leaderboard--
Commands.PowerLevel=[[DARK_RED]]POWER LEVEL: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]All of your skill levels have been reset successfully.
Commands.Reset.Single=[[GREEN]]Your {0} skill level has been reset successfully.
Commands.Reset=Reset a skill\'s level to 0
Commands.Skill.Invalid=That is not a valid skillname!
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Leaderboard--
Commands.Stats.Self=YOUR STATS
Commands.Stats=- View your mcMMO stats
Commands.ToggleAbility=- Toggle ability activation with right click
Commands.Usage.1=Proper usage is /{0} {1}
Commands.Usage.2=Proper usage is /{0} {1} {2}
Commands.Usage.3=Proper usage is /{0} {1} {2} {3}
Commands.Usage.Level=level
Commands.Usage.Message=message
Commands.Usage.Page=page
Commands.Usage.Player=player
Commands.Usage.Skill=skill
Commands.Usage.XP=xp
mcMMO.NoInvites=You have no invites at this time
mcMMO.NoPermission=[[DARK_RED]]Insufficient permissions.
mcMMO.NoSkillNote=[[DARK_GRAY]]If you don\'t have access to a skill it will not be shown here.
Party.Forbidden=[mcMMO] Parties not permitted on this world (See Permissions)
Party.InvalidName=[[DARK_RED]]That is not a valid party name.
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 owner
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.Incorrect=Party password is incorrect.
Party.Password.Set=[[GREEN]] Blaid cyfrinair wedi ei osod i {0}
Party.Player.Invalid=Nid yw hynny\'n chwaraewr ddilys.
Party.Teleport.Dead=Ni allwch teleport y chwaraewr yn farw.
Party.Teleport.Player=[[GREEN]]You have teleported to {0}.
Party.Teleport.Self=You can\'t teleport to yourself!
Party.Teleport.Target=[[GREEN]] {0} wedi teleported i chi.
Party.Unlocked=[[GRAY]] Blaid yn cael ei gloi
Commands.XPGain.Acrobatics=Falling
Commands.XPGain.Archery=Attacking Monsters
Commands.XPGain.Axes=Attacking Monsters
Commands.XPGain.Excavation=Cloddio a dod o hyd i drysorau
Commands.XPGain.Fishing=Pysgota (Ewch ffigur!)
Commands.XPGain.Herbalism=Perlysiau cynaeafu
Commands.XPGain.Mining=Mwyngloddio Cerrig a Mwyn
Commands.XPGain.Repair=Repairing
Commands.XPGain.Swords=Angenfilod ymosod
Commands.XPGain.Taming=Anifeiliaid Taming, neu ymladd \u00e2\'ch bleiddiaid
Commands.XPGain.Unarmed=Attacking Monsters
Commands.XPGain.Woodcutting=Chopping down trees
Commands.XPGain=[[DARK_GRAY]] Cael Profiad: [[WHITE]] {0}
Commands.xplock.locked=[[GOLD]]Your XP BAR is now locked to {0}!
Commands.xplock.unlocked=[[GOLD]]Your XP BAR is now [[GREEN]]UNLOCKED[[GOLD]]!
Commands.xprate.modified=The XP RATE was modified to {0}
Commands.xprate.over=mcMMO XP Rate Event is OVER!!
Commands.xprate.proper.0=Proper usage to change the XP rate is /xprate <integer> <true/false>
Commands.xprate.proper.1=Proper usage to restore the XP rate to default is /xprate reset
Commands.xprate.proper.2=Please specify true or false to indicate if this is an xp event or not
Commands.xprate.started.0=[[GOLD]]XP EVENT FOR mcMMO HAS STARTED!
Commands.xprate.started.1=[[GOLD]]mcMMO XP RATE IS NOW {0}x!
XPRate.Event=[[GOLD]] mcMMO ar hyn o bryd mewn digwyddiad gyfradd XP! Gyfradd yn XP {0} x!
Effects.Effects=EFFEITHIAU
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Available=[[GRAY]]Guide for {0} available - type /{1} ? [page]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=-
Guides.Page.Invalid=Not a valid page number!
Guides.Usage=Usage is /{0} ? [page]
Inspect.Offline=You do not have permission to inspect offline players!
Inspect.OfflineStats=mcMMO Stats for Offline Player [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Stats for [[YELLOW]]{0}
Inspect.TooFar=You are too far away to inspect that player!
Item.ChimaeraWing.Fail=**CHIMAERA WING FAILED!**
Item.ChimaeraWing.Pass=**CHIMAERA ADAIN**
Item.Injured.Wait=You were injured recently and must wait to use this. [[YELLOW]]({0}s)
Skills.Disarmed=[[DARK_RED]] Rydych wedi cael eich diarfogi!
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]] y bydd angen mwy o [[GRAY]]{0}
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=Yr ydych yn rhy flinedig i ddefnyddio\'r gallu eto. [[YELLOW]]({0}s)
Stats.Header.Combat=[GOLD]] - = GWRTHSEFYLL SGILIAU = -
Stats.Header.Gathering=[[GOLD]] -= CASGLU SGILIAU = = -
Stats.Header.Misc=[[GOLD]]-=MISC SKILLS=-
Stats.Own.Stats=[[GREEN]][mcMMO] Ystadegau
Perks.XP.Name=Experience
Perks.XP.Desc=Receive {0}x XP.
Perks.Lucky.Name=Luck
Perks.Lucky.Desc=Gives {0} skills and abilities a 33.3% better chance to activate.
Perks.Lucky.Desc.Login=Gives certain skills and abilities a 33.3% better chance to activate.
Perks.Lucky.Bonus=[[GOLD]] ({0} with Lucky Perk)
Perks.Cooldowns.Name=Fast Recovery
Perks.Cooldowns.Desc=Cuts cooldown duration by {0}.
Perks.ActivationTime.Name=Endurance
Perks.ActivationTime.Desc=Increases ability activation time by {0} seconds.
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s with Endurance Perk)
MOTD.Donate=[[DARK_AQUA]]Donation Info:
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Skill Death Penalty: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Vampirism Stat Leech: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[mcMMO Perks]
MOTD.Version=[[GOLD]][mcMMO] Running version [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website
Skills.AbilityGateRequirementFail=
Smelting.SubSkill.UnderstandingTheArt.Name=

View File

@@ -1,466 +0,0 @@
Acrobatics.Ability.Proc=[[GREEN]]**Yndefuld Landing**
Acrobatics.Combat.Proc=[[GREEN]]**Undviget**
Acrobatics.DodgeChance=Afv\u00e6rgnings Chance: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=Rul
Acrobatics.SubSkill.Roll.Description=Reducerer eller omvender Fald skade
Acrobatics.SubSkill.GracefulRoll.Name=Yndefuldt Rul
Acrobatics.SubSkill.GracefulRoll.Description=Dobbelt s\u00e5 effektiv som en normal rulning
Acrobatics.SubSkill.Dodge.Name=Afv\u00e6rg
Acrobatics.SubSkill.Dodge.Description=Reducer angrebs skade med halvdelen
Acrobatics.Listener=Akrobatik:
Acrobatics.SubSkill.Roll.Chance=Rulle Chance: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=Yndefuldt Rul Chance: [[YELLOW]]{0}
Acrobatics.Roll.Text=**Rullede**
Acrobatics.SkillName=AKROBATIK
Acrobatics.Skillup=Akrobatik evne for\u00f8get med {0}. Total ({1})
Archery.Combat.DazeChance=Chance for at blive forvirret: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=Chance for at Genbruge Pile: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=Skyde Evne Bonus Skade: [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=Evne Skud
Archery.SubSkill.SkillShot.Description=For\u00f8ger skade for\u00e5rsaget med buer
Archery.SubSkill.Daze.Name=Lam (Spillere)
Archery.SubSkill.ArrowRetrieval.Name=Genbrug Pile
Archery.SubSkill.ArrowRetrieval.Description=Chance for at tage pile ud af lig
Archery.Listener=Bueskydning:
Archery.SkillName=BUESKYDNING
Archery.Skillup=Bueskydnings evne for\u00f8get med {0}. Total ({1})
Axes.Ability.Bonus.0=\u00d8kse Mestring
Axes.Ability.Bonus.1=Bonus {0} skade
Axes.Ability.Bonus.2=Rustnings Effekt
Axes.Ability.Bonus.3=P\u00e5f\u00f8r {0} Bonus Skade til rustning
Axes.Ability.Bonus.4=St\u00f8rre Slag
Axes.Ability.Bonus.5=P\u00e5f\u00f8r {0} Bonus Skade til ubev\u00e6bnede fjender
Axes.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIN \u00d8KSE**
Axes.Ability.Ready=[[GREEN]]**DU G\u00d8R DIN \u00d8KSE KLAR**
Axes.Combat.CritStruck=[[DARK_RED]]Du er blevet KRITISK ramt!
Axes.Combat.CritChance=Chance for at ramme kritisk: [[YELLOW]]{0}
Axes.Combat.CriticalHit=KRITISK SLAG!
Axes.Combat.GI.Proc=[[GREEN]]**RAMT AF STOR KRAFT**
Axes.Combat.GI.Struck=**RAMT AF ST\u00d8RRE SLAG**
Axes.Combat.SS.Length=Kranie Splitter L\u00e6ngde: [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=Kranie Splitter (Evne)
Axes.SubSkill.SkullSplitter.Description=For\u00e5rsag Omr\u00e5de Skade
Axes.SubSkill.CriticalStrikes.Name=Kritiske Slag
Axes.SubSkill.CriticalStrikes.Description=Fordoblet Skade
Axes.SubSkill.AxeMastery.Name=\u00d8kse Mestring
Axes.SubSkill.AxeMastery.Description=Tilf\u00f8jer bonus skade
Axes.SubSkill.ArmorImpact.Name=Rustnings Effekt
Axes.SubSkill.ArmorImpact.Description=Ram med nok kraft for at smadre rustningen
Axes.SubSkill.GreaterImpact.Name=St\u00f8rre Slag
Axes.SubSkill.GreaterImpact.Description=Giv bonus skade til ubev\u00e6bnede fjender
Axes.Listener=\u00d8kser:
Axes.SkillName=\u00d8KSER
Axes.Skills.SS.Off=**Berserker er aftaget**
Axes.Skills.SS.On=[[GREEN]]**Kranie Knuser AKTIVERET**
Axes.Skills.SS.Refresh=[[GREEN]]Din [[YELLOW]]Kranie Splitter [[GREEN]]evne er genindl\u00e6st!
Axes.Skills.SS.Other.Off=Kranie Knuser[[GREEN]] er aftaget i [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Kranie Splitter!
Axes.Skillup=\u00d8kse evner forbedret med {0}. Ialt ({1})
Excavation.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIN SKOVL**
Excavation.Ability.Ready=[[GREEN]]**DU G\u00d8R DIN SKOVL KLAR**
Excavation.SubSkill.GigaDrillBreaker.Name=Giga Borer (EVNE)
Excavation.SubSkill.GigaDrillBreaker.Description=3x Tabs ratio for blokke, 3x EXP, +Fart
Excavation.SubSkill.TreasureHunter.Name=Skatte J\u00e6ger
Excavation.SubSkill.TreasureHunter.Description=Evne til at grave efter skatte
Excavation.Effect.Length=Giga Borer L\u00e6ngde: [[YELLOW]]{0}s
Excavation.Listener=Udgravning:
Excavation.SkillName=UDVINDING
Excavation.Skills.GigaDrillBreaker.Off=**Giga Borer er aftaget**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**Super Bor AKTIVERET**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Din [[YELLOW]]Giga Borer [[GREEN]]evne er genindl\u00e6st!
Excavation.Skills.GigaDrillBreaker.Other.Off=Giga Borer[[GREEN]] er aftaget i [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Giga Borer!
Excavation.Skillup=Udgravningsevne for\u00f8get med {0}. Total ({1})
Fishing.Ability.Info=Magisk J\u00e6ger: [[GRAY]] **Forbedres med skattejagts ranken**
Fishing.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (RYST)
Fishing.Ability.Rank=Skatte J\u00e6ger Rank: [[YELLOW]]{0}/5
Fishing.Ability.TH.MagicRate=Magi J\u00e6ger Chance: [[YELLOW]]{0}
Fishing.Ability.Shake=Ryste Chance: [[YELLOW]]{0}
Fishing.Ability.FD=Fiskers Diet: [[YELLOW]]Rank {0}
Fishing.SubSkill.TreasureHunter.Name=Skatte J\u00e6ger (Passiv)
Fishing.SubSkill.TreasureHunter.Description=Fisk diverse objekter op.
Fishing.SubSkill.MagicHunter.Name=Magi J\u00e6ger
Fishing.SubSkill.MagicHunter.Description=Find Fortryllede Ting.
Fishing.SubSkill.Shake.Name=Ryst (Mod V\u00e6sner)
Fishing.SubSkill.Shake.Description=Ryst ting ud af monstre med en fiskestang
Fishing.SubSkill.FishermansDiet.Name=Fiskers Diet
Fishing.SubSkill.FishermansDiet.Description=Forbedrer Sult genoprettet af Fisked mad
Fishing.Chance.Raining=[[BLUE]] Regn Bonus
Fishing.Listener=Fiskeri:
Fishing.Ability.TH.MagicFound=[[GRAY]]Du f\u00f8ler et strejf a magi med denne fangst...
Fishing.SkillName=FISKER
Fishing.Skillup=Fisker evne for\u00f8get med {0}. Total ({1})
Herbalism.Ability.DoubleDropChance=2x Tabs Chance: [[YELLOW]]{0}
Herbalism.Ability.GTe.Length=Gr\u00f8n Terra L\u00e6ngde: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=Du mangler flere fr\u00f8 for at sprede Gr\u00f8n Terra.
Herbalism.Ability.GTh.Chance=Gr\u00f8nne Fingre Chance: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=**GR\u00d8NNE FINGRE MISLYKKEDES**
Herbalism.Ability.GTh.Stage=Gr\u00f8nne Fingre Stadie: [[YELLOW]] Planter gror i stadie {0}
Herbalism.Ability.GTh=[[GREEN]]**GR\u00d8NNE FINGRE**
Herbalism.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIt LUGEJERN**
Herbalism.Ability.Ready=[[GREEN]]**DU G\u00d8R DIT LUGEJERN KLAR**
Herbalism.SubSkill.GreenTerra.Name=Gr\u00f8n Terra (EVNE)
Herbalism.SubSkill.GreenTerra.Description=Spred Terra, 3x Tab
Herbalism.SubSkill.GreenThumb.Name=Gr\u00f8nne Fingre (Hvede)
Herbalism.SubSkill.GreenThumb.Description=Auto-Planter afgr\u00f8der mens du h\u00f8ster
Herbalism.SubSkill.GreenThumb.Description.2=Lav Mursten Mossede, eller f\u00e5 gr\u00e6s til at gro
Herbalism.SubSkill.FarmersDiet.Name=Farmer\'s Diet
Herbalism.SubSkill.FarmersDiet.Description=Forbedrer Sult genoprettet af farmed mad
Herbalism.SubSkill.DoubleDrops.Name=Dobble tab (alle planter)
Herbalism.SubSkill.DoubleDrops.Description=G\u00f8r din normale udbytte dobblet s\u00e5 stort
Herbalism.Listener=Urtekundskab
Herbalism.SkillName=NATURMEDICIN
Herbalism.Skills.GTe.On=[[GREEN]]**GR\u00d8N TERRA AKTIVERET**
Herbalism.Skills.GTe.Refresh=[[GREEN]Din [[YELLOW]]Gr\u00f8nne Terra [[GREEN]]evne er genindl\u00e6st!
Herbalism.Skills.GTe.Other.Off=Gr\u00f8n Terra[[GREEN]] er aftaget i [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Gr\u00f8n Terra!
Herbalism.Skillup=Naturens Evne forbedret med {0}. Total ({1})
Mining.Ability.Length=Super \u00d8del\u00e6gger L\u00e6ngde: [[YELLOW]]{0}s
Mining.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (BLAST MINING)
Mining.Ability.Locked.1=L\u00c5ST INDTIL {0}+ EVNE (ST\u00d8RRE BOMBER)
Mining.Ability.Locked.2=L\u00c5ST INDTIL {0}+ EVNE (NEDRIVNINGS EXPERTISE)
Mining.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIN HAKKE**
Mining.Ability.Ready=[[GREEN]]**DU G\u00d8R DIN HAKKE KLAR**
Mining.SubSkill.SuperBreaker.Name=Super \u00d8del\u00e6gger (EVNE)
Mining.SubSkill.SuperBreaker.Description=Fart+, 3x Tabs chance
Mining.SubSkill.DoubleDrops.Name=Dobble Tab
Mining.SubSkill.DoubleDrops.Description=Fordobble det normale udbytte
Mining.SubSkill.BlastMining.Name=Blast Mining
Mining.SubSkill.BlastMining.Description=Bonuser for at mine med TNT
Mining.SubSkill.BiggerBombs.Name=St\u00f8rre Bomber
Mining.SubSkill.BiggerBombs.Description=Forbedrer TNT explosions radius
Mining.SubSkill.DemolitionsExpertise.Name=Nedrivnings Expertise
Mining.SubSkill.DemolitionsExpertise.Description=Formindsker skade fra TNT explotioner
Mining.Effect.Decrease=Nedrivingings Expert Skade neds\u00e6ttelse: [[YELLOW]]{0}
Mining.Effect.DropChance=2x Tabs Chance: [[YELLOW]]{0}
Mining.Listener=Minedrift:
Mining.SkillName=MINER
Mining.Skills.SuperBreaker.Off=**Super \u00d8del\u00e6gger er aftaget**
Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER \u00d8DEL\u00c6GGER AKTIVERET**
Mining.Skills.SuperBreaker.Other.Off=Super \u00d8del\u00e6gger[[GREEN]] er aftaget i [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Super \u00d8del\u00e6gger!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Din [[YELLOW]]Super Smadrer [[GREEN]]evne er genindl\u00e6st!
Mining.Skillup=Minedriftsevne for\u00f8get med {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Radius.Increase=Eksplosions Radius For\u00f8gelse: [[YELLOW]]+{0}
Mining.Blast.Rank=Blast Mining: [[YELLOW]] Rank {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] her brugt [[RED]]Blast Mining!
Mining.Blast.Refresh=[[GREEN]]Din [[YELLOW]]Spring Mining [[GREEN]]evne er genindl\u00e6st!
Repair.SubSkill.Repair.Name=Reparer
Repair.SubSkill.Repair.Description=Reparer V\u00e6rkt\u00f8jer & Rustning
Repair.SubSkill.GoldRepair.Name=Guld Reparer ({0}+ EVNE)
Repair.SubSkill.GoldRepair.Description=Reparer Guld V\u00e6rkt\u00f8jer & Rustning
Repair.SubSkill.IronRepair.Name=Jern Reparer ({0}+ EVNE)
Repair.SubSkill.IronRepair.Description=Reparer Jern V\u00e6rkt\u00f8jer & Rustning
Repair.SubSkill.StoneRepair.Name=Sten Reparer ({0}+ EVNE)
Repair.SubSkill.StoneRepair.Description=Reparer Sten V\u00e6rkt\u00f8jer
Repair.SubSkill.RepairMastery.Name=Reperations Beherskelse
Repair.SubSkill.RepairMastery.Description=For\u00f8get reperations m\u00e6ngde
Repair.SubSkill.SuperRepair.Name=Super Reparering
Repair.SubSkill.SuperRepair.Description=Dobble effektivitet
Repair.SubSkill.DiamondRepair.Name=Diamant reperation ({0}+ SKILL)
Repair.SubSkill.DiamondRepair.Description=Reparer Diamant V\u00e6rkt\u00f8jer & udstyr
Repair.SubSkill.ArcaneForging.Name=Mystisk Smedning
Repair.SubSkill.ArcaneForging.Description=Reparer magiske genstande
Repair.SubSkill.Salvage.Name=Genbrug ({0}+ EVNE)
Repair.SubSkill.Salvage.Description=Genbrugelige V\u00e6rkt\u00f8jer og Rustninger
Repair.Error=[[DARK_RED]]mcMMO m\u00f8dte en fejl mens den fors\u00f8gte at reparere dette objekt!
Repair.Listener.Anvil=[[DARK_RED]]Du har placeret en armbolt, armbolte kan reparere v\u00e6rkt\u00f8j og rustning.
Repair.Listener.Anvil2=[[DARK_RED]]Du har placeret en Genbrugs Ambolt, Brug den til at Genbruge V\u00e6rkt\u00f8jer og Rustning (F\u00e5 materialer tilbage)
Repair.Listener=Reparer:
Repair.SkillName=REPARER
Repair.Skills.AdeptSalvage=[[DARK_RED]] Du har ikke Evner nok til at bruge Genbrug p\u00e5 Objekter.
Repair.Skills.AdeptDiamond=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere diamant.
Repair.Skills.AdeptGold=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere guld.
Repair.Skills.AdeptIron=[[DARK_RED]]Du har ikke evner nok til at reparere Jern.
Repair.Skills.AdeptStone=[[DARK_RED]]Du er ikke kvalificeret nok til at reparere sten.
Repair.Skills.Adept=Du skal v\u00e6re level [[YELLOW]]{0}[[RED]] for at reparere [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]Det var nemt.
Repair.Skills.FullDurability=[[GRAY]]Det er p\u00e5 fuld holdbarhed
Repair.Skills.SalvageSuccess=[[GRAY]]Genstand genbrugt!
Repair.Skills.NotFullDurability=[[DARK_RED]]Du kan ikke genbruge \u00f8delagte v\u00e6rkt\u00f8jer og rustninger.
Repair.Skills.Mastery=Reperations Beherskelse: [[YELLOW]]Extra {0} Modstand gendannet
Repair.Skills.StackedItems=[[DARK_RED]]Du kan ikke reparere ting i stabler.
Repair.Skills.Super.Chance=Super Reparerings Chance: [[YELLOW]]{0}
Repair.Skillup=Reperations skill forbedret med {0}. Total ({1})
Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Degraderings Chance: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]AF Success Ratio: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=Magisk magt er nedsat for dette objekt.
Repair.Arcane.Fail=Magisk energi har forladt genstanden for altid.
Repair.Arcane.Lost=Du har ikke evner nok til at beholde nogle fortryllelser.
Repair.Arcane.Perfect=[[GREEN]]Du har vedligeholdt de magiske energier i dette objekt.
Repair.Arcane.Rank=Magisk Smedning: [[YELLOW]]Rank {0}/4
Swords.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DIT SV\u00c6RD**
Swords.Ability.Ready=[[GREEN]]**DU HAR FORBEREDT DIT SV\u00c6RD**
Swords.Combat.Bleed.Chance=Bl\u00f8de Chance: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=Bl\u00f8dnings L\u00e6ngde: [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]NOTER: [[YELLOW]]1 Tick sker hver 2 sekund
Swords.Combat.Bleeding.Started=[[DARK_RED]] Du Bl\u00f8der!
Swords.Combat.Bleeding.Stopped=[[GRAY]]Bl\u00f8dningen er [[GREEN]]stoppet[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**MODSTANDEREN BL\u00d8DER**
Swords.Combat.Counter.Chance=Modangrebs Chance: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]Angrib med et modangreb!
Swords.Combat.Countered=[[GREEN]]**MODANGREBET**
Swords.Combat.SS.Struck=[[DARK_RED]]Ramt af F\u00e6gtekunstens S\u00e5r!
Swords.SubSkill.CounterAttack.Name=Modangreb
Swords.SubSkill.SerratedStrikes.Name=F\u00e6gteKunst (Evne)
Swords.Effect.4=F\u00e6gteKunst Bl\u00f8dning+
Swords.SubSkill.Bleed.Name=Bl\u00f8de
Swords.SubSkill.Bleed.Description=S\u00e6t en Bl\u00f8dning med skade over tid (DoT=Skade over tid)
Swords.Listener=Sv\u00e6rd:
Swords.SkillName=SV\u00c6RD
Swords.Skills.SS.Off=**Fokuseret F\u00e6gtekunst er aftaget**
Swords.Skills.SS.On=[[GREEN]]**F\u00c6GTEKUNST AKTIVERET**
Swords.Skills.SS.Refresh=[[GREEN]]Din [[YELLOW]]F\u00e6gtekunst [[GREEN]]evne er genindl\u00e6st!
Swords.Skills.SS.Other.Off=F\u00e6gtekunst[[GREEN]] er aftaget i [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]F\u00c6GTEKUNST!
Swords.Skillup=Sv\u00e6rd evne for\u00f8get med {0}. Total ({1})
Swords.SS.Length=F\u00e6gtekunstens L\u00e6ngde: [[YELLOW]]{0}s
Taming.Ability.Bonus.0=Omgivelses bevidst
Taming.Ability.Bonus.1=Ulve undviger fare
Taming.Ability.Bonus.2=Tyk Pels
Taming.Ability.Bonus.4=Shock Sikker
Taming.Ability.Bonus.6=Sk\u00e6rpet Kl\u00f8er
Taming.Ability.Bonus.8=Fast Food Service
Taming.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (OMGIVELSES BEVIDST)
Taming.Ability.Locked.1=L\u00c5ST INDTIL {0}+ EVNE (TYK PELS)
Taming.Ability.Locked.2=L\u00c5ST INDTIL {0}+ EVNE (SHOCK SIKKER)
Taming.Ability.Locked.3=L\u00c5ST INDTIL {0}+ EVNE (SK\u00c6RPEDE KL\u00d8ER)
Taming.Ability.Locked.4=L\u00c5ST INDTIL {0}+ EVNE (FAST FOOD SERVICE)
Taming.Combat.Chance.Gore=Spidnings Chance: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=[[GREEN]]**TIGGENDE MONSTER**
Taming.SubSkill.BeastLore.Description=Sl\u00e5 p\u00e5 Ulve & Ocelotter med en Knogle for at incpicere dem.
Taming.SubSkill.ShockProof.Name=Shock Sikker
Taming.SubSkill.ShockProof.Description=Explosiv Skades Reduktion
Taming.SubSkill.CallOfTheWild.Name=Kaldet fra Naturen.
Taming.SubSkill.CallOfTheWild.Description=Lav et dyr ved din side
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Crouch og venstre-click med {0} en Fisk i h\u00e5nden
Taming.Effect.15=[[GRAY]]COTW (Wolf): Crouch og venstre-click med {0} Knogler i din h\u00e5nd.
Taming.SubSkill.FastFoodService.Name=Fast Food Service
Taming.SubSkill.FastFoodService.Description=Chance for Ulve liver op n\u00e5r de angriber
Taming.SubSkill.Gore.Name=M\u00e5l Punkt.
Taming.SubSkill.Gore.Description=Kritisk slag some f\u00e5r dig til at Bl\u00f8de
Taming.SubSkill.SharpenedClaws.Name=Sk\u00e6rpet Kl\u00f8er
Taming.SubSkill.SharpenedClaws.Description=Skade Bonus
Taming.SubSkill.EnvironmentallyAware.Name=Omgivelses bevidst
Taming.SubSkill.EnvironmentallyAware.Description=Kaktus/Lava Phobi, Immun mod Fald Skade
Taming.SubSkill.ThickFur.Name=Tyk Pels
Taming.SubSkill.ThickFur.Description=Skades Reduktion, Ild Modstand
Taming.Listener.Wolf=[[DARK_GRAY]]Din ulv smutter tilbage til dig...
Taming.Listener=T\u00e6mning:
Taming.SkillName=T\u00c6MMER
Taming.Skillup=T\u00e6mningsevne for\u00f8get med {0}. Total ({1})
Taming.Summon.Complete=[[GREEN]]Skabelse Komplet
Taming.Summon.Fail.Ocelot=Der er for mange Ocelotter i n\u00e6rheden af dig til at du kan spawne flere.
Taming.Summon.Fail.Wolf=Der er for mange Ulve i n\u00e6rheden af dig til at du kan spawne flere.
Unarmed.Ability.Berserk.Length=Berserker L\u00e6ngde: [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=Jern Arm Stil
Unarmed.Ability.Bonus.1=+{0} DMG Upgradering
Unarmed.Ability.Chance.ArrowDeflect=Pile Undvignings Chance: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=Afv\u00e6bnings Chance: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=Din modstander har et Jerngreb!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Dit Jerngreb lod dig modst\u00e5 afv\u00e6bning!
Unarmed.Ability.Lower=[[GRAY]]**DU S\u00c6NKER DINE N\u00c6VER**
Unarmed.Ability.Ready=[[GREEN]]**DU KLARG\u00d8R DIN N\u00c6VE**
Unarmed.SubSkill.Berserk.Name=Berserker (EVNE)
Unarmed.SubSkill.Berserk.Description=+50% skade, \u00f8del\u00e6gger svage materialer
Unarmed.SubSkill.Disarm.Name=Afv\u00e6bn (Spiller)
Unarmed.SubSkill.Disarm.Description=F\u00e5 objektet i din fjendes h\u00e5nd til at ryge ned p\u00e5 jorden.
Unarmed.SubSkill.IronArmStyle.Name=Jern Arm Stil
Unarmed.SubSkill.IronArmStyle.Description=Forst\u00e6rker din arm over tiden
Unarmed.SubSkill.ArrowDeflect.Name=Pile Undvigning
Unarmed.SubSkill.ArrowDeflect.Description=Undvig Pile
Unarmed.Listener=Ubev\u00e6bnet:
Unarmed.SkillName=UBEV\u00c6BNET
Unarmed.Skills.Berserk.Off=**Berserker er nu aftaget**
Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERKER AKTIVERET**
Unarmed.Skills.Berserk.Other.Off=Berserker[[GREEN]] er aftaget i [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Berserker!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Dine [[YELLOW]]Berserker [[GREEN]]evner er genindl\u00e6st!
Unarmed.Skillup=Ubev\u00e6bnet evne for\u00f8get med {0}. Total ({1})
Woodcutting.Ability.0=Blad Bl\u00e6ser
Woodcutting.Ability.1=Bl\u00e6s blade v\u00e6k
Woodcutting.Ability.Chance.DDrop=2x Tabs Chance: [[YELLOW]]{0}
Woodcutting.Ability.Length=Tr\u00e6 Hugger L\u00e6ngde: [[YELLOW]]{0}s
Woodcutting.Ability.Locked.0=L\u00c5ST INDTIL {0}+ EVNE (BLAD BL\u00c6SER)
Woodcutting.SubSkill.TreeFeller.Name=Tr\u00e6 Hugger (EVNE)
Woodcutting.SubSkill.TreeFeller.Description=F\u00e5r tr\u00e6er til at explodere
Woodcutting.SubSkill.LeafBlower.Name=Blad Bl\u00e6ser
Woodcutting.SubSkill.LeafBlower.Description=Spr\u00e6ng blade v\u00e6k
Woodcutting.SubSkill.HarvestLumber.Name=Dobbel tab
Woodcutting.SubSkill.HarvestLumber.Description=Dobbel det normale udbytte
Woodcutting.Listener=Tr\u00e6f\u00e6ldning:
Woodcutting.SkillName=TR\u00c6F\u00c6LDNING
Woodcutting.Skills.TreeFeller.Off=**Tr\u00e6 Hugger er nu aftaget**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**TR\u00c6 HUGGER AKTIVERET**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Din [[YELLOW]]Tr\u00e6 Hugger [[GREEN]]evne er genindl\u00e6st!
Woodcutting.Skills.TreeFeller.Other.Off=Tr\u00e6 hugger[[GREEN]] er aftaget i [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] har brugt [[RED]]Tr\u00e6 hugger!
Woodcutting.Skills.TreeFeller.Splinter=DIN \u00d8KSE SPLINTRER I TUSINDER AF STYKKER!
Woodcutting.Skills.TreeFeller.Threshold=Det tr\u00e6 er for stort!
Woodcutting.Skillup=Tr\u00e6hugningsevne for\u00f8get med {0}. Total ({1})
Ability.Generic.Refresh=[[GREEN]]**EVNER GENINDL\u00c6ST!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
Combat.ArrowDeflect=[[WHITE]]**UNDVIGER PIL**
Combat.BeastLore=[[GREEN]]**TIGGENDE MONSTER**
Combat.BeastLoreHealth=[[DARK_AQUA]]Liv ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Ejer ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**SPIDDET**
Combat.StruckByGore=**DU ER BLEVET SPIDDET**
Combat.TargetDazed=M\u00e5let er nu [[DARK_RED]]Bed\u00f8vet
Combat.TouchedFuzzy=[[DARK_RED]]R\u00f8rte Plysse. F\u00f8lte mig svimmel.
Commands.addlevels.AwardAll.1=[[GREEN]]Du har f\u00e5et {0} Exp i alle evner!
Commands.addlevels.AwardAll.2=Alle evner er blevet \u00e6ndret til {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Du har f\u00e5et{0} levels i {1}!
Commands.addlevels.AwardSkill.2={0} er blevet \u00e6ndret for {1}.
Commands.addxp.AwardAll=[[GREEN]]Du har f\u00e5et {0} Exp i alle evner!
Commands.addxp.AwardSkill=[[GREEN]]Du har f\u00e5et {0} Exp i {1}!
Commands.Ability.Off=Evne brug sat til [[GREEN]]Sand
Commands.Ability.On=Evne brug sat til [[GREEN]]Sand
Commands.AdminChat.Off=Admin Chat kun [[RED]]Slukket
Commands.AdminChat.On=Kun Admin Chat [[GREEN]]Rigtigt
Commands.AdminToggle=- Skift admin chatten
Commands.Chat.Console=*Konsol*
Commands.Disabled=Denne kommando er sl\u00e5et fra.
Commands.DoesNotExist=Spiller eksisterer ikke i databasen!
Commands.GodMode.Disabled=mcMMO GudeTilstand Slukket
Commands.GodMode.Enabled=mcMMO GudeTilstand Aktiveret
Commands.GodMode.Forbidden=[mcMMO] Gude Tilstand er ikke tilladt i denne verden (Se Tilladelser)
Commands.Inspect=<player> [[RED]]- Se detaljeret spiller Info
Commands.Party.Invite.Accepted=[[GREEN]]Invitation Accepteret. Du har sluttet dig til en gruppe {0}
Commands.Invite.Success=[[GREEN]]Invitation sendt successfuldt
Commands.Leaderboards=<skill> <page> [[RED]]- Ranglister
Commands.mcc.Header=---[][[YELLOW]]mcMMO Kommandoer[[RED]][]---
Commands.mcgod=- Skift GudeTilstand
Commands.mchud.Invalid=Det er ikke en tilladt HUD type.
Commands.mcpurge.Success=[[GREEN]]Databasen er blevet succesfuldt renset!
Commands.mcrank.Heading=[[GOLD]]-=PERSONLIGE RANGLISTER=-
Commands.mcrank.Overall=Overall[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=M\u00c5L: [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Rang [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]Degraderet
Commands.mcrefresh.Success={0}\'\'s nedk\u00f8ling er blevet genindl\u00e6st.
Commands.mcremove.Success=[[GREEN]]{0} er succesfuldt fjernet fra databasen!
Commands.mctop.Tip=[[GOLD]]Tip: Brug [[RED]]/mcrank[[GOLD]] for at se all dine personlige rangs!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u00c6ndrer m\u00e5let
Commands.mmoedit.Modified.1=[[GREEN]]Dit level i {0} er sat til {1}!
Commands.mmoedit.Modified.2={0} er blevet \u00e6ndret for {1}.
Commands.ModDescription=- L\u00e6s den korte mod beskrivelse
Commands.NoConsole=Denne kommando er ikke supported af konsollen.
Commands.Other=[[GREEN]]--ANDRE KOMMANDOER--
Commands.Party.Accept=- Accepter gruppe invitation
Commands.Party.Chat.Off=Gruppe Chat kun [[RED]]Slukket
Commands.Party.Chat.On=Kun Gruppe Chat [[GREEN]]Rigtigt
Commands.Party.Commands=[[GREEN]]--GRUPPE KOMMANDOER--
Commands.Party.Invite.0=INFORMATION: [[GREEN]]Du har modtaget en gruppe invitation for {0} from {1}
Commands.Party.Kick=Du er blevet fjernet fra gruppen {0}!
Commands.Party.Leave=Du har forladt denne gruppe
Commands.Party.None=Du er ikke i en gruppe.
Commands.Party.Quit=- Forlad din nuv\u00e6rende Gruppe
Commands.Party.Teleport=<player> [[RED]]- Teleporter til gruppe medlem
Commands.Party.Toggle=- Skift Gruppe Chat
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Kraft Level [[YELLOW]]Rangliste--
Commands.PowerLevel.Capped=[[DARK_RED]]KRAFT LEVEL: [[GREEN]]{0} [[DARK_RED]]MAX LEVEL: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]Kraft level: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]Dine {0} Evne levels er blevet gendannet succesfuldt
Commands.Reset.Single=[[GREEN]]Dine {0} Evne levels er blevet gendannet succesfuldt
Commands.Reset=Genindl\u00e6s en evnes level til 0
Commands.Skill.Invalid=Det er ikke et brugbart evnenavn!
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Rangliste--
Commands.Stats.Self=DINE STATS
Commands.Stats=- Se dine mcMMO statistikker.
Commands.ToggleAbility=- Skift evne aktivering med h\u00f8jre-click
Commands.Usage.1=Korrekt brug er /{0} {1}
Commands.Usage.2=Korrekt brug er /{0} {1} {2}
Commands.Usage.3=Korrekt brug er /{0} {1} {2} {3}
Commands.Usage.Level=Level
Commands.Usage.Message=besked
Commands.Usage.Page=side
Commands.Usage.Player=spiller
Commands.Usage.Skill=Evne
Commands.Usage.XP=xp
mcMMO.NoInvites=Du har ingen invitationer p\u00e5 nuv\u00e6rende tidspunkt
mcMMO.NoPermission=[[DARK_RED]]Ikke nok Tilladelser.
mcMMO.NoSkillNote=[[DARK_GRAY]]Hvis du ikke har adgang til en evne, vil den evne ikke blive vist her.
Party.Forbidden=[mcMMO] grupper er ikke tilladt i denne verden (Se Tilladelser)
Party.InvalidName=[[DARK_RED]]Dette er ikke et gruppe navn.
Party.IsLocked=Denne gruppe er allerede l\u00e5st!
Party.IsntLocked=Denne gruppe er ikke l\u00e5st!
Party.Locked=Festen er l\u00e5st, kun gruppe lederen kan invitere.
Party.NotInYourParty=[[DARK_RED]]{0} er ikke i din gruppe
Party.NotOwner=[[DARK_RED]]Du er ikke gruppe lederen.
Party.Owner.New=[[GREEN]]{0} er den nye gruppe leder.
Party.Owner.NotLeader=[[DARK_RED]]Du er ikke l\u00e6ngere gruppens leder.
Party.Owner.Player=[[GREEN]]Du er nu gruppe lederen.
Party.Password.Incorrect=Gruppe kodeord er forkert.
Party.Password.Set=[[GREEN]]Gruppe adgangskode sat til {0}
Party.Player.Invalid=Dette er ikke en rigtig spiller.
Party.Teleport.Dead=Du kan ikke teleportere til en d\u00f8d spiller.
Party.Teleport.Player=[[GREEN]]Du har teleporteret til {0}.
Party.Teleport.Self=Du kan ikke teleportere dig selv!
Party.Teleport.Target=[[GREEN]]{0} har teleporteret til dig.
Party.Unlocked=[[GRAY]]Gruppe er \u00e5ben
Commands.XPGain.Acrobatics=Falder
Commands.XPGain.Archery=Angriber Monstre
Commands.XPGain.Axes=Angriver Monstre
Commands.XPGain.Excavation=Graver og finder skatte
Commands.XPGain.Fishing=Fiskning (Brug nu hovedet!)
Commands.XPGain.Herbalism=Samler Urter
Commands.XPGain.Mining=Udvinde Sten & Malm
Commands.XPGain.Repair=Repererer
Commands.XPGain.Swords=Angriber Monstre
Commands.XPGain.Taming=Dyret\u00e6mning, eller kamp m/ dine ulve
Commands.XPGain.Unarmed=Angriber Monstre
Commands.XPGain.Woodcutting=Hugger tr\u00e6er ned
Commands.XPGain=[[DARK_GRAY]]XP FORTJENST: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Din XP BAR er nu l\u00e5st til {0}!
Commands.xplock.unlocked=[[GOLD]]Din XP BAR er nu [[GREEN]]\u00c5BEN[[GOLD]]!
Commands.xprate.modified=The XP er blevet \u00e6ndret til {0}
Commands.xprate.over=mcMMO XP bed\u00f8mnings begivenhed er SLUT!!
Commands.xprate.proper.0=Den rigtige m\u00e5de at \u00e6ndre XP ratio er /xprate <integer> <true/false>
Commands.xprate.proper.1=Rigtig brug for at s\u00e6tte XP level til 0 er /xprate reset
Commands.xprate.proper.2=V\u00e6lg sandt eller falsk for at vise om dette er en XP begivenhed eller ikke
Commands.xprate.started.0=[[GOLD]]XP BEGIVENHEDER FOR mcMMO ER STARTET!
Commands.xprate.started.1=[[GOLD]]mcMMO XP BED\u00d8MMELSE ER NU {0}x!
XPRate.Event=[[GOLD]]mcMMO er lige nu i gang med et XP bed\u00f8mnings begivenhed! XP bed\u00f8mning er {0}x!
Effects.Effects=Effekter
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Available=[[GRAY]]Guide for {0} tilg\u00e6ngelige - skriv /{1} ? [page]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=-
Guides.Page.Invalid=Ikke et gyldigt side nummer!
Guides.Usage=Korrekt brug er /{0} ? [page]
Inspect.Offline=Du har ikke tilladelse til at inspicere offline spillere!
Inspect.OfflineStats=mcMMO Stats for Offline Spillere [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO F\u00e6rdigheder for [[YELLOW]]{0}
Inspect.TooFar=Du er for langt v\u00e6k til at inspicere denne spiller!
Item.ChimaeraWing.Fail=**KIM\u00c6RE VINGE FEJLEDE!**
Item.ChimaeraWing.Pass=**KIM\u00c6RE VINGE**
Item.Injured.Wait=Du var for nylig skadet og m\u00e5 derfor vente med at bruge dette. [[YELLOW]]({0}s)
Skills.Disarmed=[[DARK_RED]]Du er blevet afv\u00e6bnet!
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]Du mangler mere
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=Du er for udmattet til at bruge denne evne igen.
Stats.Header.Combat=[[GOLD]]-=KAMP EVNER=-
Stats.Header.Gathering=[[GOLD]]-=INDSAMLINGS EVNER=-
Stats.Header.Misc=[[GOLD]]-=MISC SKILLS=-
Stats.Own.Stats=[[GREEN]][mcMMO] F\u00e6rdigheder
Perks.XP.Name=Erfaring
Perks.XP.Desc=Modtag {0}x XP.
Perks.Lucky.Name=Held
Perks.Lucky.Desc=Giver {0} Evner en 33.3% bedre chance for at aktivere.
Perks.Lucky.Desc.Login=Giver visse Evner en 33.3% bedre chance for at aktivere.
Perks.Lucky.Bonus=[[GOLD]] ({0} med heldig frynsegode)
Perks.Cooldowns.Name=Hurtig Bedring
Perks.Cooldowns.Desc=Sk\u00e6rer Nedk\u00f8lings tiden ned med {0}.
Perks.ActivationTime.Name=Udholdenhed
Perks.ActivationTime.Desc=Forl\u00e6nger evne aktivations tid med {0} sekunder
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s med Udholdenheds Frynsegode)
MOTD.Donate=[[DARK_AQUA]]Donations Info:
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Evne d\u00f8ds straf: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]Vampyr Statistik Igle: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[mcMMO Frynsegoder]
MOTD.Version=[[GOLD]][mcMMO] K\u00f8rer version [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Hjemmeside

View File

@@ -1,862 +0,0 @@
Acrobatics.Ability.Proc=[[GREEN]]**Atterrissage gracieux**
Acrobatics.Combat.Proc=[[GREEN]]**Esquiv\u00e9**
Acrobatics.DodgeChance=Probabilit\u00e9 d\'esquive : [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=Roulade
Acrobatics.SubSkill.Roll.Description=R\u00e9duit ou annule les d\u00e9g\u00e2ts de chute
Acrobatics.SubSkill.GracefulRoll.Name=Roulade gracieuse
Acrobatics.SubSkill.GracefulRoll.Description=Deux fois plus efficace qu\'une roulade classique
Acrobatics.SubSkill.Dodge.Name=Esquive
Acrobatics.SubSkill.Dodge.Description=R\u00e9duit de moiti\u00e9 les d\u00e9g\u00e2ts re\u00e7us
Acrobatics.Listener=Acrobatie :
Acrobatics.SubSkill.Roll.Chance=Probabilit\u00e9 de roulade : [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=Probabilit\u00e9 de roulade gracieuse : [[YELLOW]]{0}
Acrobatics.Roll.Text=**ROULADE**
Acrobatics.SkillName=ACROBATIE
Acrobatics.Skillup=Le talent Acrobatie augmente de {0}. Total ({1})
Alchemy.SubSkill.Catalysis.Name=Catalyse
Alchemy.SubSkill.Catalysis.Description=Augmente la vitesse de confection des potions
Alchemy.SubSkill.Concoctions.Name=Concoctions
Alchemy.SubSkill.Concoctions.Description=Confection des potions avec plus d\u2019ingr\u00e9dients
Alchemy.Listener=Alchimie
Alchemy.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (CATALYSE)
Alchemy.Catalysis.Speed=Vitesse de confection des poitions : [[YELLOW]]{0}
Alchemy.Concoctions.Rank=Classement des confectionneurs de potions: [[YELLOW]]{0}/{1}
Alchemy.Concoctions.Ingredients=Ingr\u00e9dients [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
Alchemy.SkillName=ALCHIMIE
Alchemy.Skillup=Le talent Alchimie augmente de {0}. Total ({1})
Archery.Combat.DazeChance=Probabilit\u00e9 de d\u00e9sorienter : [[YELLOW]]{0}
Archery.Combat.RetrieveChance=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches : [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=Tir pr\u00e9cis, bonus de d\u00e9g\u00e2ts : [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=Tir pr\u00e9cis
Archery.SubSkill.SkillShot.Description=Augmente les d\u00e9g\u00e2ts inflig\u00e9s
Archery.SubSkill.Daze.Name=Chance de d\u00e9sorienter : [[YELLOW]]{0}%
Archery.SubSkill.Daze.Description=D\u00e9soriente les adversaires en leur faisant {0} dommages
Archery.SubSkill.ArrowRetrieval.Name=R\u00e9cup\u00e9ration de fl\u00e8che
Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00e9 de r\u00e9cup\u00e9rer des fl\u00e8ches sur les corps
Archery.Listener=Archerie :
Archery.SkillName=ARCHERIE
Archery.Skillup=Le talent Archerie augmente de {0}. Total ({1})
Axes.Ability.Bonus.0=Ma\u00eetrise des haches
Axes.Ability.Bonus.1={0} de d\u00e9g\u00e2ts en plus
Axes.Ability.Bonus.2=Impact
Axes.Ability.Bonus.3=Inflige {0} de d\u00e9g\u00e2ts \u00e0 l\'armure
Axes.Ability.Bonus.4=Impact puissant
Axes.Ability.Bonus.5=Inflige {0} de d\u00e9g\u00e2ts en plus aux ennemis sans armure
Axes.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HACHE**
Axes.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HACHE**
Axes.Combat.CritStruck=[[DARK_RED]]Vous avez re\u00e7u un coup critique !
Axes.Combat.CritChance=Chance d\'infliger un coup critique : [[YELLOW]]{0}%
Axes.Combat.CriticalHit=COUP CRITIQUE !
Axes.Combat.GI.Proc=[[GREEN]]**FRAPP\u00c9 D\'UNE VIOLENTE INOU\u00cfE**
Axes.Combat.GI.Struck=**TOUCH\u00c9 PAR UN IMPACT PUISSANT**
Axes.Combat.SS.Struck=[[DARK_RED]]Bloqu\u00e9 par TRANCHE-CR\u00c2NE !
Axes.Combat.SS.Length=Dur\u00e9e de Tranche-cr\u00e2ne : [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=Tranche-cr\u00e2ne (Comp\u00e9tence)
Axes.SubSkill.SkullSplitter.Description=Inflige des d\u00e9g\u00e2ts de zone
Axes.SubSkill.CriticalStrikes.Name=Coup critique
Axes.SubSkill.CriticalStrikes.Description=D\u00e9g\u00e2ts doubl\u00e9s
Axes.SubSkill.AxeMastery.Name=Ma\u00eetrise des haches
Axes.SubSkill.AxeMastery.Description=Ajoute des d\u00e9g\u00e2ts
Axes.SubSkill.ArmorImpact.Name=Impact
Axes.SubSkill.ArmorImpact.Description=Frappe avec suffisamment de force pour briser l\'armure
Axes.SubSkill.GreaterImpact.Name=Impact puissant
Axes.SubSkill.GreaterImpact.Description=Inflige des d\u00e9g\u00e2ts bonus aux ennemis sans armure
Axes.Listener=Haches :
Axes.SkillName=HACHES
Axes.Skills.SS.Off=**Tranche-cr\u00e2ne est termin\u00e9**
Axes.Skills.SS.On=[[GREEN]]**TRANCHE-CR\u00c2NE ACTIV\u00c9**
Axes.Skills.SS.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Tranche-cr\u00e2ne [[GREEN]]est pr\u00eate !
Axes.Skills.SS.Other.Off=Tranche-cr\u00e2ne[[GREEN]] s\'est termin\u00e9 pour [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Tranche-cr\u00e2ne !
Axes.Skillup=Le talent Haches augmente de {0}. Total ({1})
Axes.Ability.Bonus.0=Ma\u00eetrise des haches
Excavation.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE PELLE**
Excavation.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE PELLE**
Excavation.SubSkill.GigaDrillBreaker.Name=Foreur (Comp\u00e9tence)
Excavation.SubSkill.GigaDrillBreaker.Description=Drops x3, XP x3, plus rapide
Excavation.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors
Excavation.SubSkill.TreasureHunter.Description=Capacit\u00e9 \u00e0 d\u00e9terrer des tr\u00e9sors
Excavation.Effect.Length=Dur\u00e9e de Foreur : [[YELLOW]]{0}s
Excavation.Listener=Excavation:
Excavation.SkillName=EXCAVATION
Excavation.Skills.GigaDrillBreaker.Off=**Votre comp\u00e9tence Foreur est termin\u00e9e**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**FOREUR ACTIV\u00c9**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Foreur [[GREEN]]est pr\u00eate !
Excavation.Skills.GigaDrillBreaker.Other.Off=Foreur[[GREEN]] est termin\u00e9 pour [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Foreur !
Excavation.Skillup=La comp\u00e9tence excavation augmente de {0}. Total ({1})
Fishing.Ability.Chance=Chance que \u00e7a morde: [[YELLOW]]{0}
Fishing.Ability.Info=P\u00eache magique : [[GRAY]] **S\'am\u00e9liore via Chasseur de tr\u00e9sors**
Fishing.Ability.Locked.0=BLOCKE JUSQU\'A {0}+ COMPETENCE (SHAKE)
Fishing.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (PECHEUR SUR GLACE)
Fishing.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Ma\u00eetre P\u00eacheur)
Fishing.Ability.Rank=Chasseur de tr\u00e9sors : [[YELLOW]]{0}/{1}
Fishing.Ability.TH.DropRate=Taux de Loot: [[DARK_RED]]Pi\u00e8ge: [[YELLOW]]{0} [[GRAY]]Commun: [[YELLOW]]{1} [[GREEN]]Non commun: [[YELLOW]]{2}\n[[BLUE]]Rare: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u00c9pique: [[YELLOW]]{4} [[GOLD]]L\u00e9gendaire: [[YELLOW]]{5} [[AQUA]]Record: [[YELLOW]]{6}
Fishing.Ability.TH.MagicRate=Chasse magique: [[YELLOW]]{0}
Fishing.Ability.Shake=Chance d\'esquive : [[YELLOW]]{0}
Fishing.Ability.IceFishing=P\u00eache sur Glace: Allez p\u00eacher sur de la glace
Fishing.Ability.FD=R\u00e9gime de p\u00e9cheur: [[YELLOW]]Classement {0}
Fishing.SubSkill.TreasureHunter.Name=Chasseur de tr\u00e9sors
Fishing.SubSkill.TreasureHunter.Description=Remonte des objets inhabituels
Fishing.SubSkill.MagicHunter.Name=P\u00eache magique
Fishing.SubSkill.MagicHunter.Description=Remonte des objets magiques
Fishing.SubSkill.Shake.Name=Secousse (sur monstres)
Fishing.SubSkill.Shake.Description=Fait tomber des objets des monstres avec une canne \u00e0 p\u00eache
Fishing.SubSkill.FishermansDiet.Name=R\u00e9gime de fermier
Fishing.SubSkill.FishermansDiet.Description=Am\u00e9liore la nutrition des produits de la ferme
Fishing.SubSkill.MasterAngler.Name=Ma\u00eetre P\u00eacheur
Fishing.SubSkill.MasterAngler.Description=Augmente les chances que \u00e7a morde lors de la p\u00eache
Fishing.SubSkill.IceFishing.Name=P\u00eache sur Glace
Fishing.SubSkill.IceFishing.Description=Vous permet de p\u00eacher dans les biomes glac\u00e9s
Fishing.Chance.Raining=[[BLUE]] Bonus de pluie
Fishing.Listener=P\u00eache :
Fishing.Ability.TH.MagicFound=[[GRAY]]Vous ressentez quelque chose de magique dans cette prise...
Fishing.Ability.TH.Boom=[[GRAY]]TEMPS D\'EXPLOSION !!!
Fishing.Ability.TH.Poison=[[GRAY]]Quelque chose n\'a pas bien cuit...
Fishing.SkillName=P\u00caCHE
Fishing.Skillup=Le talent p\u00eache augmente de {0}. Total ({1})
Herbalism.Ability.DoubleDropChance=Double Drop: [[YELLOW]]{0}
Herbalism.Ability.FD=R\u00e9gime du fermier: [[YELLOW]]Classement {0}
Herbalism.Ability.GTe.Length=Dur\u00e9e de Main verte : [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=Vous avez besoin de plus de graines pour r\u00e9pandre la terre verte
Herbalism.Ability.GTh.Chance=Chances de Mains Vertes: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=**MAINS VERTES \u00c9CHOU\u00c9ES**
Herbalism.Ability.GTh.Stage=Vos sens de jardinier vous indique que [[YELLOW]] Ce champ est en train de pousser {0}
Herbalism.Ability.GTh=[[GREEN]]**DOIGTS VERTS**
Herbalism.Ability.HylianLuck=Probabilit\u00e9 de chance d\'Hylian: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE HOUE**
Herbalism.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE HOUE**
Herbalism.Ability.ShroomThumb.Chance=Doigts \u00e0 Champignons, Chance: [[YELLOW]]{0}
Herbalism.Ability.ShroomThumb.Fail=**DOIGTS VERTS \u00c9CHOU\u00c9**
Herbalism.SubSkill.GreenTerra.Name=Main verte (Comp\u00e9tence)
Herbalism.SubSkill.GreenTerra.Description=Propage les plantes / triple drops
Herbalism.SubSkill.GreenThumb.Name=Mains Vertes (Bl\u00e9)
Herbalism.SubSkill.GreenThumb.Description=Plantation automatique apres recolte du champ
Herbalism.Effect.4=Mains Vertes (Blocs)
Herbalism.SubSkill.GreenThumb.Description.2=Faire des briques avec mousse ou faire pousser l\'herbe
Herbalism.SubSkill.FarmersDiet.Name=R\u00e9gime de fermier
Herbalism.SubSkill.FarmersDiet.Description=Am\u00e9liore la nutrition des produits de la ferme
Herbalism.SubSkill.DoubleDrops.Name=Double drops
Herbalism.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e
Herbalism.SubSkill.HylianLuck.Name=Chance d\'Hylian
Herbalism.SubSkill.HylianLuck.Description=Donne une petite chance de trouver de rares objets
Herbalism.SubSkill.ShroomThumb.Name=Doigts \u00e0 Champignons
Herbalism.SubSkill.ShroomThumb.Description=Etend le mycelium sur la terre et l\'herbe
Herbalism.HylianLuck=[[GREEN]]la chance d\'Hyrule est avec vous aujourd\'hui !
Herbalism.Listener=Herboristerie :
Herbalism.SkillName=HERBORISTERIE
Herbalism.Skills.GTe.Off=**Votre comp\u00e9tence Main verte est termin\u00e9e**
Herbalism.Skills.GTe.On=[[GREEN]]**MAIN VERTE ACTIV\u00c9**
Herbalism.Skills.GTe.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Main verte [[GREEN]]est pr\u00eate !
Herbalism.Skills.GTe.Other.Off=Main verte[[GREEN]] est termin\u00e9 pour [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Main verte !
Herbalism.Skillup=Le talent Herboristerie augmente de {0}. Total ({1})
Mining.Ability.Length=Dur\u00e9e de Broyeur : [[YELLOW]]{0}s
Mining.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux du talent (MINAGE PAR EXPLOSIONS)
Mining.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Grosses Explosions)
Mining.Ability.Locked.2=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (Expert en d\u00e9molition)
Mining.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE PIOCHE**
Mining.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE PIOCHE**
Mining.SubSkill.SuperBreaker.Name=Broyeur (Comp\u00e9tence)
Mining.SubSkill.SuperBreaker.Description=Plus rapide, chance de triple drops
Mining.SubSkill.DoubleDrops.Name=Double drops
Mining.SubSkill.DoubleDrops.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e
Mining.SubSkill.BlastMining.Name=Minage explosif
Mining.SubSkill.BlastMining.Description=Bonus au minage \u00e0 l\'explosif
Mining.SubSkill.BiggerBombs.Name=Grosses explosions
Mining.SubSkill.BiggerBombs.Description=Augmente le rayon d\'explosion de la TNT
Mining.SubSkill.DemolitionsExpertise.Name=Expert en d\u00e9molition
Mining.SubSkill.DemolitionsExpertise.Description=R\u00e9duit les d\u00e9g\u00e2ts provenant de la TNT
Mining.Effect.Decrease=Baisse de l\'expertise en d\u00e9molition: [[YELLOW]]{0}
Mining.Effect.DropChance=Double Drop: [[YELLOW]]{0}
Mining.Listener=Minage :
Mining.SkillName=MINAGE
Mining.Skills.SuperBreaker.Off=**Votre comp\u00e9tence Broyeur est termin\u00e9e**
Mining.Skills.SuperBreaker.On=[[GREEN]]**BROYEUR ACTIV\u00c9**
Mining.Skills.SuperBreaker.Other.Off=Broyeur[[GREEN]] est termin\u00e9 pour [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Broyeur !
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Broyeur [[GREEN]]est pr\u00eate !
Mining.Skillup=Le talent Minage augmente de {0}. Total ({1})
Mining.Blast.Boom=[[GRAY]]**BOUM**
Mining.Blast.Effect=+{0} de r\u00e9colte des minerais, -{1} de r\u00e9colte des d\u00e9bris, {2}x les r\u00e9compenses
Mining.Blast.Radius.Increase=Rayon d\'explosion : [[YELLOW]]+{0}
Mining.Blast.Rank=Minage explosif : [[YELLOW]]Rang {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Minage explosif !
Mining.Blast.Refresh=[[GREEN]]Votre capacit\u00e9 [[YELLOW]]Minage Explosif[[GREEN]] est pr\u00eate !
Repair.SubSkill.Repair.Name=R\u00e9paration
Repair.SubSkill.Repair.Description=R\u00e9parer Outils & Armures
Repair.SubSkill.GoldRepair.Name=R\u00e9paration d\'Or ({0}+ SKILL)
Repair.SubSkill.GoldRepair.Description=R\u00e9parer Outils & Armures en Or
Repair.SubSkill.IronRepair.Name=R\u00e9paration en Fer ({0}+ SKILL)
Repair.SubSkill.IronRepair.Description=R\u00e9paration Outils & Armures en Fer
Repair.SubSkill.StoneRepair.Name=R\u00e9paration en Pierre ({0}+ SKILL)
Repair.SubSkill.StoneRepair.Description=R\u00e9parer Outils en Pierre
Repair.SubSkill.RepairMastery.Name=Ma\u00eetrise de la forge
Repair.SubSkill.RepairMastery.Description=Am\u00e9liore la r\u00e9paration
Repair.SubSkill.SuperRepair.Name=Superbe r\u00e9paration
Repair.SubSkill.SuperRepair.Description=Double l\'efficacit\u00e9
Repair.SubSkill.DiamondRepair.Name=R\u00e9paration du diamant (talent {0}+)
Repair.SubSkill.DiamondRepair.Description=R\u00e9pare les outils et armures en diamant
Repair.SubSkill.ArcaneForging.Name=Forge arcanique
Repair.SubSkill.ArcaneForging.Description=R\u00e9pare les objets magiques
Repair.Error=[[DARK_RED]]McMMO a rencontr\u00e9 une erreur en essayant de r\u00e9parer cet objet !
Repair.Listener.Anvil=[[DARK_RED]]Vous venez de poser une enclume, elle peut \u00eatre utilis\u00e9e pour r\u00e9parer votre \u00e9quipement.
Repair.Listener.Anvil2=[[DARK_RED]]Tu as plac\u00e9 une enclume sauvage, utilises la pour r\u00e9parer les outils et armures sauvages.
Repair.Listener=R\u00e9paration :
Repair.SkillName=R\u00c9PARATION
Repair.Skills.AdeptDiamond=[[DARK_RED]]Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le diamant.
Repair.Skills.AdeptGold=[[DARK_RED]]Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer l\'or.
Repair.Skills.AdeptIron=[[DARK_RED]]Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer le fer.
Repair.Skills.AdeptStone=[[DARK_RED]]Vous n\'\u00eates pas suffisamment comp\u00e9tent pour r\u00e9parer la pierre.
Repair.Skills.Adept=Vous devez avoir le niveau [[YELLOW]]{0}[[RED]] pour pouvoir r\u00e9parer [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]Plut\u00f4t facile.
Repair.Skills.FullDurability=[[GRAY]]C\'est d\u00e9j\u00e0 r\u00e9par\u00e9.
Repair.Skills.Mastery=Maitrise de la forge: [[YELLOW]]Extra {0} durabilit\u00e9 en place
Repair.Skills.StackedItems=[[DARK_RED]]Vous ne pouvez pas r\u00e9parer les objets empil\u00e9s.
Repair.Skills.Super.Chance=Chance Super R\u00e9paration: [[YELLOW]]{0}
Repair.Skillup=Le talent R\u00e9paration augmente de {0}. Total ({1})
Repair.Pretty.Name=R\u00e9paration
Repair.Arcane.Chance.Downgrade=[[GRAY]]Forge arcanique, chance de d\u00e9gradation : [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]Forge arcanique, taux de succ\u00e8s : [[YELLOW]]{0}%
Repair.Arcane.Downgrade=Les \u00e9nergies arcaniques ont \u00e9t\u00e9 affaiblies sur cet objet.
Repair.Arcane.Fail=Les \u00e9nergies arcaniques ont quitt\u00e9 cet objet.
Repair.Arcane.Lost=Vous n\'\u00e9tiez pas suffisamment comp\u00e9tent pour pr\u00e9server les enchantements.
Repair.Arcane.Perfect=[[GREEN]]Vous avez pr\u00e9serv\u00e9 les \u00e9nergies arcaniques de cet objet.
Repair.Arcane.Rank=Forge arcanique : [[YELLOW]]Rang {0}/4
Salvage.Pretty.Name=Recyclage
Salvage.SubSkill.AdvancedSalvage.Name=Recyclage Avanc\u00e9
Salvage.SubSkill.AdvancedSalvage.Description=Recyclage des objets endommag\u00e9s
Salvage.SubSkill.ArcaneSalvaging.Name=Recyclage Arcanique
Salvage.SubSkill.ArcaneSalvaging.Description=Extrait les enchantements des objets
Salvage.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) du talent (Recyclage Avanc\u00e9)
Salvage.Ability.Bonus.0=Recyclage Avanc\u00e9
Salvage.Ability.Bonus.1=Rendement maximal {0} objet(s) d\u00e9truit(s)
Salvage.Arcane.Rank=Recyclage Arcanique: [[YELLOW]]Rang {0}/{1}
Salvage.Arcane.ExtractFull=[[GRAY]]Recyclage Arcanique : Chance d\'un enchantement complet
Salvage.Arcane.ExtractPartial=[[GRAY]]Recyclage Arcanique : Chance d\'un enchantement partiel
Salvage.Skills.Success=[[GREEN]]Objet recycl\u00e9 !
Salvage.Skills.Adept.Damaged=[[DARK_RED]]Vous n\'\u00eates pas assez talentueux pour recycler des objets endommag\u00e9s.
Salvage.Skills.Adept.Level=Vous devez \u00eatre niveau [[YELLOW]]{0}[[RED]] pour recycler [[YELLOW]]{1}
Salvage.Skills.TooDamaged=[[DARK_RED]]C\'est objet est trop endommag\u00e9 pour \u00eatre recycl\u00e9.
Salvage.Skills.ArcaneFailed=Vous avez \u00e9t\u00e9 incapable d\'extraire la connaissance contenue dans cet objet.
Salvage.Skills.ArcanePartial=Vous avez \u00e9t\u00e9 capable d\'extraire toute la connaissance contenue dans cet objet.
Salvage.Skills.ArcaneSuccess=[[GREEN]]Vous avez \u00e9t\u00e9 capable d\'extraire toute la connaissance contenue dans cet objet.
Salvage.Listener.Anvil=[[DARK_RED]]Vous avez plac\u00e9 une enclume de r\u00e9paration, utilisez-la pour recycler vos outils et vos armures.
Salvage.Listener=Recyclage:
Salvage.SkillName=RECYCLAGE
Swords.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOTRE \u00c9P\u00c9E**
Swords.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOTRE \u00c9P\u00c9E**
Swords.Combat.Bleed.Chance=Chance de saignement: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=Dur\u00e9e de saignement : [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]NOTE : [[YELLOW]]1 tick toutes les 2 secondes
Swords.Combat.Bleeding.Started=[[DARK_RED]] Tu saignes!
Swords.Combat.Bleeding.Stopped=[[GRAY]]Le saignement s\'est [[GREEN]]arr\u00eat\u00e9[[GRAY]] !
Swords.Combat.Bleeding=[[GREEN]]**L\'ENNEMI SAIGNE**
Swords.Combat.Counter.Chance=Chance de Contre Attaque: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]Touch\u00e9 par une contre-attaque !
Swords.Combat.Countered=[[GREEN]]**CONTRE-ATTAQUE**
Swords.Combat.SS.Struck=[[DARK_RED]]Frapp\u00e9 par ATTAQUE D\u00c9CHIRANTE !
Swords.SubSkill.CounterAttack.Name=Contre-attaque
Swords.SubSkill.CounterAttack.Description=Renvoie {0} des dommages pris en bloquant
Swords.SubSkill.SerratedStrikes.Name=Attaque D\u00e9chirante (Capacit\u00e9)
Swords.SubSkill.SerratedStrikes.Description={0} DMG AoE, Saignement+ AoE
Swords.Effect.4=Saignement d\'Attaque d\u00e9chirante
Swords.Effect.5={0} Intervale entre les saignements
Swords.SubSkill.Bleed.Name=Saignement
Swords.SubSkill.Bleed.Description=Applique un saignement
Swords.Listener=\u00c9p\u00e9es :
Swords.SkillName=\u00c9P\u00c9ES
Swords.Skills.SS.Off=**Votre comp\u00e9tence Attaque d\u00e9chirante est termin\u00e9e**
Swords.Skills.SS.On=[[GREEN]]**ATTAQUE D\u00c9CHIRANTE ACTIV\u00c9E**
Swords.Skills.SS.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Attaque d\u00e9chirante [[GREEN]]est pr\u00eate !
Swords.Skills.SS.Other.Off=Attaque d\u00e9chirante[[GREEN]] s\'est termin\u00e9 pour [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Attaque d\u00e9chirante !
Swords.Skillup=Ep\u00e9e augmente de {0}. Total ({1})
Swords.SS.Length=Dur\u00e9e d\'Attaque d\u00e9chirante : [[YELLOW]]{0}s
Taming.Ability.Bonus.0=Attentif \u00e0 l\'environnement
Taming.Ability.Bonus.1=Les loups \u00e9vitent les dangers
Taming.Ability.Bonus.2=Fourrure \u00e9paisse
Taming.Ability.Bonus.3=R\u00e9duction de d\u00e9g\u00e2t, r\u00e9sistance au feu
Taming.Ability.Bonus.4=R\u00e9sistance aux chocs
Taming.Ability.Bonus.5=Les explosifs font 1/{0} compar\u00e9 au dommage normal
Taming.Ability.Bonus.6=Griffes ac\u00e9r\u00e9es
Taming.Ability.Bonus.7=+{0} Damage
Taming.Ability.Bonus.8=Fast food
Taming.Ability.Bonus.9={0} Chance d\'etre soign\u00e9 lors de d\'une attaque
Taming.Ability.Bonus.10=Super chien de chasse
Taming.Ability.Bonus.11=Regagne de la vie lorsqu\'endommag\u00e9 par de la magie ou du poison
Taming.Ability.Locked.0=Attentif \u00e0 l\'environnement
Taming.Ability.Locked.1=Fourrure \u00e9paisse
Taming.Ability.Locked.2=R\u00e9sistance aux chocs
Taming.Ability.Locked.3=Griffes ac\u00e9r\u00e9es
Taming.Ability.Locked.4=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveau(x) (SERVICE FAST FOOD)
Taming.Ability.Locked.5=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux du talent (Super chien de chasse)
Taming.Ability.Lower=[[GRAY]]**VOS LOUPS SE METTENT EN RETRAIT**
Taming.Ability.Ready=[[GRAY]]**VOUS PREPAREZ VOS LOUPS**
Taming.Combat.Chance.Gore=Chance Gore: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=Connaissances des b\u00eates
Taming.SubSkill.BeastLore.Description=Bone-whacking inspects wolves & ocelots
Taming.SubSkill.ShockProof.Name=R\u00e9sistance aux chocs
Taming.SubSkill.ShockProof.Description=R\u00e9duction des d\u00e9g\u00e2ts explosifs
Taming.SubSkill.CallOfTheWild.Name=Appel de la nature
Taming.SubSkill.CallOfTheWild.Description=Appelle un animal \u00e0 vos c\u00f4t\u00e9s
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW: Accroupissez vous et faites un clic-gauche avec\n{0} {1} (Ocelot), {2} {3} (Loup), {4} {5} (Cheval)
Taming.SubSkill.FastFoodService.Name=Fast food
Taming.SubSkill.FastFoodService.Description=Probabilit\u00e9 de voler la vie en attaquant
Taming.SubSkill.HolyHound.Name=Super chien de chasse
Taming.SubSkill.HolyHound.Description=Soign\u00e9 par la Magie et le Poison
Taming.SubSkill.Gore.Name=Morsure
Taming.SubSkill.Gore.Description=Coup critique faisant saigner
Taming.SubSkill.SharpenedClaws.Name=Griffes ac\u00e9r\u00e9es
Taming.SubSkill.SharpenedClaws.Description=Bonus aux d\u00e9g\u00e2ts
Taming.SubSkill.EnvironmentallyAware.Name=Attentif \u00e0 l\'environnement
Taming.SubSkill.EnvironmentallyAware.Description=Phobie des cactus et de la lave, immunis\u00e9 aux chutes
Taming.SubSkill.ThickFur.Name=Fourrure \u00e9paisse
Taming.SubSkill.ThickFur.Description=R\u00e9duction de d\u00e9g\u00e2t, r\u00e9sistance au feu
Taming.SubSkill.Gore.Name0=Charge (Abilit\u00e9)
Taming.SubSkill.Gore.Name1=Ennemi cible, Rapidit\u00e9 de Loup++
Taming.Listener.Wolf=[[DARK_GRAY]]Votre loup se pr\u00e9cipite \u00e0 vos c\u00f4t\u00e9s...
Taming.Listener=Apprivoisement :
Taming.SkillName=APPRIVOISEMENT
Taming.Skills.Charge.Off=**Charge s\'est arr\u00eat\u00e9e**
Taming.Skills.Charge.On=[[GREEN]]**CHARGE ACTIV\u00c9E**
Taming.Skills.Charge.Other.Off=Charge[[GREEN]] s\'est arr\u00eat\u00e9e pour [[YELLOW]]{0}
Taming.Skills.Charge.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Charge!
Taming.Skills.Charge.Refresh=[[GREEN]]Votre capacit\u00e9 [[YELLOW]]Charge [[GREEN]]a \u00e9t\u00e9 renouvel\u00e9e!
Taming.Skills.Charge.NoneNearby=**AUCUN LOUP DISPONIBLE A PROXIMIT\u00c9**
Taming.Skills.Charge.NoTarget=**AUCUNE CIBLE TROUV\u00c9E**
Taming.Skillup=Le talent Apprivoisement augmente de {0}. Total ({1})
Taming.Summon.Complete=[[GREEN]]Appel r\u00e9ussi
Taming.Summon.Lifespan=(Dur\u00e9e de vie: {0}s)
Taming.Summon.Fail.Ocelot=Il y a d\u00e9j\u00e0 trop d\'ocelots dans les environs.
Taming.Summon.Fail.Wolf=Il y a d\u00e9j\u00e0 trop de loups dans les environs.
Taming.Summon.Fail.Horse=Il y a d\u00e9j\u00e0 trop de chevaux dans les environs.
Taming.Summon.Fail.TooMany=Vous ne pouvez pas appeler plus d\'animaux \u00e0 vos c\u00f4t\u00e9s. [[YELLOW]]({0})
Taming.Summon.Name.Format={1} de {0}
Unarmed.Ability.Berserk.Length=Dur\u00e9e de Berserk : [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=Poings de fer
Unarmed.Ability.Bonus.1=+{0} de d\u00e9g\u00e2ts
Unarmed.Ability.Chance.ArrowDeflect=D\u00e9viation de fl\u00e8che: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=Chance D\u00e9sarmer: [[YELLOW]]{0}
Unarmed.Ability.Chance.IronGrip=Chance de Poigne de Fer: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=Votre adversaire a une poigne de fer !
Unarmed.Ability.IronGrip.Defender=Votre poigne de fer vous a emp\u00each\u00e9 d\'\u00eatre d\u00e9sarm\u00e9 !
Unarmed.Ability.Lower=[[GRAY]]**VOUS ABAISSEZ VOS POINGS**
Unarmed.Ability.Ready=[[GREEN]]**VOUS LEVEZ VOS POINGS**
Unarmed.SubSkill.Berserk.Name=Berserk (Comp\u00e9tence)
Unarmed.SubSkill.Berserk.Description=+50% de d\u00e9g\u00e2ts, casse les mat\u00e9riaux souples
Unarmed.SubSkill.Disarm.Name=D\u00e9sarmement (sur joueurs)
Unarmed.SubSkill.Disarm.Description=Fait tomber l\'arme des ennemis
Unarmed.SubSkill.IronArmStyle.Name=Poings de fer
Unarmed.SubSkill.IronArmStyle.Description=Durcit vos poings au fil du temps
Unarmed.SubSkill.ArrowDeflect.Name=D\u00e9viation de fl\u00e8che
Unarmed.SubSkill.ArrowDeflect.Description=D\u00e9vie les fl\u00e8ches
Unarmed.SubSkill.IronGrip.Name=Poigne de Fer
Unarmed.SubSkill.IronGrip.Description=Vous emp\u00eache d\'\u00eatre d\u00e9sarm\u00e9
Unarmed.Listener=Poings :
Unarmed.SkillName=POINGS
Unarmed.Skills.Berserk.Off=**Votre capacit\u00e9 Furie est termin\u00e9e**
Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK ACTIV\u0081\u00c9**
Unarmed.Skills.Berserk.Other.Off=Berserk[[GREEN]] s\'est termin\u00e9 pour [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Furie !
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Berserk [[GREEN]]est pr\u00eate !
Unarmed.Skillup=La comp\u00e9tence Poings augmente de {0}. Total ({1})
Woodcutting.Ability.0=Souffleur de Feuilles
Woodcutting.Ability.1=Souffle les feuilles
Woodcutting.Ability.Chance.DDrop=Double Drop: [[YELLOW]]{0}
Woodcutting.Ability.Length=Dur\u00e9e d\'Abbateur : [[YELLOW]]{0}s
Woodcutting.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux du talent (EXPLOSEUR DE FEUILLES)
Woodcutting.SubSkill.TreeFeller.Name=Abatteur (Comp\u00e9tence)
Woodcutting.SubSkill.TreeFeller.Description=Fait exploser les arbres
Woodcutting.SubSkill.LeafBlower.Name=Soufflage
Woodcutting.SubSkill.LeafBlower.Description=Souffle les feuilles
Woodcutting.SubSkill.HarvestLumber.Name=Double drops
Woodcutting.SubSkill.HarvestLumber.Description=Double la quantit\u00e9 r\u00e9colt\u00e9e
Woodcutting.Listener=B\u00fbcheronnage :
Woodcutting.SkillName=B\u00dbCHERONNAGE
Woodcutting.Skills.TreeFeller.Off=**Votre comp\u00e9tence Abatteur est termin\u00e9e**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**ABATTEUR ACTIV\u00c9**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Votre comp\u00e9tence [[YELLOW]]Abatteur [[GREEN]]est pr\u00eate !
Woodcutting.Skills.TreeFeller.Other.Off=Abatteur[[GREEN]] est termin\u00e9 pour [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] a utilis\u00e9 [[RED]]Abatteur !
Woodcutting.Skills.TreeFeller.Splinter=VOTRE HACHE SE BRISE EN MILLE MORCEAUX !
Woodcutting.Skills.TreeFeller.Threshold=Cet arbre est trop large!
Woodcutting.Skillup=La comp\u00e9tence B\u00fbcheronnage augmente de {0}. Total ({1})
Ability.Generic.Refresh=[[GREEN]]**COMP\u00c9TENCES RAFRA\u00ceCHIES !**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template={0} : [[YELLOW]]{1}
Combat.ArrowDeflect=[[WHITE]]**FL\u00c8CHE DEVI\u00c9E**
Combat.BeastLore=[[GREEN]]**CONNAISSANCE DES B\u00caTES**
Combat.BeastLoreHealth=[[DARK_AQUA]]Vie ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Propri\u00e9taire ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**SANG**
Combat.StruckByGore=**FRAPP\u00c9 JUSQU\'AU SANG**
Combat.TargetDazed=La cible a \u00e9t\u00e9 [[DARK_RED]]\u00c9tourdi
Combat.TouchedFuzzy=[[DARK_RED]]Vous voyez flou. Vous vous sentez \u00e9tourdi.
mcMMO.Description=[[DARK_AQUA]]About the [[YELLOW]]mcMMO[[DARK_AQUA]] Project:,[[GOLD]]mcMMO is an [[RED]]open source[[GOLD]] RPG mod created in February 2011,[[GOLD]]by [[BLUE]]com.gmail.nossr50[[GOLD]]. The goal is to provide a quality RPG experience.,[[DARK_AQUA]]Tips:,[[GOLD]] - [[GREEN]]Use [[RED]]/mcmmo help[[GREEN]] to see commands,[[GOLD]] - [[GREEN]]Type [[RED]]/SKILLNAME[[GREEN]] to see detailed skill info,[[DARK_AQUA]]Developers:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Founder & Project Lead),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Former Project Lead),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Developer),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Developer),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Developer),[[DARK_AQUA]]Useful 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]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} niveau(x) dans tous les talents !
Commands.addlevels.AwardAll.2=Tous les talents ont \u00e9t\u00e9 modifi\u00e9s pour {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Vous avez re\u00e7u {0} niveau dans {1}!
Commands.addlevels.AwardSkill.2={0} a \u00e9t\u00e9 modifi\u00e9 pour {1}.
Commands.addxp.AwardAll=[[GREEN]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans chaque comp\u00e9tences!
Commands.addxp.AwardSkill=[[GREEN]]Vous avez \u00e9t\u00e9 r\u00e9compens\u00e9 de {0} experiences dans {1} !
Commands.Ability.Off=Utilisation des comp\u00e9tences [[RED]]Off
Commands.Ability.On=Utilisation des comp\u00e9tences [[GREEN]]On
Commands.Ability.Toggle=L\'utilisation des capacit\u00e9s a \u00e9t\u00e9 modifi\u00e9e pour [[YELLOW]]{0}
Commands.AdminChat.Off=Canal admin [[RED]]Off
Commands.AdminChat.On=Canal admin [[GREEN]]On
Commands.AdminToggle=[[GREEN]]- Active/d\u00e9sactive le tchat admin
Commands.Chat.Console=*Console*
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]Temps d\'attente des capacit\u00e9s McMMO[[GOLD]] =--
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} secondes restantes
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]] Pr\u00eat !
Commands.Database.Cooldown=Vous devez attendre 1 seconde avant de pouvoir utiliser cette commande de nouveau.
Commands.Database.Processing=Votre commande pr\u00e9c\u00e9dente est toujours en ex\u00e9cution. Veuillez patienter.
Commands.Disabled=Cette commande est d\u00e9sactiv\u00e9e.
Commands.DoesNotExist=Ce joueur est absent de la base de donn\u00e9es !
Commands.GodMode.Disabled=mcMMO Godmode d\u00e9sactiv\u00e9
Commands.GodMode.Enabled=mcMMO Godmode activ\u00e9
Commands.GodMode.Forbidden=[mcMMO] Le Godmode n\'est pas permis sur ce monde (voir les permissions)
Commands.GodMode.Toggle=Le mode Dieu a \u00e9t\u00e9 modifi\u00e9 pour [[YELLOW]]{0}
Commands.Healthbars.Changed.HEARTS=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en [[RED]]C\u0153urs[[WHITE]].
Commands.Healthbars.Changed.BAR=[mcMMO] Le type d\'affichage de la barre de vie a \u00e9t\u00e9 chang\u00e9 en [[YELLOW]]Bo\u00eetes[[WHITE]].
Commands.Healthbars.Changed.DISABLED=[mcMMO] La barre de vie des entit\u00e9s a \u00e9t\u00e9 [[GRAY]]d\u00e9sactiv\u00e9e[[WHITE]].
Commands.Healthbars.Invalid=Type de barre de vie invalide !
Commands.Inspect=<joueur> [[GREEN]]- Voir les infos d\u00e9taill\u00e9es sur le joueur
Commands.Invite.Success=[[GREEN]]Invitation envoy\u00e9e.
Commands.Leaderboards=<talent> <page> [[GREEN]]- Classement
Commands.mcc.Header=---[][[GREEN]]Commandes McMMO[[RED]][]---
Commands.mcgod=[[GREEN]]- Active/D\u00e9sactive le \"Mode Dieu\"
Commands.mchud.Invalid=Ce n\'est pas un type valide d\'HUD.
Commands.mcpurge.Success=[[GREEN]]La base de donn\u00e9es a \u00e9t\u00e9 purg\u00e9e avec succ\u00e8s !
Commands.mcrank.Heading=[[GOLD]]-=CLASSEMENT PERSONNEL=-
Commands.mcrank.Overall=Toutes competences confondues[[GREEN]] - [[GOLD]]Classement [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=CIBLE : [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Classement [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]Non class\u00e9
Commands.mcrefresh.Success=Le temps d\'attente de {0} a \u00e9t\u00e9 refra\u00eechi.
Commands.mcremove.Success=[[GREEN]]{0} a \u00e9t\u00e9 enlev\u00e9(e) de la base de donn\u00e9es avec succ\u00e8s !
Commands.mctop.Tip=[[GOLD]]Astuce : Utilisez [[RED]]/mcrank[[GOLD]] pour voir vos positions dans les diff\u00e9rents classements !
Commands.mmoedit=[joueur] <comp\u00e9tence> <nouvellevaleur> [[GREEN]] - Modifie la cible
Commands.mmoedit.AllSkills.1=[[GREEN]]Le niveau de tous vos talents a \u00e9t\u00e9 mis \u00e0 {0} !
Commands.mmoedit.Modified.1=[[GREEN]]Votre niveau en {0} a \u00e9t\u00e9 modifi\u00e9 \u00e0 {1}!
Commands.mmoedit.Modified.2={0} a \u00e9t\u00e9 modifi\u00e9 pour {1}.
Commands.mcconvert.Database.Same=Vous utilisez d\u00e9j\u00e0 le/la {0} base de donn\u00e9es !
Commands.mcconvert.Database.InvalidType={0} n\'est pas un type de base de donn\u00e9es valide.
Commands.mcconvert.Database.Start=[[GRAY]]Commencement de la conversion de {0} \u00e0 {1}...
Commands.mcconvert.Database.Finish=[[GRAY]]La migration de la base de donn\u00e9es a \u00e9t\u00e9 achev\u00e9e; la {1} base de donn\u00e9es a d\u00e9sormais toutes les donn\u00e9es de/du {0} base de donn\u00e9es.
Commands.mmoshowdb=La base de donn\u00e9es actuellement utilis\u00e9e est [[GREEN]]{0}
Commands.mcconvert.Experience.Invalid=Type de formule inconnu! Les types valides sont: [[GREEN]]LINEAR [[RED]]and [[GREEN]]EXPONENTIAL.
Commands.mcconvert.Experience.Same=Vous utilisez d\u00e9j\u00e0 une formule type {0}
Commands.mcconvert.Experience.Start=[[GRAY]]Commencement de la conversion de {0} \u00e0 {1}...
Commands.mcconvert.Experience.Finish=[[GRAY]]Changement de formule appliqu\u00e9; utilisation d\u00e9sormais de {0} pour la courbe d\'EXP.
Commands.ModDescription=[[GREEN]]- Lire la br\u00e8ve description du mod
Commands.NoConsole=Cette commande ne peut \u00eatre utilis\u00e9e via la console.
Commands.Notifications.Off=Les notifications des capacit\u00e9s ont \u00e9t\u00e9 [[RED]]d\u00e9sactiv\u00e9es
Commands.Notifications.On=Les notifications des capacit\u00e9s ont \u00e9t\u00e9 [[GREEN]]activ\u00e9es
Commands.Offline=Cette commande ne fonctionne pas sur les joueurs non connect\u00e9s.
Commands.NotLoaded=Le profil du joueur n\'est pas encore charg\u00e9.
Commands.Other=---[][[GREEN]]AUTRES COMMANDES[[RED]][]---
Commands.Party.Header=-----[][[GREEN]]GUILDE[[RED]][]-----
Commands.Party.Features.Header=-----[][[GREEN]]FONCTIONALIT\u00c9S[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]NOM: [[WHITE]]{0} {1} [[DARK_GRAY]]NIVEAU: [[DARK_AQUA]]{2}
Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLIANCES: [[WHITE]]{0}
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Fonctionnalit\u00e9s D\u00e9bloqu\u00e9es: [[GRAY]][[ITALIC]]{0}
Commands.Party.ShareMode=[[DARK_GRAY]]MODE PARTAGE :
Commands.Party.ItemShare=[[GRAY]]OBJETS [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0})
Commands.Party.ItemShareCategories=[[DARK_GRAY]]Partage d\'objets: [[GRAY]][[ITALIC]]{0}
Commands.Party.MembersNear=[[DARK_GRAY]]A C\u00d4T\u00c9 DE VOUS [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=[[GREEN]]- Accepter l\'invitation de la guilde
Commands.Party.Chat.Off=Canal guilde [[RED]]d\u00e9sactiv\u00e9
Commands.Party.Chat.On=Canal guilde [[RED]]activ\u00e9
Commands.Party.Commands=---[][[GREEN]]COMMANDES DE GUILDE[[RED]][]---
Commands.Party.Invite.0=ALERT: [[GREEN]]Vous avez re\u00e7u une invitation de {1} pour rejoindre la guilde {0}
Commands.Party.Invite.1=Tapez [[GREEN]]/party accept[[YELLOW]] pour accepter l\'invitation de guilde
Commands.Party.Invite=[[GREEN]]- Envoyer une invitation de groupe.
Commands.Party.Invite.Accepted=[[GREEN]]Invitation accept\u00e9e. Vous avez rejoint la guilde {0}
Commands.Party.Join=[[GRAY]]a rejoint la guilde: {0}
Commands.Party.Create=[[GRAY]]Groupe Cr\u00e9\u00e9: {0}
Commands.Party.Rename=[[GRAY]]Le nom de la guilde a \u00e9t\u00e9 chang\u00e9 en : [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]Le partage des {0} de la guilde a \u00e9t\u00e9 mis \u00e0: [[DARK_AQUA]]{1}
Commands.Party.ToggleShareCategory=[[GRAY]]Le partage d\'objets de guilde [[GOLD]]{0} [[GRAY]]a \u00e9t\u00e9 [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]La guilde {0} existe d\u00e9j\u00e0!
Commands.Party.Kick=Vous avez \u00e9t\u00e9 \u00e9ject\u00e9 du groupe {0} !
Commands.Party.Leave=Vous avez quitt\u00e9 la guilde.
Commands.Party.Members.Header=-----[][[GREEN]]MEMBRES[[RED]][]-----
Commands.Party.None=Vous n\'\u00eates pas dans une guilde.
Commands.Party.Quit=[[GREEN]]- Quitter votre pr\u00e9sente guilde
Commands.Party.Teleport=[[GREEN]]- Vous t\u00e9l\u00e9porte \u00e0 un membre de la guilde
Commands.Party.Toggle=[[GREEN]]- Active/d\u00e9sactive le tchat de guilde
Commands.Party1=[[GREEN]]- Cr\u00e9er une nouvelle guilde
Commands.Party2=[[GREEN]]- Rejoindre une guilde
Commands.Party.Alliance.Header=-----[][[GREEN]]ALLIANCE DE LA GUILDE[[RED]][]-----
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]EST ALLI\u00c9 AVEC : [[WHITE]]{1}
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]MEMBRES DE L\'ALLIANCE[[RED]][]-----
Commands.Party.Alliance.Invite.0=ALERTE: [[GREEN]]Vous avez re\u00e7u une invitation d\'alliance de guilde de {1} pour {0}
Commands.Party.Alliance.Invite.1=Tapez [[GREEN]]/party alliance accept[[YELLOW]] pour accepter l\'invitation
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Invitation d\'alliance accept\u00e9e.
Commands.Party.Alliance.None=Votre groupe n\'a pas d\'alli\u00e9.
Commands.Party.Alliance.AlreadyAllies=Votre groupe a d\u00e9j\u00e0 une alliance. D\u00e9faites-la avec [[DARK_AQUA]]/party alliance disband
Commands.Party.Alliance.Help.0=Cette guilde n\'a pas form\u00e9 d\'alliance. Invitez un chef de groupe.
Commands.Party.Alliance.Help.1=\u00e0 une alliance [[DARK_AQUA]]/party alliance invite <joueur>[[RED]].
Commands.ptp.Enabled=T\u00e9l\u00e9portation de guilde [[GREEN]]activ\u00e9e
Commands.ptp.Disabled=T\u00e9l\u00e9portation de guilde [[RED]]d\u00e9sactiv\u00e9e
Commands.ptp.NoRequests=Vous n\'avez pas de requ\u00eates de t\u00e9l\u00e9portation en ce moment
Commands.ptp.NoWorldPermissions=[mcMMO] Vous n\'avez pas la permission de vous t\u00e9l\u00e9porter dans le monde {0}.
Commands.ptp.Request1={0} [[GREEN]] vous a envoy\u00e9 une requ\u00eate de t\u00e9l\u00e9portation vers vous.
Commands.ptp.Request2=[[GREEN]]pour vous t\u00e9l\u00e9porter, tapez [[YELLOW]]/ptp accept[[GREEN]]. La requ\u00eate expire dans [[RED]]{0} [[GREEN]]secondes.
Commands.ptp.AcceptAny.Enabled=Confirmation de la demande de t\u00e9l\u00e9portation de guilde [[GREEN]]activ\u00e9e
Commands.ptp.AcceptAny.Disabled=Confirmation de la demande de t\u00e9l\u00e9portation du guilde [[RED]]d\u00e9sactiv\u00e9e
Commands.ptp.RequestExpired=La requ\u00eate de t\u00e9l\u00e9portation de guilde a expir\u00e9!
Commands.PowerLevel.Leaderboard=--Classement mcMMO ([[BLUE]]Niveau Global[[YELLOW]])--
Commands.PowerLevel.Capped=[[DARK_RED]]NIVEAU GLOBAL: [[GREEN]]{0} [[DARK_RED]]NIVEAU MAX ATTEINT: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]NIVEAU GLOBAL : [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]Toutes vos comp\u00e9tences ont \u00e9t\u00e9 remises \u00e0 zero.
Commands.Reset.Single=[[GREEN]]Ta comp\u00e9tence {0} a \u00e9t\u00e9 remise \u00e0 zero.
Commands.Reset=[[GREEN]]- Remise \u00e0 0 d\'un talent
Commands.Scoreboard.Clear=[[DARK_AQUA]]Le tableau des scores McMMO a \u00e9t\u00e9 enlev\u00e9.
Commands.Scoreboard.NoBoard=Le tableau des scores McMMO n\'est pas actif.
Commands.Scoreboard.Keep=[[DARK_AQUA]]Le tableau des scores McMMO restera affich\u00e9 tant que vous n\'utiliserez pas [[GREEN]]/mcscoreboard clear[[DARK_AQUA]].
Commands.Scoreboard.Timer=[[DARK_AQUA]]Le tableau des scores mcMMO sera enlev\u00e9 dans [[GOLD]]{0}[[DARK_AQUA]] secondes \u00e0 compter de maintenant.
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Aide pour [[RED]]/mcscoreboard[[GOLD]] ==
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - enl\u00e8ve le tableau des scores McMMO
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - Garde le tableau des scores affich\u00e9
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - enl\u00e8ve le tableau des scores McMMO apr\u00e8s [[LIGHT_PURPLE]]n[[WHITE]] secondes
Commands.Scoreboard.Tip.Keep=[[GOLD]]Astuce : Utilisez [[RED]]/mcscoreboard keep[[GOLD]] quand le tableau des scores est affich\u00e9 pour l\'emp\u00eacher de s\'en aller.
Commands.Scoreboard.Tip.Clear=[[GOLD]]Astuce : Utilisez [[RED]]/mcscoreboard clear[[GOLD]] pour de d\u00e9barrasser du tableau des scores.
Commands.Skill.Invalid=Ce talent n\'existe pas !
Commands.Skill.Leaderboard=--Classement mcMMO ([[BLUE]]{0}[[YELLOW]])--
Commands.SkillInfo=[[GREEN]]- Voir des informations d\u00e9taill\u00e9es \u00e0 propos d\'un talent
Commands.Stats.Self=VOS STATISTIQUES
Commands.Stats=[[GREEN]]- Voir vos statistiques McMMO
Commands.ToggleAbility=[[GREEN]]- Active/D\u00e9sactive la possibilit\u00e9 d\'activation d\'une capacit\u00e9 avec un clic droit
Commands.Usage.0=L\'utilisation correcte est /{0}
Commands.Usage.1=L\'utilisation correcte est /{0} {1}
Commands.Usage.2=L\'utilisation correcte est /{0} {1} {2}
Commands.Usage.3=L\'utilisation correcte est /{0} {1} {2} {3}
Commands.Usage.FullClassName=nom de classe
Commands.Usage.Level=niveau
Commands.Usage.Message=message
Commands.Usage.Page=page
Commands.Usage.PartyName=nom
Commands.Usage.Password=mot de passe
Commands.Usage.Player=joueur
Commands.Usage.Rate=taux
Commands.Usage.Skill=Comp\u00e9tence
Commands.Usage.XP=exp
mcMMO.NoInvites=Vous n\'avez pas \u00e9t\u00e9 invit\u00e9
mcMMO.NoPermission=[[DARK_RED]]Vous n\'avez pas les droits.
mcMMO.NoSkillNote=[[DARK_GRAY]]Si vous n\'avez pas les droits pour une comp\u00e9tence, il n\'appara\u00eetra pas ici.
Party.Forbidden=[mcMMO] Les groupes ne sont pas permis dans ce monde (voir les permissions)
Party.Help.0=L\'utilisation correcte est [[DARK_AQUA]]{0} <joueur> [mot de passe].
Party.Help.1=pour cr\u00e9er une guilde, utilisez [[DARK_AQUA]]{0} <name> [mot de passe].
Party.Help.2=Consultez [[DARK_AQUA]]{0} [[RED]]pour plus d\'informations
Party.Help.3=Utilisez [[DARK_AQUA]]{0} <player> [motdepasse] [[RED]]pour rejoindre, ou [[DARK_AQUA]]{1} [[RED]]pour quitter
Party.Help.4=Pour bloquer ou d\u00e9bloquer votre groupe, utilisez [[DARK_AQUA]]{0}
Party.Help.5=Pour prot\u00e9ger votre guilde avec un mot de passe, utilisez [[DARK_AQUA]]{0} <password>
Party.Help.6=Pour expulser un joueur de la guilde, utilisez [[DARK_AQUA]]{0} <player>
Party.Help.7=Pour transmettre la possession de votre groupe, utilisez [[DARK_AQUA]]{0} <player>
Party.Help.8=Pour d\u00e9faire le groupe, utilisez [[DARK_AQUA]]{0}
Party.Help.9=Utilisez [[DARK_AQUA]]{0} [[RED]]pour partager des objets avec les membres du groupe
Party.Help.10=Utilisez [[DARK_AQUA]]{0} [[RED]]pour activer le partage d\'EXP entre les membres du groupe.
Party.InformedOnJoin={0} [[GREEN]]a rejoint votre groupe
Party.InformedOnQuit={0} [[GREEN]]a quitt\u00e9 votre groupe
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]a modifi\u00e9 le nom du groupe en [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]Ce n\'est pas un nom valide de guilde.
Party.Invite.Self=Vous ne pouvez pas vous inviter vous-m\u00eame !
Party.IsLocked=Ce groupe est d\u00e9j\u00e0 verrouill\u00e9 !
Party.IsntLocked=Cette guilde n\'est pas verrouill\u00e9e !
Party.Locked=Le groupe est verrouill\u00e9, seul le chef de groupe peut inviter.
Party.NotInYourParty=[[DARK_RED]]{0} n\'est pas dans votre guilde.
Party.NotOwner=[[DARK_RED]]Vous n\'\u00eates pas le chef de cette guilde.
Party.Target.NotOwner=[[DARK_RED]]{0} n\'est pas le chef de la guilde.
Party.Owner.New=[[GREEN]]{0} est le nouveau chef de la guilde.
Party.Owner.NotLeader=[[DARK_RED]]Vous n\'\u00eates d\u00e9sormais plus le chef de la guilde.
Party.Owner.Player=[[GREEN]]Vous \u00eates d\u00e9sormais le chef de la guilde.
Party.Password.None=Cette guilde est prot\u00e9g\u00e9e par un mot de passe. S\'il vous pla\u00eet, renseignez le mot de passe pour la rejoindre.
Party.Password.Incorrect=Le mot de passe de la guilde est incorrect.
Party.Password.Set=[[GREEN]]Mot de passe de la guilde r\u00e9gl\u00e9 \u00e0 {0}
Party.Password.Removed=[[GREEN]]Le mot de passe du groupe a \u00e9t\u00e9 enlev\u00e9.
Party.Player.Invalid=Ce joueur n\'existe pas.
Party.NotOnline=[[DARK_RED]]{0} n\'est pas connect\u00e9 !
Party.Player.InSameParty={0} est d\u00e9j\u00e0 dans votre guilde !
Party.PlayerNotInParty=[[DARK_RED]]{0} n\'est pas dans votre guilde
Party.Specify=Vous devez sp\u00e9cifier une guilde.
Party.Teleport.Dead=Vous ne pouvez pas vous t\u00e9l\u00e9porter sur un joueur mort.
Party.Teleport.Hurt=Vous avez \u00e9t\u00e9 bless\u00e9 dans les derni\u00e8res {0} secondes et vous ne pouvez par cons\u00e9quent pas \u00eatre t\u00e9l\u00e9port\u00e9.
Party.Teleport.Player=[[GREEN]]Vous vous \u00eates t\u00e9l\u00e9port\u00e9 sur {0}.
Party.Teleport.Self=Vous ne pouvez pas vous t\u00e9l\u00e9porter \u00e0 vous m\u00eame !
Party.Teleport.Target=[[GREEN]]{0} s\'est t\u00e9l\u00e9port\u00e9 sur vous.
Party.Teleport.Disabled={0} n\'a pas rendu possible la t\u00e9l\u00e9portation.
Party.Rename.Same=C\'est d\u00e9j\u00e0 le nom de votre groupe!
Party.Join.Self=Vous ne pouvez pas vous rejoindre vous-m\u00eame !
Party.Unlocked=[[GRAY]]Le groupe est d\u00e9verrouill\u00e9.
Party.Disband=[[GRAY]]La guilde a \u00e9t\u00e9 dissoute
Party.Alliance.Formed=[[GRAY]]Votre groupe est d\u00e9sormais alli\u00e9 avec [[GREEN]]{0}
Party.Alliance.Disband=[[GRAY]]Votre groupe n\'est d\u00e9sormais plus alli\u00e9 avec [[RED]]{0}
Party.Status.Locked=[[DARK_RED]](INVITATION-SEULEMENT)
Party.Status.Unlocked=[[DARK_GREEN]](OUVERT)
Party.LevelUp=Le niveau de votre guilde a \u00e9t\u00e9 augment\u00e9 de {0}. Total ({1})
Party.Feature.Chat=Tchat de guilde
Party.Feature.Teleport=T\u00e9l\u00e9portation de guilde
Party.Feature.Alliance=Alliances
Party.Feature.ItemShare=Partage d\'objets
Party.Feature.XpShare=Partage d\'EXP
Party.Feature.Locked.Chat=Bloqu\u00e9 jusqu\'\u00e0 {0}+ (Tchat de guilde)
Party.Feature.Locked.Teleport=Bloqu\u00e9 jusqu\'\u00e0 {0}+ (T\u00e9l\u00e9portation de guilde)
Party.Feature.Locked.Alliance=Bloqu\u00e9 jusqu\'\u00e0 {0}+ (Alliances)
Party.Feature.Locked.ItemShare=Bloqu\u00e9 jusqu\'\u00e0 {0}+ (Partage d\'objets)
Party.Feature.Locked.XpShare=Bloqu\u00e9 jusqu\'\u00e0 {0}+ (Partage d\'EXP)
Party.Feature.Disabled.1=Le tchat de guilde n\'est pas d\u00e9bloqu\u00e9 pour le moment.
Party.Feature.Disabled.2=La t\u00e9l\u00e9portation de guilde n\'est pas d\u00e9bloqu\u00e9e pour le moment.
Party.Feature.Disabled.3=Les alliances de guilde ne sont pas d\u00e9bloqu\u00e9es pour le moment.
Party.Feature.Disabled.4=Le partage d\'objets avec la guilde n\'est pas d\u00e9bloqu\u00e9 pour le moment.
Party.Feature.Disabled.5=Le partage d\'EXP gr\u00e2ce \u00e0 la guilde n\'est pas d\u00e9bloqu\u00e9 pour le moment.
Party.ShareType.Xp=EXP
Party.ShareType.Item=OBJET
Party.ShareMode.None=AUCUN
Party.ShareMode.Equal=EGAL
Party.ShareMode.Random=Al\u00e9atoire
Party.ItemShare.Category.Loot=R\u00e9compenses
Party.ItemShare.Category.Mining=Minage
Party.ItemShare.Category.Herbalism=Herboristerie
Party.ItemShare.Category.Woodcutting=B\u00fbcheronnage
Party.ItemShare.Category.Misc=Divers
Commands.XPGain.Acrobatics=Chuter
Commands.XPGain.Alchemy=Confection de potions
Commands.XPGain.Archery=Attaquer des monstres
Commands.XPGain.Axes=Attaquer des monstres
Commands.XPGain.Child=Gagne les niveaux des Talents Parents
Commands.XPGain.Excavation=Creuser et d\u00e9couvrir des tr\u00e9sors
Commands.XPGain.Fishing=P\u00eacher
Commands.XPGain.Herbalism=Cueillette de v\u00e9g\u00e9taux
Commands.XPGain.Mining=Miner de la Pierre & des Minerais
Commands.XPGain.Repair=R\u00e9paration
Commands.XPGain.Swords=Attaquer des monstres
Commands.XPGain.Taming=Apprivoisement d\'Animaux, ou combat avec vous loups
Commands.XPGain.Unarmed=Attaquer des monstres
Commands.XPGain.Woodcutting=Abbatage de bois
Commands.XPGain=[[DARK_GRAY]]Gain d\'exp\u00e9rience: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Votre barre d\'XP est maintenant verrouill\u00e9e sur {0} !
Commands.xplock.unlocked=[[GOLD]]Votre barre d\'XP est maintenant [[GREEN]]D\u00c9VERROUILL\u00c9E[[GOLD]] !!
Commands.xprate.modified=Le TAUX D\'EXP a \u00e9t\u00e9 pass\u00e9 \u00e0 {0}
Commands.xprate.over=L\u2019\u00e9v\u00e9nement de bonus d\'XP mcMMO est TERMIN\u00c9 !!
Commands.xprate.proper.0=L\'usage correct pour changer le taux d\'XP est /xprate <valeur> <true/false>
Commands.xprate.proper.1=L\'usage correct pour restaurer le taux d\'XP est /xprate reset
Commands.xprate.proper.2=Veuillez sp\u00e9cifier true ou false pour indiquer si il s\'agit ou pas d\'un \u00e9v\u00e9nement temporaire
Commands.xprate.started.0=[[GOLD]]L\u2019\u00c9V\u00c9NEMENT BONUS D\'XP mcMMO VIENT DE COMMENCER !
Commands.xprate.started.1=[[GOLD]]Le bonus d\'XP mcMMO est maintenant de {0}x !
XPRate.Event=[[GOLD]]Un \u00e9v\u00e9nement bonus d\'Exp\u00e9rience est actuellement lanc\u00e9 ! Le bonus est de {0}x !
Effects.Effects=EFFETS
Effects.Child=[[DARK_GRAY]]NIVEAU: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]NIV : [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0} : [[GREEN]]{1}
Guides.Available=[[GRAY]]Guide pour le/la {0} est disponible - \u00e9crivez /{1} ? [page]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guide[[GOLD]]=-
Guides.Page.Invalid=Le num\u00e9ro de page est invalide
Guides.Page.OutOfRange=Cette page n\'existe pas, il y a seulement {0} pages totales.
Guides.Usage=L\'utilisation est /{0} ? [page]
Guides.Acrobatics.Section.0=[[DARK_AQUA]]A propos de l\'Acrobatie:\n[[YELLOW]]L\'acrobatie est l\'art de bouger gracieusement dans mcMMO.\n[[YELLOW]]Donne des bonus au combat et de r\u00e9sistance aux d\u00e9g\u00e2ts physiques.\n[[DARK_AQUA]]GAIN D\'XP:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience, vous devez esquiver des d\u00e9g\u00e2ts\n[[YELLOW]]en combat ou encaisser des d\u00e9g\u00e2ts de chute.
Guides.Acrobatics.Section.1=[[DARK_AQUA]]Comment fonctionne la Roulade?\n[[YELLOW]]Vous avez une chance, lorsque vous prenez des d\u00e9g\u00e2ts dus \u00e0 une chute,\n[[YELLOW]]d\'esquiver ces d\u00e9g\u00e2ts. Maintenez la touche pour s\'accroupir\n[[YELLOW]]pour doubler les chances d\'esquiver ces d\u00e9g\u00e2ts.\n[[YELLOW]]Cette manipulation activera la Roulade Gracieuse. \n[[YELLOW]]La Roulade Gracieuse fonctionne comme une Roulade classique,\n[[YELLOW]]mais vous avez deux fois plus de chance d\'\u00e9chapper aux d\u00e9g\u00e2ts.\n[[YELLOW]]Votre pourcentage de chance de Roulade d\u00e9pend du niveau de votre Comp\u00e9tence.
Guides.Acrobatics.Section.2=[[DARK_AQUA]]Comment fonctionne l\'esquive?\n[[YELLOW]]L\'esquive est une capacit\u00e9 passive qui peut vous permettre de\n[[YELLOW]]diminuer les d\u00e9g\u00e2ts de moiti\u00e9 lorsque vous \u00eates bless\u00e9 au combat.\n[[YELLOW]]Les chances d\'esquiver sont fonction de votre niveau de comp\u00e9tence.
Guides.Alchemy.Section.0=[[DARK_AQUA]]A propos de l\'alchimie:\n[[YELLOW]]L\'alchimie est l\'art de pr\u00e9parer des potions.\n[[YELLOW]]Donne des bonus de vitesse \u00e0 la pr\u00e9paration des potions mais aussi\n[[YELLOW]]l\'ajout de nouvelles potions (pr\u00e9c\u00e8demment) incraftables.\n[[DARK_AQUA]]GAIN D\'XP:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience vous devez pr\u00e9parer des potions.
Guides.Alchemy.Section.1=[[DARK_AQUA]]Comment fonctionne Catalyse?\n[[YELLOW]]Catalyse acc\u00e8lere le processus de pr\u00e9paration des potions,\n[[YELLOW]]jusqu\'\u00e0 4x plus vite au niveau 1000.\n[[YELLOW]]Par d\u00e9faut, cette capacit\u00e9 est d\u00e9bloqu\u00e9e au niveau 100.
Guides.Alchemy.Section.2=[[DARK_AQUA]]Comment fonctionne Concoction?\n[[YELLOW]]Concoction vous permet de pr\u00e9parer plus de potions \u00e0 l\'aide [[YELLOW]]d\'ingr\u00e9dients sp\u00e9ciaux..\n[[YELLOW]]Les ingr\u00e9dients que vous pouvez utiliser sont d\u00e9termin\u00e9s\n[[YELLOW]]par votre rang. Il y a 8 rangs \u00e0 d\u00e9bloquer.
Guides.Alchemy.Section.3=[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 4 :\n[[YELLOW]]Poudre d\'Incendiaire, \u0152il Ferment\u00e9 d\u2019Araign\u00e9e, Larme de Ghast, Redstone,\n[[YELLOW]]Poudre de Pierre Lumineuse, Sucre, Melon Scintillant, Carotte Dor\u00e9e,\n[[YELLOW]]Cr\u00e8me de Magma, Verrue du Nether, \u0152il d\'Araign\u00e9e, Poudre \u00e0 Canon, N\u00e9nuphar,\n[[YELLOW]]Poisson-Globe\n[[YELLOW]](Potions de Minecraft Vanilla)
Guides.Alchemy.Section.4=[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 2 :\n[[YELLOW]]Carotte (Potion de H\u00e2te)\n[[YELLOW]]Boule de Slime (Potion de Lassitude)\n[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 3 :\n[[YELLOW]]Quartz (Potion d\'Absorption)\n[[YELLOW]]Champignon Rouge (Potion de Saut Boost\u00e9)
Guides.Alchemy.Section.5=[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 4 :\n[[YELLOW]]Pomme (Potion de Boost de Vie)\n[[YELLOW]]Viande Putr\u00e9fi\u00e9e (Potion de Faim)\n[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 5 :\n[[YELLOW]]Champignon Brun (Potion de Naus\u00e9e)\n[[YELLOW]]Poche d\'Encre (Potion d\'Aveuglement)
Guides.Alchemy.Section.6=[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 6 :\n[[YELLOW]]Herbes Hautes (Potion de Saturation)\n[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 7 :\n[[YELLOW]]Patate Empoisonn\u00e9e (Potion de Wither)\n[[DARK_AQUA]]Ingr\u00e9dients pour la confections de niveau 8 :\n[[YELLOW]]Pomme d\'or normale (Potion de R\u00e9sistance)
Guides.Archery.Section.0=[[DARK_AQUA]]A propos de l\'Archerie:\n[[YELLOW]]L\'archerie est l\'art du tir \u00e0 l\'arc.\n[[YELLOW]]Cette comp\u00e9tence fournit divers bonus de combat, par exemple une\n[[YELLOW]]augmentation des d\u00e9g\u00e2ts proportionelle \u00e0 votre niveau, la capacit\u00e9\n[[YELLOW]]de rendre confus d\'autres joueurs en PvP,etc. En plus de cela, vous\n[[YELLOW]]pouvez aussi r\u00e9cup\u00e9rer quelques fl\u00e8ches des corps de vos ennemis.\n[[DARK_AQUA]]GAIN D\'XP:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience dans cette discipline vous devez infliger\n[[YELLOW]]des d\u00e9g\u00e2ts \u00e0 l\'aide de vos fl\u00e8ches.
Guides.Archery.Section.1=[[DARK_AQUA]]Comment fonctionne tir pr\u00e9cis?\n[[YELLOW]]Tir pr\u00e9cis augmente les d\u00e9g\u00e2ts de vos tirs.\n[[YELLOW]]L\'augmentation des d\u00e9g\u00e2ts est fonction de\n[[YELLOW]]votre niveau en tir \u00e0 l\'arc..\n[[YELLOW]]Par d\u00e9faut, vos d\u00e9g\u00e2ts augmentent de 10% tous les\n[[YELLOW]]50 niveaux, jusqu\'\u00e0 un maximum de 200% de bonus.
Guides.Archery.Section.2=[[DARK_AQUA]]Comment fonctionne d\u00e9sorienter?\n[[YELLOW]]Vous avez une chance de d\u00e9sorienter votre cible lorsque vous lui\n[[YELLOW]]tirez dessus. Sous l\'effet de d\u00e9sorienter, votre cible regarde droit\n[[YELLOW]]vers le ciel pendant une courte dur\u00e9e.\n[[YELLOW]]Un tir qui d\u00e9soriente inflige 4 d\u00e9g\u00e2ts suppl\u00e9mentaires (2 coeurs).
Guides.Archery.Section.3=[[DARK_AQUA]]Comment fonctionne la r\u00e9cup\u00e9ration de fl\u00e8ches?\n[[YELLOW]]Vous avez une chance de r\u00e9cup\u00e9rer certaines de vos fl\u00e8ches\n[[YELLOW]]lorsque vous tuez un mob \u00e0 l\'arc.\n[[YELLOW]]Cette chance augmente avec votre niveau en Tir \u00e0 l\'arc.\n[[YELLOW]]Cette capacit\u00e9 augmente de 0.1% par niveau, jusqu\'\u00e0 100%\n[[YELLOW]]au niveau 1000.
Guides.Axes.Section.0=[[DARK_AQUA]]Concernant les Haches:\n[[YELLOW]]Avec la comp\u00e9tence Hache vous pouvez utiliser votre Hache pour bien plus\n[[YELLOW]]que de la d\u00e9forestation! Vous pourrez d\u00e9couper des mobs et des joueurs\n[[YELLOW]]pour gagner de l\'exp\u00e9rience, attaquer des mobs avec un effet de recul\n[[YELLOW]]et infliger des coups critiques MORTELS sur mobs et joueurs.\n[[YELLOW]]Votre hache devient aussi un outil redoutable pour perforer\n[[YELLOW]]l\'armure de vos ennemis au fur et \u00e0 mesure que votre niveau\n[[YELLOW]]augmente.\n[[DARK_AQUA]]Gain d\'exp\u00e9rience:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience, il vous faut attaquer un joueur ou un mob\n[[YELLOW]]avec une Hache.
Guides.Axes.Section.1=[[DARK_AQUA]]Comment fonctionne le Pourfendeur de Cr\u00e2nes?\n[[YELLOW]]Cette capacit\u00e9 vous permet d\'infliger des d\u00e9g\u00e2ts de zone.\n[[YELLOW]]Ce d\u00e9g\u00e2t de zone infligera la moiti\u00e9 de ce que vous avez inflig\u00e9 \u00e0 votre\n[[YELLOW]]cible principale et s\'av\u00e8re donc utile pour s\'attaquer \u00e0 des hordes de mobs.
Guides.Axes.Section.2=[[DARK_AQUA]]Comment fonctionne le Coup Critique?\n[[YELLOW]]Le Coup Critique est une capacit\u00e9 automatique qui donne une chance\n[[YELLOW]]d\'infliger des d\u00e9g\u00e2ts suppl\u00e9mentaires.\n[[YELLOW]]Par d\u00e9faut, par pallier de 2 niveaux dans la Comp\u00e9tence Hache, vous gagnez\n[[YELLOW]]0.1% de chance de porter le Coup Critique, causant 2 fois plus de d\u00e9g\u00e2ts aux mobs\n[[YELLOW]]ou 1.5 fois de d\u00e9g\u00e2ts aux joueurs.
Guides.Axes.Section.3=[[DARK_AQUA]]Comment fonctionne la Ma\u00eetrise de la Hache?\n[[YELLOW]] la Ma\u00eetrise de la Hache est une capacit\u00e9 automatique qui permet d\'infliger plus de d\u00e9g\u00e2ts\n[[YELLOW]]\u00e0 vos cibles en utilisant une Hache.\n[[YELLOW]]Par d\u00e9faut, ce bonus augmente vos d\u00e9g\u00e2t inflig\u00e9s de 1 par pallier de 50 niveaux\n[[YELLOW]]pour atteindre un maximum de 4 au niveau 200.
Guides.Axes.Section.4=[[DARK_AQUA]]Comment fonctionne l\'Impact d\'Armure?\n[[YELLOW]]Frappez avez suffisamment de force pour briser une armure!\n[[YELLOW]]Cette capacit\u00e9 a une chance passive de d\u00e9t\u00e9riorer l\'armure de votre ennemi.\n[[YELLOW]] de votre ennemi. Ces d\u00e9g\u00e2ts augmentent avec votre niveau de la Comp\u00e9tence Haches.
Guides.Axes.Section.5=[[DARK_AQUA]]Comment fonctionne l\'Impact Am\u00e9lior\u00e9?\n[[YELLOW]]Vous avez une chance, automatique, pour obtenir un impact plus important\n[[YELLOW]]lorsque vous attaquez avec votre hache.\n[[YELLOW]]Par d\u00e9faut cette chance est de 25%. Cette capacit\u00e9 a\n[[YELLOW]]un effet de recul consid\u00e9rable, similaire \u00e0 l\u2019enchantement Frappe II.\n[[YELLOW]]En plus, les d\u00e9g\u00e2ts sont augment\u00e9s avec cette capacit\u00e9.
Guides.Excavation.Section.0=[[DARK_AQUA]]A propos de l\'Excavation :\n[[YELLOW]]L\'Excavation est l\'action de creuser la terre pour y trouver des tr\u00e9sors.\n[[YELLOW]]En excavant le monde, vous trouverez des tr\u00e9sors.\n[[YELLOW]]Plus vous effectuerez ceci, plus vous pourrez trouver de tr\u00e9sors.\n[[DARK_AQUA]]Gain d\'exp\u00e9rience:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence vous devez creuser avec une pelle en main.\n[[YELLOW]]Seulement certains mat\u00e9riaux peuvent \u00eatre creus\u00e9s pour des tr\u00e9sors et de l\'exp\u00e9rience.
Guides.Excavation.Section.1=[[DARK_AQUA]]Mat\u00e9riaux compatibles:\n[[YELLOW]]Herbe, Terre, Sable, Argile, Gravier, Mycelium, Sable des \u00e2mes
Guides.Excavation.Section.2=[[DARK_AQUA]]Comment utiliser le Giga Broyeur:\n[[YELLOW]]Avec une pioche dans votre main, faites clic droit pour pr\u00e9parer votre outil.\n[[YELLOW]]Une fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n[[YELLOW]]des mat\u00e9riaux compatibles, ce qui activera le Broyeur.
Guides.Excavation.Section.3=[[DARK_AQUA]]Comment fonctionne Foreur?\n[[YELLOW]]Foreur est une capacit\u00e9 avec temps de recharge, li\u00e9e\n[[YELLOW]]\u00e0 votre comp\u00e9tence d\'excavation. Cela triple les chances\n[[YELLOW]]de trouver des tr\u00e9sors et d\u00e9truis instantan\u00e9ment les\n[[YELLOW]]blocs excavables.
Guides.Excavation.Section.4=[[DARK_AQUA]]Comment fonctionne Chasseur de Tr\u00e9sors?\n[[YELLOW]]Les tr\u00e9sors r\u00e9cup\u00e9rables requi\u00e8rent d\'avoir un certain niveau\n[[YELLOW]]en excavation pour avoir une chance de les faire tomber, en [[YELLOW]]cons\u00e9quence de quoi il est difficile d\'estimer son utilit\u00e9.\n[[YELLOW]]Mais gardez \u00e0 l\'esprit que plus votre niveau est \u00e9lev\u00e9,\n[[YELLOW]]plus vous pourrez trouver de tr\u00e9sors diff\u00e9rents.\n[[YELLOW]]Rappelez vous aussi que chaque type de bloc excavable\n[[YELLOW]]contient sa propre liste de tr\u00e9sors uniques.\n[[YELLOW]]En d\'autres termes, vous trouverez des tr\u00e9sors diff\u00e9rents en creusant\n[[YELLOW]]du sable plut\u00f4t que du gravier (par exemple).
Guides.Excavation.Section.5=[[DARK_AQUA]]Notes sur l\'Excavation:\n[[YELLOW]]Les loots de l\'excavation sont enti\u00e8rement modifiables\n[[YELLOW]]donc les r\u00e9sultats varient selon les serveurs.
Guides.Fishing.Section.0=[[DARK_AQUA]]Concernant la P\u00eache:\n[[YELLOW]]La Comp\u00e9tence P\u00eache rend la P\u00eache int\u00e9ressante!\n[[YELLOW]]Trouvez des tr\u00e9sors cach\u00e9s, et d\u00e9robez des objets aux mobs!\n[[DARK_AQUA]]Gain d\'Exp\u00e9rience:\n[[YELLOW]]P\u00eachez des poissons!
Guides.Fishing.Section.1=[[DARK_AQUA]]Comment fonctionne le Chasseur de Tr\u00e9sors?\n[[YELLOW]]Cette capacit\u00e9 vous permet de trouver des tr\u00e9sors en p\u00eachant\n[[YELLOW]]avec une petite chance de trouver des objets enchant\u00e9s.\n[[YELLOW]]Tous les tr\u00e9sors possibles sont trouvables \u00e0 n\'importe\n[[YELLOW]]quel niveau de la Comp\u00e9tence P\u00eache. Trouver un objet\n[[YELLOW]]d\u00e9pend n\u00e9anmoins de la raret\u00e9 de ce dernier.\n[[YELLOW]]Plus votre Comp\u00e9tence P\u00eache est \u00e9lev\u00e9e, plus\n[[YELLOW]]vous aurez de chances de trouver de meilleurs tr\u00e9sors!
Guides.Fishing.Section.2=[[DARK_AQUA]]Comment fonctionne la P\u00eache sur Glace?\n[[YELLOW]]Cette capacit\u00e9 passive vous permet de p\u00eacher sur des lacs gel\u00e9s!\n[[YELLOW]]Lancez votre cane \u00e0 p\u00eache dans un lac gel\u00e9 et cette capacit\u00e9\n[[YELLOW]]cr\u00e9era un trou dans la glace pour p\u00eacher.
Guides.Fishing.Section.3=[[DARK_AQUA]]Comment fonctionne Ma\u00eetre P\u00eacheur?\n[[YELLOW]]Cette capacit\u00e9 passive augmente la chance d\'une touche sur votre ligne de p\u00eache.\n[[YELLOW]]Lorsque vous avez d\u00e9bloqu\u00e9 cette capacit\u00e9, en p\u00eachant dans un bateau\n[[YELLOW]]ou lorsque vous \u00eates dans un biome oc\u00e9an, la chance d\'une touche est doubl\u00e9e.
Guides.Fishing.Section.4=[[DARK_AQUA]]Comment fonctionne la Secousse?\n[[YELLOW]]Cette capacit\u00e9 active vous permet de r\u00e9cup\u00e9rer des objets sur les mobs\n[[YELLOW]]en les crochetant avec une cane \u00e0 p\u00eache.\n[[YELLOW]]Les mobs feront alors tomber au sol ce qu\'ils laisseraient normalement \u00e0 leur mort.\n[[YELLOW]]Il est aussi possible de r\u00e9cup\u00e9rer des cr\u00e2nes de mobs, qui sont normalement\n[[YELLOW]]non r\u00e9cup\u00e9rables.
Guides.Fishing.Section.5=[[DARK_AQUA]]Comment fonctionne le Repas du P\u00eacheur?\n[[YELLOW]]Cette capacit\u00e9 passive vous permet d\'augmenter la vie r\u00e9cup\u00e9r\u00e9e\n[[YELLOW]]en mangeant du poisson.
Guides.Fishing.Section.6=[[DARK_AQUA]]Notes sur la P\u00eache:\n[[YELLOW]]Les loots de la P\u00eache sont enti\u00e8rement modifiables\n[[YELLOW]]donc les r\u00e9sultats varient selon les serveurs.
Guides.Herbalism.Section.0=[[DARK_AQUA]]A propos de l\'herboristerie:\n[[YELLOW]]L\'herboristerie concerne la culture et la r\u00e9colte de plantes et d\'herbes.\n[[DARK_AQUA]]GAIN D\'XP:\n[[YELLOW]]R\u00e9colte de plantes et d\'herbes.
Guides.Herbalism.Section.1=[[DARK_AQUA]]Blocs compatibles\n[[YELLOW]]Bl\u00e9, Potatoes, Carrotes, Melons, \n[[YELLOW]]Citrouilles, Canne \u00e0 sucre, F\u00e8ves de Cacao, Fleurs, Cactus, Champignons,\n[[YELLOW]]Verrues du Nether, N\u00e9nuphars, et Lianes.
Guides.Herbalism.Section.2=[[DARK_AQUA]]Comment fonctionne Main Verte?\n[[YELLOW]]Main Verte est une capacit\u00e9 activ\u00e9e, gr\u00e2ce \u00e0 un clic-droit\n[[YELLOW]]lorsque vous tenez une houe.\n[[YELLOW]]Main Verte donne au joueur une chance de r\u00e9cup\u00e9rer 3x ce que\n[[YELLOW]]donnerai la plante r\u00e9colt\u00e9e. Vous pouvez \u00e9galement utiliser des\n[[YELLOW]]graines pour insufler la vie \u00e0 certains blocs \n[[YELLOW]]afin de les transformer.
Guides.Herbalism.Section.3=[[DARK_AQUA]]Comment Mains Vertes (Plantations) fonctionne ?\n[[YELLOW]]Cette capacit\u00e9 passive va automatiquement replanter les \n[[YELLOW]]plantations lorsque celles-ci ont \u00e9t\u00e9 r\u00e9colt\u00e9es.\n[[YELLOW]]Les chances de succ\u00e8es d\u00e9pendent de votre talent Herborisme.
Guides.Herbalism.Section.4=[[DARK_AQUA]]Comment Mains Vertes (Pierre/Briques de Pierre/Terre) fonctionent-elles ?\n[[YELLOW]]Cette cpacit\u00e9 active vous permet de transformer les blocs dans leur\n[[YELLOW]]forme homologue (Pierre Moussue/Brique de Pierre Moussue/Herbe).\n[[YELLOW]]Vous pouvez faire ceci en effectuant un clic droit\n[[YELLOW]]sur le bloc, en tenant des graines. une graine sera alors consomm\u00e9e.
Guides.Herbalism.Section.5=[[DARK_AQUA]]Comment fonctionne r\u00e9gime fermier?\n[[YELLOW]]Cette capacit\u00e9 passive augmente le montant d\'\u00e9nergie rendue \n[[YELLOW]]lorsque vous mangez du pain, cookies, past\u00e8que, soupe \n[[YELLOW]]de champignons, carottes et patates.
Guides.Herbalism.Section.6=[[DARK_AQUA]]Comment fonctione Chance d\'Hyrule?\n[[YELLOW]]Cette capacit\u00e9 passive vous donne une chance de trouver des\n[[YELLOW]]objets rares lorsque vous cassez certains blocs avec une \u00e9p\u00e9e.
Guides.Herbalism.Section.7=[[DARK_AQUA]]Comment fonctionne Double Drops?\n[[YELLOW]]Cette capacit\u00e9 passive donne au joueur\n[[YELLOW]]plus d\'objets lors de ses r\u00e9coltes.
Guides.Mining.Section.0=[[DARK_AQUA]]A propos du Minage:\n[[YELLOW]]Le Minage consiste \u00e0 miner de la pierre et des minerais.\n[[YELLOW]]Il occtroie des bonus sur le nombre de minerais obtenus lors du minage.\n[[DARK_AQUA]]Gain d\'exp\u00e9rience:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience dans cette comp\u00e9tence, vous devez simplement miner avec une pioche.\n[[YELLOW]]Seulement certains blocs rapportent de l\'exp\u00e9rience.
Guides.Mining.Section.1=[[DARK_AQUA]]Mat\u00e9riaux compatibles:\n[[YELLOW]]Pierre lisse, Minerais de Charbon, Minerais de Fer, Minerais d\'Or, Minerais de Diamant, Minerais de Redstone,\n[[YELLOW]]Minerais de Lapis, Obsidienne, Pierre Moussue, Pierre de l\'End,\n[[YELLOW]]Pierre Lumineuse, et Netherrack.
Guides.Mining.Section.2=[[DARK_AQUA]]Comment utiliser le Broyeur:\n[[YELLOW]]Avec une pioche dans votre main, faites clic droit pour pr\u00e9parer votre outil.\n[[YELLOW]]Une fois cela fait, vous avez jusqu\'\u00e0 4 secondes pour commencer \u00e0 miner\n[[YELLOW]]des mat\u00e9riaux compatibles, ce qui activera le Broyeur.
Guides.Mining.Section.3=[[DARK_AQUA]]Qu\'est-ce que le Super Briseur?\n[[YELLOW]]Le Super Briseur est une capacit\u00e9 avec un temps de r\u00e9cup\u00e9ration li\u00e9 \u00e0 la Comp\u00e9tence\n[[YELLOW]]minage. Il triple vos chances de r\u00e9cup\u00e9rer des objets et\n[[YELLOW]]permet la casse instantan\u00e9e sur des minerais.
Guides.Mining.Section.4=[[DARK_AQUA]]Comment utiliser le Minage Explosif:\n[[YELLOW]]Avec un d\u00e9tonateur en main, \u00e0 savoir un briquet par d\u00e9faut,\n[[YELLOW]]s\'accroupir et faire un clic droit sur de la TNT \u00e0 distance. Ceci fera\n[[YELLOW]]exploser instantan\u00e9ment la TNT.
Guides.Mining.Section.5=[[DARK_AQUA]]Comment fonctionne le Minage par Explosions?\n[[YELLOW]]Le Minage par Explosions est une capacit\u00e9 avec un temps de recharge li\u00e9 au talent\n[[YELLOW]]de Minage. Il donne des bonus lors de l\'utilisation nde TNT pour le minage et vous permet\n[[YELLOW]]de contr\u00f4ler l\'explosion de TNT. Il y a 3 parties du Minage par Explosions.\n[[YELLOW]]La premi\u00e8re est les Grosses Bombes. Elle vous permet d\'augmenter le rayon d\'explosion.\n[[YELLOW]]La seconde est la Demolition Experte, qui diminue les d\u00e9g\u00e2ts provenants des explosions de TNT\n[[YELLOW]]La troisi\u00e8me augmente le nombre de minerais obtenus par la TNT et diminue les pertes.
Guides.Repair.Section.0=[[DARK_AQUA]]A propos de la R\u00e9paration :\n[[YELLOW]]La r\u00e9paration vous permet d\'utiliser un bloc de fer pour r\u00e9parer\n[[YELLOW]]des armures et des outils.\n[[DARK_AQUA]]Gain d\'exp\u00e9rience:\n[[YELLOW]]R\u00e9parer des outils ou des armures en utilisant l\'enclume de mcMMO.\n[[YELLOW]]C\'est un bloc de fer par d\u00e9faut et il ne doit pas \u00eatre confondu avec\n[[YELLOW]]l\'enclume de Minecraft Vanilla.
Guides.Repair.Section.1=[[DARK_AQUA]]Comment utiliser R\u00e9paration?\n[[YELLOW]]Placez une enclume mcMMO et faites un clic droit pour r\u00e9parer l\'objet\n[[YELLOW]]que vous avez en main. Ceci consomme 1 objet \u00e0 chaque utilisation.
Guides.Repair.Section.2=[[DARK_AQUA]]Comment fonctionne Ma\u00eetrise de la Forge?\n[[YELLOW]]Ma\u00eetrise de la Forge augmente la quantit\u00e9 de r\u00e9parations effectu\u00e9es.\n[[YELLOW]]La quantit\u00e9 de durabilit\u00e9 suppl\u00e9mentaire attribu\u00e9e est fonction de \n[[YELLOW]]votre niveau en R\u00e9paration.
Guides.Repair.Section.3=[[DARK_AQUA]]Comment fonctionne la Super R\u00e9paration?\n[[YELLOW]]La Super R\u00e9paration est une capacit\u00e9 passive . Lors de la r\u00e9paration d\'un \u00e9l\u00e9ment ,\n[[YELLOW]]elle accorde aux joueurs une chance de r\u00e9parer un \u00e9l\u00e9ment avec\n[[YELLOW]]une double efficacit\u00e9.
Guides.Repair.Section.4=[[DARK_AQUA]]Comment fonctionne Forge arcanique?\n[[YELLOW]]Cette capacit\u00e9 passive vous permet de r\u00e9parer des objets avec une\n[[YELLOW]]certaine chance de conserver les enchantements. Ces derniers\n[[YELLOW]]pourrons \u00eatre conserv\u00e9 \u00e0 leur niveau, rendus \u00e0 un niveau inf\u00e9rieur\n[[YELLOW]]ou compl\u00e8tement perdus.
Guides.Salvage.Section.0=[[DARK_AQUA]]A propos du Recyclage:\n[[YELLOW]]Le Recyclage vous permet d\'utiliser un bloc d\'or pour r\u00e9cup\u00e9rer des mati\u00e8res premi\u00e8res\n[[YELLOW]]sur de l\'armure ou des outils.\n[[DARK_AQUA]]Gain d\'Exp\u00e9rience:\n[[YELLOW]]Le Recyclage est une Comp\u00e9tence enfant des comp\u00e9tences R\u00e9paration et P\u00eache, votre niveau\n[[YELLOW]]de Recyclage est donc bas\u00e9 sur les niveaux des comp\u00e9tences R\u00e9paration et P\u00eache.
Guides.Salvage.Section.1=[[DARK_AQUA]]Comment utiliser le Recyclage?\n[[YELLOW]]Placez une Enclume de Recyclage mcMMO et faites un clic-droit pour recycler \n[[YELLOW]]l\'objet que vous avez en main. Ceci cassera votre objet\n[[YELLOW]]et vous rendra les mat\u00e9riaux qui composent l\'objet.\n[[YELLOW]]Par exemple, recycler une pioche en fer vous rendra des barres de fer.
Guides.Salvage.Section.2=[[DARK_AQUA]]Comment fonctionne le Recyclage Avanc\u00e9?\n[[YELLOW]]Lorsque d\u00e9bloqu\u00e9e, cette capacit\u00e9 vous permet de recycler des objets d\u00e9t\u00e9rior\u00e9s.\n[[YELLOW]]Votre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux augmente avec votre niveau. Un pourcentage\n[[YELLOW]]plus \u00e9lev\u00e9 signifie que vous pouvez r\u00e9cup\u00e9rer davantage de mat\u00e9riaux.\n[[YELLOW]]Avec le Recyclage Avanc\u00e9 vous r\u00e9cup\u00e9rerez toujours un mat\u00e9riaux \n[[YELLOW]]sauf si l\'objet est trop endommag\u00e9. Vous n\'aurez donc pas \u00e0 vous\n[[YELLOW]]soucier de casser des objets sans avoir rien r\u00e9cup\u00e9r\u00e9.
Guides.Salvage.Section.3=[[DARK_AQUA]]Voici une illustration pour expliquer comment cela fonctionne:\n[[YELLOW]]Disons que nous recyclons une pioche en or endommag\u00e9e \u00e0 20%,\n[[YELLOW]]ce qui veux dire que le montant maximum que vous pouvez r\u00e9cup\u00e9rer est 2 (66%).\n[[YELLOW]](parce que la pioche est constitu\u00e9e de 3 lingots, valant chacun\n[[YELLOW]]33,33% de durabilit\u00e9). Si votre pourcentage de r\u00e9cup\u00e9ration de mat\u00e9riaux\n[[YELLOW]]est en dessous de 66% vous ne pourrez pas r\u00e9cup\u00e9rer 2 lingots.\n[[YELLOW]]Si ce pourcentage est au dessus de 66% vous pourrez r\u00e9cup\u00e9rer le\n[[YELLOW]]\"montant maximum\", donc 2 lingots.
Guides.Salvage.Section.4=[[DARK_AQUA]]Comment fonctionne le Recyclage Arcanique?\n[[YELLOW]]Cette capacit\u00e9 vous permet de r\u00e9cup\u00e9rer des livres enchant\u00e9s lors que vous recyclez\n[[YELLOW]]des objets enchant\u00e9s. En fonction de votre niveau, la chance de r\u00e9cup\u00e9rer avec succ\u00e8s\n[[YELLOW]]des enchantements entiers ou partiels varie.\n[[YELLOW]]Lorsqu\'un enchantement est partiellement r\u00e9cup\u00e9r\u00e9, le livre enchant\u00e9\n[[YELLOW]]aura un niveau d\'enchantement plus bas compar\u00e9 \u00e0 l\'enchantement\n[[YELLOW]]de l\'objet que recyclez.
Guides.Smelting.Section.0=Arrive bient\u00f4t...
Guides.Swords.Section.0=[[DARK_AQUA]]A propos du combat \u00e0 l\'\u00e9p\u00e9e::\n[[YELLOW]]Cette comp\u00e9tence octroie un bonus si vous combattez avec\n[[YELLOW]]une \u00e9p\u00e9e.\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Le gain d\'XP est bas\u00e9 sur le montant des d\u00e9gats inflig\u00e9s aux mobs \n[[YELLOW]]et autres joueurs avec une \u00e9p\u00e9e.
Guides.Swords.Section.1=[[DARK_AQUA]]Comment fonctionne coups d\u00e9chirants?\n[[YELLOW]]Coups d\u00e9chirants est une capacit\u00e9 acitv\u00e9e, vous pouvez l\'activer\n[[YELLOW]]avec un clic droit, une \u00e9p\u00e9e \u00e0 la main. Cette capacit\u00e9 vous permet \n[[YELLOW]]d\'infliger des d\u00e9g\u00e2ts de zone (AoE). Cette AoE inflige un bonus de 25%\n[[YELLOW]]de dommage et fais saigner la cilbe pendant 5 ticks.
Guides.Swords.Section.2=[[DARK_AQUA]]Comment fonctionne la Contre-Attaque?\n[[YELLOW]]La Contre-Attaque est une capacit\u00e9 active. En bloquant les attaques\n[[YELLOW]]des mobs, vous avez une chance de repousser 50% des\n[[YELLOW]]d\u00e9g\u00e2ts qui vous sont inflig\u00e9s.
Guides.Swords.Section.3=[[DARK_AQUA]]Comment fonctionne le Saignement?\n[[YELLOW]]Le Saignement fait saigner vos ennemis, perdant de la vie toutes les deux secondes.\n[[YELLOW]]La cible saignera jusqu\'\u00e0 ce que l\'effet s\'estompe, ou qu\'il meure,\n[[YELLOW]]en fonction de ce qui arrive en premier!\n[[YELLOW]]La durabilit\u00e9 du Saignement est augment\u00e9 avec votre Comp\u00e9tence \u00c9p\u00e9e.
Guides.Taming.Section.0=[[DARK_AQUA]]A propos de l\'Apprivoisement:\n[[YELLOW]]L\'apprivoisement conf\u00e8re au joueur divers bonus de combat\n[[YELLOW]]lorsqu\'il utilise un animal (loup/ocelot).\n[[DARK_AQUA]]GAIN D\'XP:\n[[YELLOW]]Pour gagner de l\'exp\u00e9rience, vous devez apprivoiser des loups ou des\n[[YELLOW]]ocelots
Guides.Taming.Section.1=[[DARK_AQUA]]Comment fonctionne l\'Appel de la Nature?\n[[YELLOW]]Appel de la Nature est une capacit\u00e9 active qui vous permet de faire appel\n[[YELLOW]]\u00e0 un loup ou un ocelot. Vous pouvez faire ceci en faisant\n[[YELLOW]]un clic gauche en tenant des os ou du poisson.
Guides.Taming.Section.2=[[DARK_AQUA]]Comment fonctionne connaissance des b\u00eates?\n[[YELLOW]]Connaissance des b\u00eates permet au joueur d\'inspecter les stats\n[[YELLOW]]de ses animaux. Cliquez gauche un loup ou un ocelot pour\n[[YELLOW]]utiliser Connaissance des b\u00eates.
Guides.Taming.Section.3=[[DARK_AQUA]]Comment fonctione Gore?\n[[YELLOW]]Gore est une capacit\u00e9 passive qui a une chance d\'infliger un effet\n[[YELLOW]]de saignement sur la cible de votre loup.
Guides.Taming.Section.4=[[DARK_AQUA]]Comment fonctionne Griffes aiguis\u00e9es?\n[[YELLOW]]Griffes aiguis\u00e9es ajoute un bonus de d\u00e9g\u00e2ts inflig\u00e9s par votre loup.\n[[YELLOW]]Le bonus de d\u00e9g\u00e2ts d\u00e9pend de votre niveau en Apprivoisement.
Guides.Taming.Section.5=[[DARK_AQUA]]Comment fonctionne Attentif \u00e0 l\'environnement?\n[[YELLOW]]Cette capacit\u00e9 passive permet \u00e0 votre loup de se t\u00e9l\u00e9porter sur vous\n[[YELLOW]]lorsqu\'il se rapproche de dangers (cactus, lave, etc). Cela lui donne\n[[YELLOW]]\u00e9galemment l\'immunit\u00e9 contre les d\u00e9g\u00e2ts de chute.
Guides.Taming.Section.6=[[DARK_AQUA]]Comment fonctionne Poil \u00c9pais?\n[[YELLOW]]Cette capacit\u00e9 passive rend vos loups moins vuln\u00e9rables\n[[YELLOW]]et r\u00e9sistants au feu.
Guides.Taming.Section.7=[[DARK_AQUA]]Comment fonctionne r\u00e9sistance aux chocs?\n[[YELLOW]]Cette capacit\u00e9 passive r\u00e9duit les d\u00e9g\u00e2ts inflig\u00e9s \u00e0 vos loups\n[[YELLOW]]par les explosions.
Guides.Taming.Section.8=[[DARK_AQUA]]Comment fonctionne Service Fast Food?\n[[YELLOW]]Cette capacit\u00e9 passive donne \u00e0 vos loups une chance de\n[[YELLOW]]se soigner lorsqu\'ils effectuent une attaque.
Guides.Unarmed.Section.0=[[DARK_AQUA]]A propos des Poings:\n[[YELLOW]]Utiliser ses Poings pour se battre donnera des bonus divers lorsque\n[[YELLOW]]vous combattez.\n[[DARK_AQUA]]Gain d\'Exp\u00e9rience:\n[[YELLOW]]Vous gagnez de l\'exp\u00e9rience en fonction des d\u00e9g\u00e2ts inflig\u00e9s aux mobs\n[[YELLOW]]ou aux autres joueurs lors d\'un combat avec vos Poings.
Guides.Unarmed.Section.1=[[DARK_AQUA]]Comment fonctionne la Furie?\n[[YELLOW]]Furie est une capacit\u00e9 active qui est activ\u00e9e en faisant un clic-droit,\n[[YELLOW]]en n\'ayant rien \u00e0 la main. En mode Furie, vous infligerez 50% plus\n[[YELLOW]]de d\u00e9g\u00e2ts et vous pourrez casser des mat\u00e9riaux faibles instantan\u00e9ment,\n[[YELLOW]]comme l\'Herbe et la Terre.
Guides.Unarmed.Section.2=[[DARK_AQUA]]Comment fonctionne le Bras de Fer?\n[[YELLOW]]Bras de Fer augmente les d\u00e9g\u00e2ts inflig\u00e9s lorsque vous attaquez des mobs ou\n[[YELLOW]]des joueurs avec les Poings.
Guides.Unarmed.Section.3=[[DARK_AQUA]]Comment fonctionne la D\u00e9viation de Fl\u00e8che?\n[[YELLOW]]La D\u00e9viation de Fl\u00e8che est une capacit\u00e9 \n[[YELLOW]]qui permet de d\u00e9vier une fl\u00e8che tir\u00e9e par un Squelette ou un joueur.\n[[YELLOW]]Cette fl\u00e8che tombera alors au sol, inoffensive.
Guides.Unarmed.Section.4=[[DARK_AQUA]]Comment fonctionne la Poigne de Fer?\n[[YELLOW]]Poigne de Fer est une capacit\u00e9 passive qui contre le d\u00e9sarmement. En am\u00e9liorant\n[[YELLOW]]votre comp\u00e9tence Poings, la chance de parer un d\u00e9sarmement augmente.
Guides.Unarmed.Section.5=[[DARK_AQUA]]Comment fonctionne d\u00e9sarmement?\n[[YELLOW]]Cette capacit\u00e9 passive permet le joueur de d\u00e9sarmer d\'autres joueurs,\n[[YELLOW]]provoquant la chute au sol de ses objets \u00e9quip\u00e9s.
Guides.Woodcutting.Section.0=[[DARK_AQUA]]A propos de b\u00fbcheronnage:\n[[YELLOW]]Le b\u00fbcheronnage concerne l\'abattement d\'arbres.\n[[DARK_AQUA]]Gain d\'Exp\u00e9rience:\n[[YELLOW]]Vous gagniez de l\'exp\u00e9rience pour chaque bloc de bois cass\u00e9.
Guides.Woodcutting.Section.1=[[DARK_AQUA]]Comment fonctionne le Fendeur d\'Arbres?\n[[YELLOW]]Le Fendage d\'Arbres est une capacit\u00e9 active, en faisant un clic-droit\n[[YELLOW]]avec une hache \u00e0 la main, vous activerez cette capacit\u00e9. Ceci vous\n[[YELLOW]]permettra d\'abattre un arbre int\u00e9gralement, en r\u00e9cup\u00e9rant\n[[YELLOW]]toutes les b\u00fbches d\'un coup.
Guides.Woodcutting.Section.2=[[DARK_AQUA]]Comment fonctionne le Souffleur de Feuilles?\n[[YELLOW]]Souffleur de Feuilles est une capacit\u00e9 passive qui permet de casser un\n[[YELLOW]]bloc de feuilles instantan\u00e9ment quand vous les cassez avec un hache. Par d\u00e9faut,\n[[YELLOW]]cette capacit\u00e9 est disponible au niveau 100 de la Comp\u00e9tence B\u00fbcheronnage.
Guides.Woodcutting.Section.3=[[DARK_AQUA]]Comment fonctionne Double Bois?\n[[YELLOW]]Cette capacit\u00e9 passive vous donne une chance\n[[YELLOW]]de r\u00e9cup\u00e9rer une b\u00fbche suppl\u00e9mentaire par bloc de bois cass\u00e9.
Inspect.Offline=Tu n\'as pas la permission d\'inspecter un joueur hors ligne!
Inspect.OfflineStats=mcMMO Stats for Offline Player [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]mcMMO Stats for [[YELLOW]]{0}
Inspect.TooFar=Vous \u00eates trop \u00e9loign\u00e9 de ce joueur pour l\'inspecter !
Item.ChimaeraWing.Fail=**\u00c9CHEC D\'AILE DE CHIM\u00c8RE !**
Item.ChimaeraWing.Pass=**AILE DE CHIM\u00c8RE**
Item.ChimaeraWing.Name=Aile de Chim\u00e8re
Item.ChimaeraWing.Lore=[[GRAY]]Vous t\u00e9l\u00e9porte \u00e0 votre lit.
Item.Generic.Wait=Vous devez attendre avant de pouvoir utiliser cela de nouveau ! [[YELLOW]]({0}s)
Item.Injured.Wait=Vous avez \u00e9t\u00e9 bless\u00e9 r\u00e9cemment et devez attendre pour utiliser cela. [[YELLOW]]({0}s)
Item.FluxPickaxe.Name=Pioche de Flux
Item.FluxPickaxe.Lore.1=[[GRAY]]A une chance de fondre des minerais instantan\u00e9ment.
Item.FluxPickaxe.Lore.2=[[GRAY]]Requi\u00e8re niveau de Forge {0}+
Teleport.Commencing=[[GRAY]]La t\u00e9l\u00e9portation commence dans [[GOLD]]({0}) [[GRAY]]secondes, pri\u00e8re de ne pas bouger...
Teleport.Cancelled=[[DARK_RED]]T\u00e9l\u00e9portation annul\u00e9e !
Skills.Child=[[GOLD]](TALENT ENFANT)
Skills.Disarmed=[[DARK_RED]]Vous avez \u00e9t\u00e9 d\u00e9sarm\u00e9 !
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]Vous devez en avoir plus
Skills.Parents=PARENTS
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP ([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.ChildStats={0}[[GREEN]]{1}
Skills.TooTired=Vous \u00eates trop fatigu\u00e9 pour r\u00e9utiliser cette comp\u00e9tence maintenant.
Skills.Cancelled={0} annul\u00e9(e) !
Skills.ConfirmOrCancel=[[GREEN]]Fa\u00eetes de nouveau un clic droit pour confirmer [[GOLD]]{0}[[GREEN]]. Clic gauche pour annuler.
Stats.Header.Combat=[[GOLD]]-=COMP\u00c9TENCES DE COMBAT=-
Stats.Header.Gathering=[[GOLD]]-=COMP\u00c9TENCES DE R\u00c9COLTE=-
Stats.Header.Misc=[[GOLD]]-=AUTRES TALENTS=-
Stats.Own.Stats=[[GREEN]][mcMMO] Statistiques
Perks.XP.Name=Exp\u00e9rience
Perks.XP.Desc=Gain d\'EXP boost\u00e9 dans certains talents.
Perks.Lucky.Name=Chance
Perks.Lucky.Desc=Donnes {0} comp\u00e9tences et abilet\u00e9s 33.3% de chance d\'\u00eatre activ\u00e9es.
Perks.Lucky.Desc.Login=Donne \u00e0 certaines comp\u00e9tences 33.3% de chance d\'\u00eatre activ\u00e9es.
Perks.Lucky.Bonus=[[GOLD]] ({0} avec votre avantage de chance)
Perks.Cooldowns.Name=Reg\u00e9n\u00e9ration rapide
Perks.Cooldowns.Desc=Temps d\'attente r\u00e9duits de {0}.
Perks.ActivationTime.Name=Endurance
Perks.ActivationTime.Desc=Augmente la dur\u00e9e de l\'abil\u00e9t\u00e9 de {0} secondes.
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s avec votre avantage d\'endurance)
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Le mode Hardcore {0} a \u00e9t\u00e9 d\u00e9sactiv\u00e9 pour {1}.
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Le mode Hardcore {0} a \u00e9t\u00e9 activ\u00e9 pour {1}.
Hardcore.DeathStatLoss.Name=P\u00e9nalit\u00e9s sur les talents lors de la mort
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Vous avez perdu [[BLUE]]{0}[[DARK_RED]] niveau(x) dans votre mort.
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}.
Hardcore.Vampirism.Name=Vampirisme
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] \u00e9tait trop maladroit pour am\u00e9liorer votre connaissance.
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Vous avez vol\u00e9 [[BLUE]]{0}[[DARK_AQUA]] niveau(x) de [[YELLOW]]{1}.
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] Il n\'a pas \u00e9t\u00e9 capable de vous voler votre connaissance !
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] a vol\u00e9 [[BLUE]]{1}[[DARK_RED]] de vos niveaux !
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] Le pourcentage de perte de statistiques a \u00e9t\u00e9 chang\u00e9 \u00e0 {0}.
MOTD.Donate=[[DARK_AQUA]]Donation Info:
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Mode Hardcore activ\u00e9 : [[DARK_RED]]{0}
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]P\u00e9nalit\u00e9s sur les talents lors de la mort : [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Pourcentage de perte de statistiques de Vampirisme: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[mcMMO Comp\u00e9tences]
MOTD.Version=[[GOLD]][mcMMO] Version [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO Website
Smelting.Ability.FluxMining=Chance de Minage en Flux : [[YELLOW]]{0}
Smelting.Ability.FuelEfficiency=Multiplicateur d\'efficacit\u00e9 des Combustibles: [[YELLOW]]{0}x
Smelting.Ability.Locked.0=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux de talent (BOOST D\'EXPERIENCE VANILLA)
Smelting.Ability.Locked.1=Bloqu\u00e9 jusqu\'\u00e0 {0}+ niveaux du talent (MINAGE PAR EXPLOSIONS)
Smelting.Ability.SecondSmelt=Chance de seconde cuisson: [[YELLOW]]{0}
Smelting.Ability.VanillaXPBoost=Multiplicateur d\'EXP Vanilla: [[YELLOW]]{0}x
Smelting.SubSkill.FuelEfficiency.Name=Efficacit\u00e9 du combustible
Smelting.SubSkill.FuelEfficiency.Description=Augmente la dur\u00e9e de vie du combustible utilis\u00e9 dans les fours lors des cuissons
Smelting.SubSkill.SecondSmelt.Name=Seconde Cuisson
Smelting.SubSkill.SecondSmelt.Description=Double les ressources obtenues par cuisson
Smelting.Effect.4=Bonus d\'experience Vanilla
Smelting.Effect.5=Augmente l\'EXP Vanilla aquise lors des cuissons
Smelting.SubSkill.FluxMining.Name=Minage en Flux
Smelting.SubSkill.FluxMining.Description=Chance pour que les minerais soient instantan\u00e9ment cuits lors de leur minage
Smelting.Listener=Cuisson:
Smelting.SkillName=FONTE
Commands.Description.addlevels=Ajouter des niveaux McMMO a un utilisateur
Commands.Description.adminchat=Modifie le tchat McMMO admin en activ\u00e9/d\u00e9sactiv\u00e9 ou envoie des messages dans le tchat admin
Commands.Description.addxp=Ajoute de l\'EXP McMMO \u00e0 un utilisateur
Commands.Description.hardcore=Modifier le pourcentage de difficult\u00e9 de mcMMO ou activer ou non le mode hardcore
Commands.Description.inspect=Voir les infos d\u00e9taill\u00e9es d\'un autre joueur
Commands.Description.mcability=Modifie la possibilit\u00e9 que les capacit\u00e9s McMMO soient pr\u00eates par un clic droit en activ\u00e9/d\u00e9sactiv\u00e9
Commands.Description.mccooldown=Voir tous les temps d\'attentes des capacit\u00e9s McMMO
Commands.Description.mcgod=Modifie le mode Dieu de McMMO en activ\u00e9/d\u00e9sactiv\u00e9
Commands.Description.mchud=Change le style du HUD McMMO
Commands.Description.mcmmo=Montre une br\u00e8ve description de McMMO
Commands.Description.mcnotify=Modifie l\'affichage des notifications dans le tchat des capacit\u00e9s mcMMO en activ\u00e9/d\u00e9sactiv\u00e9
Commands.Description.mcpurge=Purge les utilisateurs avec aucun niveaux McMMO et les utilisateurs qui ne se sont pas connect\u00e9s dans les {0} derniers mois de la base de donn\u00e9es McMMO.
Commands.Description.mcrank=Montre le classement McMMO d\'un joueur
Commands.Description.mcrefresh=Rafra\u00eechi tous les temps d\'attente McMMO
Commands.Description.mcremove=Enl\u00e8ve un utilisateur de la base de donn\u00e9es
Commands.Description.mcscoreboard=Modifiez votre tableau des scores McMMO
Commands.Description.mcstats=Montre vos niveaux McMMO et votre EXP
Commands.Description.mctop=Montre le classement McMMO
Commands.Description.mmoedit=Modifie les niveaux McMMO pour un utilisateur
Commands.Description.mmoupdate=Migration de la base de donn\u00e9es mcMMO \u00e0 partir d\'une ancienne vers l\'actuelle.
Commands.Description.mcconvert=Convertie les types de base de donn\u00e9es ou les types de formule d\'experience
Commands.Description.mmoshowdb=Montre le nom de la base de donn\u00e9es actuellement utilis\u00e9e (vous pouvez obtenir la derni\u00e8re avec /mmoupdate)
Commands.Description.party=Contr\u00f4le les divers r\u00e9glages des guildes McMMO
Commands.Description.partychat=Modifie le tchat McMMO de la guilde en activ\u00e9/d\u00e9sactiv\u00e9 ou envoie des messages dans le tchat de la guilde.
Commands.Description.ptp=Vous t\u00e9l\u00e9porte \u00e0 un membre de votre groupe mcMMO
Commands.Description.Skill=Affiche des infos d\u00e9taill\u00e9es du talent McMMO {0}
Commands.Description.skillreset=Remet \u00e0 0 tous les niveaux McMMO pour un utilisateur
Commands.Description.vampirism=Modifie le mode Dieu de McMMO en activ\u00e9/d\u00e9sactiv\u00e9
Commands.Description.xplock=Bloque votre barre d\'EXP McMMO pour un talent sp\u00e9cifique
Commands.Description.xprate=Modifie le taux d\'EXP McMMO ou d\u00e9bute un event XP McMMO
UpdateChecker.Outdated=Vous utilisez une ancienne version de McMMO !
UpdateChecker.NewAvailable=Une nouvelle version est disponible sur BukkitDev.
Scoreboard.Header.PlayerStats=Statistiques McMMO
Scoreboard.Header.PlayerCooldowns=Temps d\'attente McMMO
Scoreboard.Header.PlayerRank=Classement McMMO
Scoreboard.Header.PlayerInspect=Statistiques McMMO: {0}
Scoreboard.Header.PowerLevel=Niveau de puissance
Scoreboard.Misc.PowerLevel=[[GOLD]]Niveau de puissance
Scoreboard.Misc.Level=[[DARK_AQUA]]Niveau
Scoreboard.Misc.CurrentXP=[[GREEN]]EXP actuelle
Scoreboard.Misc.RemainingXP=EXP restante
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Temps d\'attente
Scoreboard.Misc.Overall=[[GOLD]]Global
Scoreboard.Misc.Ability=Capacit\u00e9
Profile.Loading.Success=[[GREEN]]G\u00e9nial! Vos donn\u00e9es McMMO ont \u00e9t\u00e9 charg\u00e9es.
Profile.Loading.Failure=McMMO ne peut toujours pas charger vos donn\u00e9es. Vous devriez sans doute [[AQUA]]contacter le possesseur du serveur.\n[[YELLOW]]Vous pouvez toujours jouer sur le serveur, mais vous n\'aurez [[BOLD]]pas de niveaux McMMO[[YELLOW]] et chaque EXP obtenu[[BOLD]]ne sera pas sauvergard\u00e9[[YELLOW]].
Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] McMMO a \u00e9t\u00e9 incapable de charger les donn\u00e9es du joueur [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Veuillez inspecter votre installation de la base de donn\u00e9es.

View File

@@ -1,903 +0,0 @@
#ACROBATICS
Acrobatics.Ability.Proc=[[GREEN]]**Atterraggio Aggraziato**
Acrobatics.Combat.Proc=[[GREEN]]**Schivato**
Acrobatics.DodgeChance=Possibilit\u00E0 di Schivata: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=Capriola
Acrobatics.SubSkill.Roll.Description=Riduce o annulla il danno da caduta
Acrobatics.SubSkill.GracefulRoll.Name=Capriola Aggraziata
Acrobatics.SubSkill.GracefulRoll.Description=Il doppio pi\u00F9 efficiente di una normale Capriola
Acrobatics.SubSkill.Dodge.Name=Schivata
Acrobatics.SubSkill.Dodge.Description=Riduce il danno degli attacchi della met\u00E0
Acrobatics.Listener=Acrobatica:
Acrobatics.SubSkill.Roll.Chance=Possibilit\u00E0 di Capriola: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=Possibilit\u00E0 di Capriola Aggraziata: [[YELLOW]]{0}
Acrobatics.Roll.Text=**Capriola Eseguita**
Acrobatics.SkillName=ACROBATICA
Acrobatics.Skillup=L'abilit\u00E0 Acrobatica \u00E8 aumentata di {0}. Totale ({1})
#ALCHEMY
Alchemy.SubSkill.Catalysis.Name=Catalisi
Alchemy.SubSkill.Catalysis.Description=Aumenta la velocit\u00E0 di produzione delle pozioni
Alchemy.SubSkill.Concoctions.Name=Intrugli
Alchemy.SubSkill.Concoctions.Description=Crea pozioni con pi\u00F9 ingredienti
Alchemy.Listener=Alchimia:
Alchemy.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (CATALISI)
Alchemy.Catalysis.Speed=Velocit\u00E0 di Preparazione: [[YELLOW]]{0}
Alchemy.Concoctions.Rank=Grado Intrugli: [[YELLOW]]{0}/{1}
Alchemy.Concoctions.Ingredients=Ingredienti [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
Alchemy.SkillName=ALCHIMIA
Alchemy.Skillup=L'abilit\u00E0 Alchimia \u00E8 aumentata di {0}. Totale ({1})
#ARCHERY
Archery.Combat.DazeChance=Possibilit\u00E0 di Stordire: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=Possibilit\u00E0 di Recuperare Frecce: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=Bonus al Danno di Tiro da Maestro: [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=Tiro da Maestro
Archery.SubSkill.SkillShot.Description=Aumenta il danno fatto con gli archi
Archery.SubSkill.Daze.Name=Stordire (Giocatori)
Archery.SubSkill.Daze.Description=Disorienta i nemici e infligge {0} Danni
Archery.SubSkill.ArrowRetrieval.Name=Recupero Frecce
Archery.SubSkill.ArrowRetrieval.Description=Probabilit\u00E0 di recuperare frecce dai cadaveri
Archery.Listener=Tiro con l'Arco:
Archery.SkillName=Arco
Archery.Skillup=L'abilit\u00E0 Tiro con l'Arco \u00E8 aumentata di {0}. Totale ({1})
#AXES
Axes.Ability.Bonus.0=Maestria con l'Ascia
Axes.Ability.Bonus.1={0} Danni Bonus
Axes.Ability.Bonus.2=Sfonda Armature
Axes.Ability.Bonus.3=Infliggi {0} Danni Bonus alle armature
Axes.Ability.Bonus.4=Impatto Maggiore
Axes.Ability.Bonus.5=Infliggi {0} danni bonus ai nemici senza armatura
Axes.Ability.Lower=[[GRAY]]**ABBASSI L'ASCIA**
Axes.Ability.Ready=[[GREEN]]**PREPARI L'ASCIA**
Axes.Combat.CritStruck=[[DARK_RED]]Hai subito un colpo CRITICO!
Axes.Combat.CritChance=Probabilit\u00E0 di un colpo critico: [[YELLOW]]{0}
Axes.Combat.CriticalHit=COLPO CRITICO!
Axes.Combat.GI.Proc=[[GREEN]]**COLPITO CON GRANDE FORZA**
Axes.Combat.GI.Struck=**COLPITO DA IMPATTO MAGGIORE**
Axes.Combat.SS.Struck=[[DARK_RED]]Colpito da SPACCA CRANI!
Axes.Combat.SS.Length=Durata di Spacca Crani: [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=Spacca Crani (Capacit\u00E0)
Axes.SubSkill.SkullSplitter.Description=Infligge Danno ad Area
Axes.SubSkill.CriticalStrikes.Name=Colpi Critici
Axes.SubSkill.CriticalStrikes.Description=Doppio Danno
Axes.SubSkill.AxeMastery.Name=Maestria con l'Ascia
Axes.SubSkill.AxeMastery.Description=Aggiunge Danni bonus
Axes.SubSkill.ArmorImpact.Name=Sfonda Armature
Axes.SubSkill.ArmorImpact.Description=Colpisci con forza sufficiente da fracassare le armature
Axes.SubSkill.GreaterImpact.Name=Impatto Maggiore
Axes.SubSkill.GreaterImpact.Description=Infligge danno bonus ai nemici senza armatura
Axes.Listener=Asce:
Axes.SkillName=ASCE
Axes.Skills.SS.Off=**Spacca Crani si \u00E8 esaurito**
Axes.Skills.SS.On=[[GREEN]]**Spacca Crani ATTIVATA**
Axes.Skills.SS.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Spacca Crani [[GREEN]]si \u00E8 rigenerata!
Axes.Skills.SS.Other.Off=Spacca Crani[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Spacca Crani!
Axes.Skillup=L'abilit\u00E0 Asce \u00E8 aumentata di {0}. Totale ({1})
#EXCAVATION
Excavation.Ability.Lower=[[GRAY]]**ABBASSI LA PALA**
Excavation.Ability.Ready=[[GREEN]]**PREPARI LA PALA**
Excavation.SubSkill.GigaDrillBreaker.Name=Giga-Trivella Demolitrice (CAPACIT\u00C0)
Excavation.SubSkill.GigaDrillBreaker.Description=Drop x3, XP x3, +Velocit\u00E0
Excavation.SubSkill.TreasureHunter.Name=Cacciatore di Tesori
Excavation.SubSkill.TreasureHunter.Description=Capacit\u00E0 di disseppellire tesori
Excavation.Effect.Length=Durata di Giga-Trivella Demolitrice: [[YELLOW]]{0}s
Excavation.Listener=Escavazione:
Excavation.SkillName=ESCAVAZIONE
Excavation.Skills.GigaDrillBreaker.Off=**Giga-Trivella Demolitrice si \u00E8 esaurita**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**GIGA-TRIVELLA DEMOLITRICE ATTIVATA**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Giga-Trivella Demolitrice [[GREEN]]si \u00E8 rigenerata!
Excavation.Skills.GigaDrillBreaker.Other.Off=Giga-Trivella Demolitrice[[GREEN]] si \u00E8 esaurita per [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Giga-Trivella Demolitrice!
Excavation.Skillup=L'abilit\u00E0 Escavazione \u00E8 aumentata di {0}. Totale ({1})
#FISHING
Fishing.Ability.Chance=Possibilit\u00E0 di Morso: [[YELLOW]]{0}
Fishing.Ability.Info=Cacciatore di Magia: [[GRAY]] **Migliora insieme al Grado di Cacciatore di Tesori**
Fishing.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SCUOTERE)
Fishing.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PESCA SUL GHIACCIO)
Fishing.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PESCATORE PROVETTO)
Fishing.Ability.Rank=Grado di Cacciatore di Tesori: [[YELLOW]]{0}/5
Fishing.Ability.TH.DropRate=Tasso di Drop: [[DARK_RED]]Trap: [[YELLOW]]{0} [[GRAY]]Comune: [[YELLOW]]{1} [[GREEN]]Non Comune: [[YELLOW]]{2}\n[[BLUE]]Raro: [[YELLOW]]{3} [[LIGHT_PURPLE]]Epico: [[YELLOW]]{4} [[GOLD]]Leggendario: [[YELLOW]]{5} [[AQUA]]Record: [[YELLOW]]{6}
Fishing.Ability.TH.MagicRate=Possibilit\u00E0 di Cacciatore di Magia: [[YELLOW]]{0}
Fishing.Ability.Shake=Probabilit\u00E0 di Scuotere: [[YELLOW]]{0}
Fishing.Ability.IceFishing=Pesca sul Ghiaccio: Vai a pescare sul ghiaccio
Fishing.Ability.FD=Dieta del Pescatore: [[YELLOW]]Grado {0}
Fishing.SubSkill.TreasureHunter.Name=Cacciatore di Tesori (Passivo)
Fishing.SubSkill.TreasureHunter.Description=Ripesca oggetti vari
Fishing.SubSkill.MagicHunter.Name=Cacciatore di Magia
Fishing.SubSkill.MagicHunter.Description=Trova Oggetti Incantati
Fishing.SubSkill.Shake.Name=Scuotere (contro Entit\u00E0)
Fishing.SubSkill.Shake.Description=Scrolla oggetti di dosso ai mob con una canna da pesca
Fishing.SubSkill.FishermansDiet.Name=Dieta del Pescatore
Fishing.SubSkill.FishermansDiet.Description=Aumenta la fame recuperata tramite cibi pescati
Fishing.SubSkill.MasterAngler.Name=Pescatore Provetto
Fishing.SubSkill.MasterAngler.Description=Migliora le possibilit\u00E0 di ricevere un morso mentre si pesca
Fishing.SubSkill.IceFishing.Name=Pesca sul Ghiaccio
Fishing.SubSkill.IceFishing.Description=Ti permette di pescare nei biomi ghiacciati
Fishing.Chance.Raining=[[BLUE]] Bonus Pioggia
Fishing.Listener=Pesca:
Fishing.Ability.TH.MagicFound=[[GRAY]]Senti un tocco di magia in questa cattura...
Fishing.Ability.TH.Boom=[[GRAY]]TEMPO DI BOOM!!!
Fishing.Ability.TH.Poison=[[GRAY]]C'\u00E8 qualcosa che non va bene...
Fishing.SkillName=PESCA
Fishing.Skillup=L'abilit\u00E0 Pesca \u00E8 aumentata di {0}. Totale ({1})
#HERBALISM
Herbalism.Ability.DoubleDropChance=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
Herbalism.Ability.FD=Dieta del Contadino: [[YELLOW]]Grado {0}
Herbalism.Ability.GTe.Length=Durata di Terra Verde: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=Ti servono pi\u00F9 semi per diffondere Terra Verde.
Herbalism.Ability.GTh.Chance=Possibilit\u00E0 di Pollice Verde: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=[[RED]]**POLLICE VERDE FALLITO**
Herbalism.Ability.GTh.Stage=Stadio di Pollice Verde: [[YELLOW]] Il raccolto cresce allo stadio {0}
Herbalism.Ability.GTh=[[GREEN]]**POLLICE VERDE**
Herbalism.Ability.HylianLuck=Probabilit\u00E0 di Fortuna Hylian: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**ABBASSI LA ZAPPA**
Herbalism.Ability.Ready=[[GREEN]]**PREPARI LA ZAPPA**
Herbalism.Ability.ShroomThumb.Chance=Possibilit\u00E0 di Pollice Fungo: [[YELLOW]]{0}
Herbalism.Ability.ShroomThumb.Fail=**POLLICE FUNGO FALLITO**
Herbalism.SubSkill.GreenTerra.Name=Terra Verde (CAPACIT\u00C0)
Herbalism.SubSkill.GreenTerra.Description=Diffonde il Verde, Drop x3
Herbalism.SubSkill.GreenThumb.Name=Pollice Verde (Grano)
Herbalism.SubSkill.GreenThumb.Description=Auto-Pianta il grano quando viene raccolto
Herbalism.Effect.4=Pollice Verde (Blocchi)
Herbalism.SubSkill.GreenThumb.Description.2=Rende i mattoni muscosi, o fa crescere l'erba
Herbalism.SubSkill.FarmersDiet.Name=Dieta del Contadino
Herbalism.SubSkill.FarmersDiet.Description=Aumenta la fame recuperata tramite cibi coltivati
Herbalism.SubSkill.DoubleDrops.Name=Doppi Drop (Ogni Pianta)
Herbalism.SubSkill.DoubleDrops.Description=Raddoppia il normale drop
Herbalism.SubSkill.HylianLuck.Name=Fortuna Hylian
Herbalism.SubSkill.HylianLuck.Description=D\u00E0 una modesta possibilit\u00E0 di trovare oggetti rari
Herbalism.SubSkill.ShroomThumb.Name=Pollice Fungo
Herbalism.SubSkill.ShroomThumb.Description=Diffonde il micelio su terra & erba
Herbalism.HylianLuck=[[GREEN]]Oggi la fortuna di Hyrule \u00E8 con te!
Herbalism.Listener=Erboristeria:
Herbalism.SkillName=ERBORISTERIA
Herbalism.Skills.GTe.Off=**Terra Verde si \u00E8 esaurita**
Herbalism.Skills.GTe.On=[[GREEN]]**TERRA VERDE ATTIVATA**
Herbalism.Skills.GTe.Refresh=[[GREEN]]La tua abilit\u00E0 [[YELLOW]]Terra Verde [[GREEN]]si \u00E8 rigenerata!
Herbalism.Skills.GTe.Other.Off=Terra Verde[[GREEN]] si \u00E8 esaurita per [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Terra Verde!
Herbalism.Skillup=L'abilit\u00E0 Erboristeria \u00E8 aumentata di {0}. Totale ({1})
#MINING
Mining.Ability.Length=Durata di Super Demolitore: [[YELLOW]]{0}s
Mining.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ESTRAZIONE ESPLOSIVA)
Mining.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0} (BOMBE PI\u00D9 GRANDI)
Mining.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PERIZIA NELLE DEMOLIZIONI)
Mining.Ability.Lower=[[GRAY]]**ABBASSI IL PICCONE**
Mining.Ability.Ready=[[GREEN]]**PREPARI IL PICCONE**
Mining.SubSkill.SuperBreaker.Name=Super Demolitore (CAPACIT\u00C0)
Mining.SubSkill.SuperBreaker.Description=+ Velocit\u00E0, Possibilit\u00E0 di Triplo Drop
Mining.SubSkill.DoubleDrops.Name=Doppi Drop
Mining.SubSkill.DoubleDrops.Description=Raddoppia il normale drop
Mining.SubSkill.BlastMining.Name=Estrazione Esplosiva
Mining.SubSkill.BlastMining.Description=Bonus a estrarre minerali col TNT
Mining.SubSkill.BiggerBombs.Name=Bombe Pi\u00F9 Grandi
Mining.SubSkill.BiggerBombs.Description=Incrementa il raggio di esplosione del TNT
Mining.SubSkill.DemolitionsExpertise.Name=Perizia nelle Demolizioni
Mining.SubSkill.DemolitionsExpertise.Description=Riduce il danno da esplosioni di TNT
Mining.Effect.Decrease=Riduzione del Danno da Esperto di Demolizioni: [[YELLOW]]{0}
Mining.Effect.DropChance=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
Mining.Listener=Estrazione:
Mining.SkillName=ESTRAZIONE
Mining.Skills.SuperBreaker.Off=**Super Demolitore si \u00E8 esaurito**
Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER DEMOLITORE ATTIVATO**
Mining.Skills.SuperBreaker.Other.Off=Super Demolitore[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Super Demolitore!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Super Demolitore [[GREEN]]si \u00E8 rigenerata!
Mining.Skillup=L'abilit\u00E0 Estrazione \u00E8 aumentata di {0}. Totale ({1})
#Blast Mining
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Effect=+{0} minerale raccolto, -{1} macerie prodotte, drop x{2}
Mining.Blast.Radius.Increase=Incremento del Raggio di Esplosione: [[YELLOW]]+{0}
Mining.Blast.Rank=Estrazione Esplosiva: [[YELLOW]] Grado {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Estrazione Esplosiva!
Mining.Blast.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Estrazione Esplosiva [[GREEN]]si \u00E8 rigenerata!
#REPAIR
Repair.SubSkill.Repair.Name=Riparazione
Repair.SubSkill.Repair.Description=Ripara Attrezzi & Armature
Repair.SubSkill.GoldRepair.Name=Riparazione Oro (ABILIT\u00C0 {0}+)
Repair.SubSkill.GoldRepair.Description=Ripara Attrezzi & Armature d'Oro
Repair.SubSkill.IronRepair.Name=Riparazione Ferro (ABILIT\u00C0 {0}+)
Repair.SubSkill.IronRepair.Description=Ripara Attrezzi & Armature di Ferro
Repair.SubSkill.StoneRepair.Name=Riparazione Pietra (ABILIT\u00C0 {0}+)
Repair.SubSkill.StoneRepair.Description=Ripara Attrezzi di Pietra
Repair.SubSkill.RepairMastery.Name=Maestria nella Riparazione
Repair.SubSkill.RepairMastery.Description=Riparazione incrementata
Repair.SubSkill.SuperRepair.Name=Super Riparazione
Repair.SubSkill.SuperRepair.Description=Doppia efficacia
Repair.SubSkill.DiamondRepair.Name=Ripara Diamante (ABILIT\u00C0 {0}+)
Repair.SubSkill.DiamondRepair.Description=Ripara Attrezzi & Armature di Diamante
Repair.SubSkill.ArcaneForging.Name=Forgiatura Arcana
Repair.SubSkill.ArcaneForging.Description=Ripara oggetti magici
Repair.Error=[[DARK_RED]]mcMMO si \u00E8 imbattuto in un errore mentre tentava di riparare questo oggetto!
Repair.Listener.Anvil=[[DARK_RED]]Hai piazzato un'incudine; le incudini possono riparare attrezzi e armature.
Repair.Listener=Riparazione:
Repair.SkillName=RIPARAZIONE
Repair.Skills.AdeptDiamond=[[DARK_RED]]Non sei abbastanza abile da riparare il Diamante.
Repair.Skills.AdeptGold=[[DARK_RED]]Non sei abbastanza abile da riparare l'Oro.
Repair.Skills.AdeptIron=[[DARK_RED]]Non sei abbastanza abile da riparare il Ferro.
Repair.Skills.AdeptStone=[[DARK_RED]]Non sei abbastanza abile da riparare la Pietra.
Repair.Skills.Adept=Devi essere di livello [[YELLOW]]{0}[[RED]] per riparare [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]Ti \u00E8 sembrato facile.
Repair.Skills.FullDurability=[[GRAY]]\u00C8 gi\u00E0 a piena durevolezza.
Repair.Skills.Mastery=Maestria nella Riparazione: [[YELLOW]]{0} durabilit\u00E0 aggiuntiva ripristinata
Repair.Skills.StackedItems=[[DARK_RED]]Non puoi riparare oggetti ammucchiati.
Repair.Skills.Super.Chance=Possibilit\u00E0 Super Riparazione: [[YELLOW]]{0}
Repair.Skillup=L'abilit\u00E0 Riparazione \u00E8 aumentata di {0}. Totale ({1})
Repair.Pretty.Name=Riparazione
#Arcane Forging
Repair.Arcane.Chance.Downgrade=[[GRAY]]Probabilit\u00E0 di Degradazione di FA: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]Tasso di Successo di FA: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=Il potere arcano di questo oggetto \u00E8 diminuito.
Repair.Arcane.Fail=Il potere arcano ha abbandonato l'oggetto permanentemente.
Repair.Arcane.Lost=Non sei stato abbastanza abile da mantenere alcun incantesimo.
Repair.Arcane.Perfect=[GREEN]]Hai mantenuto le energie arcane in questo oggetto.
Repair.Arcane.Rank=Forgiatura Arcana: [[YELLOW]]Grado {0}/4
#SALVAGE
Salvage.Pretty.Name=Rottamazione
Salvage.SubSkill.AdvancedSalvage.Name=Rottamazione Avanzata
Salvage.SubSkill.AdvancedSalvage.Description=Rottama oggetti danneggiati
Salvage.SubSkill.ArcaneSalvaging.Name=Rottamazione Arcana
Salvage.SubSkill.ArcaneSalvaging.Description=Estrai incantesimi dagli oggetti
Salvage.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ROTTAMAZIONE AVANZATA)
Salvage.Ability.Bonus.0=Rottamazione Avanzata
Salvage.Ability.Bonus.1=Massima resa {0} oggetti distrutti
Salvage.Arcane.Rank=Recupero Arcano: [[YELLOW]]Grado {0}/{1}
Salvage.Arcane.ExtractFull=[[GRAY]]Probabilit\u00E0 di incantamento AS completo
Salvage.Arcane.ExtractPartial=[[GRAY]]Probabilit\u00E0 di incantamento AS parziale
Salvage.Skills.Success=[[GREEN]]Oggetto rottamato!
Salvage.Skills.Adept.Damaged=[[DARK_RED]]Non sei abbastanza abile da rottamare gli oggetti danneggiati.
Salvage.Skills.Adept.Level=Devi essere di livello [[YELLOW]]{0}[[RED]] per rottamare [[YELLOW]]{1}
Salvage.Skills.TooDamaged=[[DARK_RED]]Questo oggetto \u00E8 troppo danneggiato per essere rottamato.
Salvage.Skills.ArcaneFailed=Non sei stato capace di estrarre la conoscenza contenuta in questo oggetto.
Salvage.Skills.ArcanePartial=Sei stato solo in grado di estrarre alcune delle conoscenze contenute all'interno di questo oggetto.
Salvage.Skills.ArcaneSuccess=[[GREEN]]Sei in grado di estrarre tutte le conoscenze contenute in questo oggetto!
Salvage.Listener.Anvil=[[DARK_RED]]Hai piazzato un'incudine da Rottamazione, usala per Rottamare attrezzi e armature.
Salvage.Listener=Rottamazione:
Salvage.SkillName=ROTTAMAZIONE
#SWORDS
Swords.Ability.Lower=[[GRAY]]**ABBASSI LA SPADA**
Swords.Ability.Ready=[[GREEN]]**PREPARI LA SPADA**
Swords.Combat.Bleed.Chance=Possibilit\u00E0 di Emorragia: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=Durata di Emorragia: [[YELLOW]]{0} tick
Swords.Combat.Bleed.Note=[[GRAY]]NOTA: [[YELLOW]]1 Tick si verifica ogni 2 secondi
Swords.Combat.Bleeding.Started=[[DARK_RED]] Stai sanguinando!
Swords.Combat.Bleeding.Stopped=[[GRAY]]L'emorragia si \u00E8 [[GREEN]]fermata[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**IL NEMICO HA UN'EMORRAGIA**
Swords.Combat.Counter.Chance=Possibilit\u00E0 di Contrattacco: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]Colpisci con un contrattacco!
Swords.Combat.Countered=[[GREEN]]**CONTRATTACCATO**
Swords.Combat.SS.Struck=[[DARK_RED]]Colpito da COLPI SEGHETTATI!
Swords.SubSkill.CounterAttack.Name=Contrattacco
Swords.SubSkill.CounterAttack.Description=Riflette il {0} del danno sub\u00ECto mentre si blocca
Swords.SubSkill.SerratedStrikes.Name=Colpi Seghettati (CAPACIT\u00C0)
Swords.SubSkill.SerratedStrikes.Description={0} Danni EaA, Emorragia+ EaA
Swords.Effect.4=Colpi Seghettati Emorragia+
Swords.Effect.5={0} Tick di Emorragia
Swords.SubSkill.Bleed.Name=Emorragia
Swords.SubSkill.Bleed.Description=Infligge danno ciclico da sanguinamento
Swords.Listener=Spade:
Swords.SkillName=SPADE
Swords.Skills.SS.Off=**Colpi Seghettati si \u00E8 esaurito**
Swords.Skills.SS.On=[[GREEN]]**SERRATED STRIKES ACTIVATED**
Swords.Skills.SS.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Colpi Seghettati [[GREEN]]si \u00E8 rigenerata!
Swords.Skills.SS.Other.Off=Colpi Seghettati[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Colpi Seghettati!
Swords.Skillup=L'abilit\u00E0 Spade \u00E8 aumentata di {0}. Totale ({1})
Swords.SS.Length=Durata di Colpi Seghettati: [[YELLOW]]{0}s
#TAMING
Taming.Ability.Bonus.0=Sicurezza Ambientale
Taming.Ability.Bonus.1=I lupi evitano il pericolo
Taming.Ability.Bonus.2=Pelliccia Folta
Taming.Ability.Bonus.3=1/{0} Danno, Resistenza al Fuoco
Taming.Ability.Bonus.4=A Prova d'Urto
Taming.Ability.Bonus.5=Gli esplosivi fanno 1/{0} del normale danno
Taming.Ability.Bonus.6=Artigli Affilati
Taming.Ability.Bonus.7=+{0} al Danno
Taming.Ability.Bonus.8=Servizio Fast Food
Taming.Ability.Bonus.9={0} Probabilit\u00E0 di guarire quando si attacca
Taming.Ability.Bonus.10=Segugio del Cielo
Taming.Ability.Bonus.11=Recupera salute quando viene danneggiato da magia o veleno
Taming.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SICUREZZA AMBIENTALE)
Taming.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (PELLICCIA FOLTA)
Taming.Ability.Locked.2=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (A PROVA D'URTO)
Taming.Ability.Locked.3=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ARTIGLI AFFILATI)
Taming.Ability.Locked.4=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SERVIZIO FAST FOOD)
Taming.Ability.Locked.5=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SEGUGIO DEL CIELO)
Taming.Combat.Chance.Gore=Possibilit\u00E0 di Sbranare: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=Conoscenza delle Bestie
Taming.SubSkill.BeastLore.Description=Esamina lupi e ocelot picchiandoli con un osso
Taming.SubSkill.ShockProof.Name=A Prova d'Urto
Taming.SubSkill.ShockProof.Description=Riduzione del Danno da Esplosione.
Taming.SubSkill.CallOfTheWild.Name=Richiamo della Natura
Taming.SubSkill.CallOfTheWild.Description=Evoca un animale al tuo fianco
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW: Accovacciati e fai click destro con\n {0} {1} (Ocelot), {2} {3} (Lupo), {4} {5} (Cavallo)
Taming.SubSkill.FastFoodService.Name=Servizio Fast Food
Taming.SubSkill.FastFoodService.Description=Probabilit\u00E0 per i lupi di guarire quando attaccano
Taming.SubSkill.HolyHound.Name=Segugio del Cielo
Taming.SubSkill.HolyHound.Description=Guarito da Magia & Veleno
Taming.SubSkill.Gore.Name=Sbranare
Taming.SubSkill.Gore.Description=Colpo Critico che applica Emorragia
Taming.SubSkill.SharpenedClaws.Name=Artigli Affilati
Taming.SubSkill.SharpenedClaws.Description=Danno Bonus
Taming.SubSkill.EnvironmentallyAware.Name=Sicurezza Ambientale
Taming.SubSkill.EnvironmentallyAware.Description=Evita Cactus/Lava, Immune alle Cadute
Taming.SubSkill.ThickFur.Name=Pelliccia Folta
Taming.SubSkill.ThickFur.Description=Riduzione del Danno, Resistenza al Fuoco
Taming.Listener.Wolf=[[DARK_GRAY]]Il tuo lupo si precipita da te...
Taming.Listener=Addomesticamento:
Taming.SkillName=ADDOMESTICAMENTO
Taming.Skillup=L'abilit\u00E0 Addomesticamento \u00E8 aumentata di {0}. Totale ({1})
Taming.Summon.Complete=[[GREEN]]Evocazione completa
Taming.Summon.Lifespan=(Durata: {0}s)
Taming.Summon.Fail.Ocelot=Hai troppi ocelot vicino per poterne evocare degli altri.
Taming.Summon.Fail.Wolf=Hai troppi lupi vicino per poterne evocare degli altri.
Taming.Summon.Fail.Horse=Hai troppi cavalli nelle vicinanze per evocarne altri.
Taming.Summon.Fail.TooMany=Hai raggiunto il limite massimo di animali evocabili. [[YELLOW]]({0})
Taming.Summon.Name.Format={1} di {0}
#UNARMED
Unarmed.Ability.Berserk.Length=Durata di Furore: [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=Stile del Braccio di Ferro
Unarmed.Ability.Bonus.1=Potenziamento Danno +{0}
Unarmed.Ability.Chance.ArrowDeflect=Possibilit\u00E0 di Deviare Freccia: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=Possibilit\u00E0 di Disarmare: [[YELLOW]]{0}
Unarmed.Ability.Chance.IronGrip=Probabilit\u00E0 di Presa di Ferro: [[YELLOW]{0}
Unarmed.Ability.IronGrip.Attacker=Il tuo avversario ha una presa di ferro!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]La tua presa di ferro ha evitato che venissi disarmato!
Unarmed.Ability.Lower=[[GRAY]]**ABBASSI I PUGNI**
Unarmed.Ability.Ready=[[GREEN]]**PREPARI I PUGNI**
Unarmed.SubSkill.Berserk.Name=Furore (CAPACIT\u00C0)
Unarmed.SubSkill.Berserk.Description=+50% Danni, Rompe materiali fragili
Unarmed.SubSkill.Disarm.Name=Disarmare (Giocatori)
Unarmed.SubSkill.Disarm.Description=Fa cadere l'oggetto tenuto in mano dal nemico
Unarmed.SubSkill.IronArmStyle.Name=Stile del Braccio di Ferro
Unarmed.SubSkill.IronArmStyle.Description=Ti indurisce il braccio col passare del tempo
Unarmed.SubSkill.ArrowDeflect.Name=Deviazione Frecce
Unarmed.SubSkill.ArrowDeflect.Description=Deviare frecce
Unarmed.SubSkill.IronGrip.Name=Presa di Ferro
Unarmed.SubSkill.IronGrip.Description=Ti impedisce di venire disarmato
Unarmed.Listener=Lotta:
Unarmed.SkillName=LOTTA
Unarmed.Skills.Berserk.Off=**Furore si \u00E8 esaurito**
Unarmed.Skills.Berserk.On=[[GREEN]]**FURORE ATTIVATO**
Unarmed.Skills.Berserk.Other.Off=Furore[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Furore!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Furore [[GREEN]]si \u00E8 rigenerata!
Unarmed.Skillup=L'abilit\u00E0 Lotta \u00E8 aumentata di {0}. Totale ({1})
#WOODCUTTING
Woodcutting.Ability.0=Soffia Foglie
Woodcutting.Ability.1=Soffia via le foglie
Woodcutting.Ability.Chance.DDrop=Possibilit\u00E0 di Doppio Drop: [[YELLOW]]{0}
Woodcutting.Ability.Length=Durata di Abbatti Alberi: [[YELLOW]]{0}s
Woodcutting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (SOFFIA FOGLIE)
Woodcutting.SubSkill.TreeFeller.Name=Abbattitore d'Alberi (CAPACIT\u00C0)
Woodcutting.SubSkill.TreeFeller.Description=Fa esplodere gli alberi
Woodcutting.SubSkill.LeafBlower.Name=Soffia Foglie
Woodcutting.SubSkill.LeafBlower.Description=Soffia via le foglie
Woodcutting.SubSkill.HarvestLumber.Name=Doppi Drop
Woodcutting.SubSkill.HarvestLumber.Description=Raddoppia il normale drop
Woodcutting.Listener=Taglialegna:
Woodcutting.SkillName=TAGLIALEGNA
Woodcutting.Skills.TreeFeller.Off=**Abbattitore d'Alberi si \u00E8 esaurito**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**ABBATTITORE D'ALBERI ATTIVATO**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]La tua capacit\u00E0 [[YELLOW]]Abbattitore d'Alberi [[GREEN]]si \u00E8 rigenerata!
Woodcutting.Skills.TreeFeller.Other.Off=Abbattitore d'Alberi[[GREEN]] si \u00E8 esaurito per [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] ha usato [[RED]]Abbattitore d'Alberi!
Woodcutting.Skills.TreeFeller.Splinter=LA TUA ASCIA SI FRANTUMA IN DECINE DI PEZZI!
Woodcutting.Skills.TreeFeller.Threshold=Quell'albero \u00E8 troppo grande!
Woodcutting.Skillup=L'abilit\u00E0 Taglialegna \u00E8 aumentata di {0}. Totale ({1})
#ABILITIY
##generic
Ability.Generic.Refresh=[[GREEN]]**CAPACIT\u00C0 RIGENERATE!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
#COMBAT
Combat.ArrowDeflect=[[WHITE]]**FRECCIA DEVIATA**
Combat.BeastLore=[[GREEN]]**CONOSCENZA DELLE BESTIE**
Combat.BeastLoreHealth=[[DARK_AQUA]]Salute ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Proprietario ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**SBRANATO**
Combat.StruckByGore=**SEI STATO SBRANATO**
Combat.TargetDazed=Il bersaglio \u00E8 rimasto [[DARK_RED]]Stordito
Combat.TouchedFuzzy=Urto Stordino. Vado nel Pallone.
#COMMANDS
##generic
mcMMO.Description=[[DARK_AQUA]]Riguardo il [[DARK_AQUA]]Progetto [[YELLOW]]mcMMO:,[[GOLD]]mcMMO \u00E8 una mod GdR [[RED]]open source[[GOLD]] creata nel Febbraio 2011,[[GOLD]]da [[BLUE]]com.gmail.nossr50[[GOLD]]. L'obiettivo \u00E8 quello di fornire un'esperienza GdR di qualit\u00E0.,[[DARK_AQUA]]Suggerimenti:,[[GOLD]] - [[GREEN]]Usa [[RED]]/mcmmo help[[GREEN]] per vedere i comandi,[[GOLD]] - [[GREEN]]Digita [[RED]]/NOMEABILIT\u00C0[[GREEN]] per vedere informazioni dettagliate su un'abilit\u00E0,[[DARK_AQUA]]Sviluppatori:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Fondatore),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Capo Progetto),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Sviluppatore),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Sviluppatore),[[DARK_AQUA]]Link Utili:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Segnalazione Bug,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
Commands.addlevels.AwardAll.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in tutte le abilit\u00E0!
Commands.addlevels.AwardAll.2=Tutte le abilit\u00E0 sono state modificate per {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Ti sono stati aggiudicati {0} livelli in {1}!
Commands.addlevels.AwardSkill.2={0} \u00E8 stata modificata per {1}.
Commands.addxp.AwardAll=[[GREEN]]Ti sono stati aggiudicati {0} punti esperienza in tutte le abilit\u00E0!
Commands.addxp.AwardSkill=[[GREEN]]Ti sono stati aggiudicati {0} punti esperienza in {1}!
Commands.Ability.Off=Uso delle capacit\u00E0 [[RED]]disattivato
Commands.Ability.On=Uso delle capacit\u00E0 [[GREEN]]attivato
Commands.Ability.Toggle=L'uso delle abilit\u00E0 \u00E8 stato attivato/disattivato per [[YELLOW]]{0}
Commands.AdminChat.Off=Chat solo Amministratori [[RED]]Inattiva
Commands.AdminChat.On=Chat solo Amministratori [[GREEN]]Attiva
Commands.AdminToggle=[[GREEN]]- Attiva/disattiva la chat amministratori
Commands.Chat.Console=*Console*
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]Ricariche Abilit\u00E0 mcMMO[[GOLD]] =--
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - [[GOLD]]{1} secondi rimanenti
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]Pronto!
Commands.Database.Cooldown=Devi aspettare {0} secondi prima di poter usare questo comando ancora.
Commands.Database.Processing=Il comando precedente \u00E8 ancora in fase di elaborazione. Attendere prego.
Commands.Disabled=Questo comando \u00E8 disabilitato.
Commands.DoesNotExist=Il giocatore non esiste nel database!
Commands.GodMode.Disabled=Modalit\u00E0 Dio di mcMMO Disabilitata
Commands.GodMode.Enabled=Modalit\u00E0 Dio di mcMMO Abilitata
Commands.GodMode.Forbidden=[mcMMO] Modalit\u00E0 Dio non permessa in questo mondo (Vedi i Permessi)
Commands.GodMode.Toggle=La modalit\u00E0 Dio \u00E8 stata attivata/disattivata per [[YELLOW]]{0}
Commands.Healthbars.Changed.HEARTS=[mcMMO] Il tuo tipo di barra della salute \u00E8 stato cambiato a [[RED]]Cuori[[WHITE]].
Commands.Healthbars.Changed.BAR=[mcMMO] Il tuo tipo di barra della salute \u00E8 stato cambiato a [[YELLOW]]Caselle[[WHITE]].
Commands.Healthbars.Changed.DISABLED=[mcMMO] Le tue barre di salute dei mob sono state [[GRAY]]disabilitate[[WHITE]].
Commands.Healthbars.Invalid=Tipo di barra della salute non valido!
Commands.Inspect=<giocatore> [[GREEN]]- Visualizza informazioni dettagliate sul giocatore
Commands.Invite.Success=[[GREEN]]Invito inviato con successo.
Commands.Leaderboards=<abilit\u00E0> <pagina> [[GREEN]]- Classifiche
Commands.mcc.Header=---[][[GREEN]]Comandi di mcMMO[[RED]][]---
Commands.mcgod=[[GREEN]]- Attiva o disattiva la Modalit\u00E0 Dio
Commands.mchud.Invalid=Quello non \u00E8 un tipo di HUD valido.
Commands.mcpurge.Success=[[GREEN]]Il database \u00E8 stato ripulito con successo!
Commands.mcrank.Heading=[[GOLD]]-=GRADUATORIA PERSONALE=-
Commands.mcrank.Overall=Complessivo[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=BERSAGLIO: [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Grado [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]Non Classificato
Commands.mcrefresh.Success=Le ricariche di {0} sono stati rigenerate.
Commands.mcremove.Success=[[GREEN]]{0} \u00E8 stato rimosso con successo dal database!
Commands.mctop.Tip=[[GOLD]]Suggerimento: Usa [[RED]]/mcrank[[GOLD]] per visualizzare tutte le tue graduatorie personali!
Commands.mmoedit=[giocatore] <abilit\u00E0> <nuovovalore> [[GREEN]] - Modifica il bersaglio
Commands.mmoedit.AllSkills.1=[[GREEN]]Il tuo livello in tutte le abilit\u00E0 \u00E8 stato portato a {0}!
Commands.mmoedit.Modified.1=[[GREEN]]Il tuo livello di {0} \u00E8 stato portato a {1}!
Commands.mmoedit.Modified.2={0} \u00E8 stata modificata per {1}.
Commands.mcconvert.Database.Same=Stai gi\u00E0 usando il database {0}!
Commands.mcconvert.Database.InvalidType={0} non \u00E8 un tipo di database valido.
Commands.mcconvert.Database.Start=[[GRAY]]Avviando la conversione da {0} a {1}...
Commands.mcconvert.Database.Finish=[[GRAY]]Migrazione del database completa; il database {1} ora ha tutti i dati dal database {0}.
Commands.mmoshowdb=Il database attualmente in uso \u00E8 [[GREEN]]{0}
Commands.mcconvert.Experience.Invalid=Tipo di formula sconosciuta! I tipi validi sono: [[GREEN]]LINEAR [[RED]]e [[GREEN]]EXPONENTIAL.
Commands.mcconvert.Experience.Same=Tipo di formula {0} gi\u00E0 in uso
Commands.mcconvert.Experience.Start=[[GRAY]]Avviando conversione da {0} a {1}
Commands.mcconvert.Experience.Finish=[[GRAY]]Conversione formula completata; adesso in uso {0} XP.
Commands.ModDescription=[[GREEN]]- Leggi breve descrizione di mod
Commands.NoConsole=Questo comando non supporta l'uso da console.
Commands.Notifications.Off=Notifiche delle capacit\u00E0 [[RED]]disattivate
Commands.Notifications.On=Notifiche delle capacit\u00E0 [[GREEN]]attivate
Commands.Offline=Questo comando non funziona per i giocatori offline.
Commands.NotLoaded=Il profilo del giocatore non \u00E8 stato ancora caricato.
Commands.Other=---[][[GREEN]]ALTRI COMANDI[[RED]][]---
Commands.Party.Header=-----[][[GREEN]]GRUPPO[[RED]][]-----
Commands.Party.Features.Header=-----[][[GREEN]]CARATTERISTICHE[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]NOME: [[WHITE]]{0} {1} [[DARK_GRAY]]LIVELLO: [[DARK_AQUA]]{2}
Commands.Party.Status.Alliance=[[DARK_GRAY]]ALLEATO: [[WHITE]]{0}
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]Caratteristiche sbloccate: [[GRAY]][[ITALIC]]{0}
Commands.Party.ShareMode=[[DARK_GRAY]]MODALIT\u00C0 SPARTIZIONE:
Commands.Party.ItemShare=[[GRAY]]OGGETTI [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]ESPERIENZA [[DARK_AQUA]]({0})
Commands.Party.ItemShareCategories=[[DARK_GRAY]]Condivisione Oggetti: [[GRAY]][[ITALIC]]{0}
Commands.Party.MembersNear=[[DARK_GRAY]]VICINO A TE [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=[[GREEN]]- Accetta l'invito di un gruppo
Commands.Party.Chat.Off=Chat Gruppo [[GREEN]]Inattiva
Commands.Party.Chat.On=Chat Gruppo [[GREEN]]Attiva
Commands.Party.Commands=---[][[GREEN]]COMANDI GRUPPO[[RED]][]---
Commands.Party.Invite.0=AVVISO: [[GREEN]]Hai ricevuto un invito ad unirti al gruppo {0} da {1}
Commands.Party.Invite.1=Digita [[GREEN]]/party accept[[YELLOW]] per accettare l'invito
Commands.Party.Invite=[[GREEN]]- Invia un invito a entrare nel gruppo
Commands.Party.Invite.Accepted=[[GREEN]]Invito Accettato. Ti sei unito al gruppo {0}
Commands.Party.Join=[[GRAY]]Ti sei unito al Gruppo: {0}
Commands.Party.Create=[[GRAY]]Creato il Gruppo: {0}
Commands.Party.Rename=[[GRAY]]Nome del gruppo cambiato a: [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]Modalit\u00E0 spartizione del gruppo {0} impostata a: [[DARK_AQUA]]{1}
Commands.Party.ToggleShareCategory=[[GRAY]]La condivisione oggetti del gruppo per [[GOLD]]{0} [[GRAY]]\u00E8 stata [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]Il gruppo {0} esiste gi\u00E0!
Commands.Party.Kick=Sei stato espulso dal gruppo {0}!
Commands.Party.Leave=Hai abbandonato quel gruppo
Commands.Party.Members.Header=-----[][[GREEN]]MEMBRI[[RED]][]-----
Commands.Party.None=Non sei in un gruppo.
Commands.Party.Quit=[[GREEN]]- Abbandona il tuo gruppo attuale
Commands.Party.Teleport=[[GREEN]]- Teletrasportati da un membro del gruppo
Commands.Party.Toggle=[[GREEN]]- Attiva/disattiva la Chat Gruppo
Commands.Party1=[[GREEN]]- Crea un nuovo gruppo
Commands.Party2=[[GREEN]]- Unisciti a un gruppo di giocatori
Commands.Party.Alliance.Header=-----[][[GREEN]]ALLEANZA DEL GRUPPO[[RED]][]-----
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u00C8 ALLEATO CON: [[WHITE]]{1}
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]MEMBRI ALLEANZA[[RED]][]-----
Commands.Party.Alliance.Invite.0=AVVISO: [[GREEN]]Hai ricevuto un invito di alleanza del gruppo per {0} da {1}
Commands.Party.Alliance.Invite.1=Digita [[GREEN]]/party alliance accept[[YELLOW]] per accettare l'invito
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]Invito di alleanza accettato.
Commands.Party.Alliance.None=Il tuo gruppo non ha un alleato.
Commands.Party.Alliance.AlreadyAllies=Il tuo gruppo ha gi\u00E0 un'alleato. Sciogli l'alleanza con [[DARK_AQUA]]/party alliance disband
Commands.Party.Alliance.Help.0=Questo gruppo non ha formato un'alleanza. Invita un capo gruppo.
Commands.Party.Alliance.Help.1=fai un'alleanza con [[DARK_AQUA]]/party alliance invite <giocatore>[[RED]].
Commands.ptp.Enabled=Teletrasporto del gruppo [[GREEN]]abilitato
Commands.ptp.Disabled=Teletrasporto del gruppo [[RED]]disabilitato
Commands.ptp.NoRequests=Non hai richieste di teletrasporto in questo momento
Commands.ptp.NoWorldPermissions=[mcMMO] Non hai il permesso di teletrasportarti verso il mondo {0}.
Commands.ptp.Request1={0} [[GREEN]]ha richiesto di teletrasportarsi da te.
Commands.ptp.Request2=[[GREEN]]Per teletrasportarti digita [[YELLOW]]/ptp accept[[GREEN]]. La richiesta scadr\u00E0 tra [[RED]]{0} [[GREEN]]secondi.
Commands.ptp.AcceptAny.Enabled=Conferma delle richieste di teletrasporto del gruppo [[GREEN]]abilitata
Commands.ptp.AcceptAny.Disabled=Conferma delle richieste di teletrasporto del gruppo [[RED]]disabilitata
Commands.ptp.RequestExpired=La richiesta di teletrasporto del gruppo \u00E8 scaduta!
Commands.PowerLevel.Leaderboard=--Classifica mcMMO dei [[BLUE]]Livelli di Potere[[YELLOW]]--
Commands.PowerLevel.Capped=[[DARK_RED]]LIVELLO DI POTERE: [[GREEN]]{0} [[DARK_RED]]LIVELLO MASSIMO: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]LIVELLO DI POTERE: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]Tutti i tuoi livelli di abilit\u00E0 sono stati azzerati con successo.
Commands.Reset.Single=[[GREEN]]La tua abilit\u00E0 {0} \u00E8 stata azzerata con successo.
Commands.Reset=[[GREEN]]- Reimposta un livello di abilit\u00E0 a 0
Commands.Scoreboard.Clear=[[DARK_AQUA]]scoreboard mcMMO cancellata.
Commands.Scoreboard.NoBoard=La scoreboard mcMMO non \u00E8 attiva.
Commands.Scoreboard.Keep=[[DARK_AQUA]]La scoreboard mcMMO rimmarr\u00E0 fino a quando non userai [[GREEN]]/mcscoreboard clear[[DARK_AQUA]].
Commands.Scoreboard.Timer=[[DARK_AQUA]]La scoreboard mcMMO sar\u00E0 cancellata tra [[GOLD]]{0}[[DARK_AQUA]] secondi da adesso.
Commands.Scoreboard.Help.0=[[GOLD]] == [[GREEN]]Aiuto per [[RED]]/mcscoreboard[[GOLD]] ==
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - cancella la scoreboard McMMO
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - mantiene la scoreboard mcMMO attiva
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - cancella la scoreboard McMMO dopo [[LIGHT_PURPLE]]n[[WHITE]] secondi
Commands.Scoreboard.Tip.Keep=[[GOLD]]Suggerimento: Usa [[RED]]/mcscoreboard keep[[GOLD]] mentre la scoreboard \u00E8 attiva per evitare che vada via.
Commands.Scoreboard.Tip.Clear=[[GOLD]]Suggerimento: Usa [[RED]]/mcscoreboard clear[[GOLD]] per sbarazzarti della scoreboard.
Commands.Skill.Invalid=Questo non \u00E8 un nome di abilit\u00E0 valido!
Commands.Skill.Leaderboard=--Classifica mcMMO di [[BLUE]]{0}[[YELLOW]]--
Commands.SkillInfo=[[GREEN]]- Vedi informazioni dettagliate su un'abilit\u00E0
Commands.Stats.Self=LE TUE STATISTICHE
Commands.Stats=[[GREEN]]- Visualizza le tue statistiche mcMMO
Commands.ToggleAbility=[[GREEN]]- Attiva o disattiva l'attivazione delle abilit\u00E0 con click destro
Commands.Usage.0=[[RED]]L'uso appropriato \u00E8 /{0}
Commands.Usage.1=L'uso appropriato \u00E8 /{0} {1}
Commands.Usage.2=L'uso appropriato \u00E8 /{0} {1} {2}
Commands.Usage.3=L'uso appropriato \u00E8 /{0} {1} {2} {3}
Commands.Usage.FullClassName=nome classe
Commands.Usage.Level=livello
Commands.Usage.Message=messaggio
Commands.Usage.Page=pagina
Commands.Usage.PartyName=nome
Commands.Usage.Password=password
Commands.Usage.Player=giocatore
Commands.Usage.Rate=tasso
Commands.Usage.Skill=abilit\u00E0
Commands.Usage.XP=xp
mcMMO.NoInvites=Non hai inviti in questo momento
mcMMO.NoPermission=[[DARK_RED]]Permessi insufficienti.
mcMMO.NoSkillNote=[[DARK_GRAY]]Se non hai accesso a un'abilit\u00E0 non sar\u00E0 mostrata qui.
##party
Party.Forbidden=[mcMMO] I gruppi non sono permessi in questo mondo (vedi i Permessi)
Party.Help.0=L'uso appropriato \u00E8 [[DARK_AQUA]]{0} <giocatore> [password].
Party.Help.1=Per creare un gruppo, usa [[DARK_AQUA]]{0} <nome> [password].
Party.Help.2=Consulta [[DARK_AQUA]]{0} [[RED]]per maggiori informazioni
Party.Help.3=Usa [[DARK_AQUA]]{0} <giocatore> [password] [[RED]]per unirti o [[DARK_AQUA]]{1} [[RED]]per congedarti
Party.Help.4=Per chiudere o aprire il tuo gruppo, usa [[DARK_AQUA]]{0}
Party.Help.5=Per proteggere il tuo gruppo con una password, usa [[DARK_AQUA]]{0} <password>
Party.Help.6=Per espellere un giocatore dal tuo gruppo, usa [[DARK_AQUA]]{0} <giocatore>
Party.Help.7=Per trasferire la propriet\u00E0 del tuo gruppo, usa [[DARK_AQUA]]{0} <giocatore>
Party.Help.8=Per sciogliere il tuo gruppo, usa [[DARK_AQUA]]{0}
Party.Help.9=Usa [[DARK_AQUA]]{0} [[RED]]per condividere oggetti con i membri del tuo gruppo
Party.Help.10=Usa [[DARK_AQUA]]{0} [[RED]]per abilitare la condivisione di XP con i membri del tuo gruppo
Party.InformedOnJoin={0} [[GREEN]]si \u00E8 unito al tuo gruppo
Party.InformedOnQuit={0} [[GREEN]]ha abbandonato il tuo gruppo
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]ha impostato il nome del gruppo a [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]Questo non \u00E8 un nome di gruppo valido.
Party.Invite.Self=Non puoi invitare te stesso!
Party.IsLocked=Questo gruppo \u00E8 gi\u00E0 chiuso!
Party.IsntLocked=Questo gruppo non \u00E8 chiuso!
Party.Locked=Il gruppo \u00E8 chiuso, solo il capo del gruppo pu\u00F2 fare inviti.
Party.NotInYourParty=[[DARK_RED]]{0} non \u00E8 nel tuo gruppo
Party.NotOwner=[[DARK_RED]]Non sei il capo del gruppo.
Party.Target.NotOwner=[[DARK_RED]]{0} non \u00E8 il capo del gruppo.
Party.Owner.New=[[GREEN]]{0} \u00E8 il nuovo capo del gruppo.
Party.Owner.NotLeader=[[DARK_RED]]Non sei pi\u00F9 il capo del gruppo.
Party.Owner.Player=[[GREEN]]Ora sei il capo del gruppo.
Party.Password.None=Questo gruppo \u00E8 protetto da password. Sei pregato di fornire una password per unirti ad esso.
Party.Password.Incorrect=La password del gruppo \u00E8 errata.
Party.Password.Set=[[GREEN]]Password del gruppo impostata a {0}
Party.Password.Removed=[[GREEN]]La password del gruppo \u00E8 stata rimossa.
Party.Player.Invalid=Quello non \u00E8 un giocatore valido.
Party.NotOnline=[[DARK_RED]]{0} non \u00E8 online!
Party.Player.InSameParty={0} \u00E8 gi\u00E0 nel tuo gruppo!
Party.PlayerNotInParty=[[DARK_RED]]{0} non \u00E8 in un gruppo
Party.Specify=Devi specificare un gruppo.
Party.Teleport.Dead=Non puoi teletrasportarti da un giocatore morto.
Party.Teleport.Hurt=Sei stato ferito negli ultimi {0} secondi e non puoi teletrasportarti.
Party.Teleport.Player=[[GREEN]]Ti sei teletrasportato da {0}.
Party.Teleport.Self=Non puoi teletrasportarti verso te stesso!
Party.Teleport.Target=[[GREEN]]{0} ti ha teletrasportato.
Party.Teleport.Disabled={0} non consente il teletrasporto del gruppo.
Party.Rename.Same=Questo \u00E8 gi\u00E0 il nome del tuo gruppo!
Party.Join.Self=Non puoi unirti a te stesso!
Party.Unlocked=[[GRAY]]Il gruppo \u00E8 aperto
Party.Disband=[[GRAY]]Il gruppo \u00E8 stato sciolto
Party.Alliance.Formed=[[GRAY]]Il tuo gruppo \u00E8 ora alleato con [[GREEN]]{0}
Party.Alliance.Disband=[[GRAY]]Il tuo gruppo non \u00E8 pi\u00F9 alleato con [[RED]]{0}
Party.Status.Locked=[[DARK_RED]](SOLO SU INVITO)
Party.Status.Unlocked=[[DARK_GREEN]](APERTO)
Party.LevelUp=Livello del gruppo aumentato di {0}. Totale ({1})
Party.Feature.Chat=Chat Gruppo
Party.Feature.Teleport=Teletrasporto del Gruppo
Party.Feature.Alliance=Alleanze
Party.Feature.ItemShare=Condivisione Oggetti
Party.Feature.XpShare=Condivisione XP
Party.Feature.Locked.Chat=BLOCCATO FINO A {0}+ (CHAT GRUPPO)
Party.Feature.Locked.Teleport=BLOCCATO FINO A {0}+ (TELETRASPORTO DEL GRUPPO)
Party.Feature.Locked.Alliance=BLOCCATO FINO A {0}+ (ALLEANZE)
Party.Feature.Locked.ItemShare=BLOCCATO FINO A {0}+ (CONDIVISIONE OGGETTI)
Party.Feature.Locked.XpShare=BLOCCATO FINO A {0}+ (CONDIVISIONE XP)
Party.Feature.Disabled.1=La chat del gruppo non \u00E8 stata ancora sbloccata.
Party.Feature.Disabled.2=Il teletrasporto del gruppo non \u00E8 stato ancora sbloccato.
Party.Feature.Disabled.3=Le alleanze del gruppo non sono ancora state sbloccate.
Party.Feature.Disabled.4=La condivisione del gruppo degli oggetti non \u00E8 ancora sbloccata.
Party.Feature.Disabled.5=La condivisione di XP del gruppo non \u00E8 stata ancora sbloccata.
Party.ShareType.Xp=XP
Party.ShareType.Item=OGGETTO
Party.ShareMode.None=NESSUNA
Party.ShareMode.Equal=EQUA
Party.ShareMode.Random=CASUALE
Party.ItemShare.Category.Loot=Bottino
Party.ItemShare.Category.Mining=Estrazione
Party.ItemShare.Category.Herbalism=Erboristeria
Party.ItemShare.Category.Woodcutting=Taglialegna
Party.ItemShare.Category.Misc=Varie
##xp
Commands.XPGain.Acrobatics=Cadere
Commands.XPGain.Alchemy=Preparazione Pozioni
Commands.XPGain.Archery=Attaccare Mostri
Commands.XPGain.Axes=Attaccando Mostri
Commands.XPGain.Child=Ottiene livelli dalle Abilit\u00E0 Madri
Commands.XPGain.Excavation=Scavare e trovare tesori
Commands.XPGain.Fishing=Pescare (ma va'?!)
Commands.XPGain.Herbalism=Raccogliere Piante
Commands.XPGain.Mining=Estrarre Pietra e Minerali Grezzi
Commands.XPGain.Repair=Riparare
Commands.XPGain.Swords=Attaccare Mostri
Commands.XPGain.Taming=Addomesticare Animali, o combattere con i tuoi lupi
Commands.XPGain.Unarmed=Attaccare Mostri
Commands.XPGain.Woodcutting=Abbattere alberi
Commands.XPGain=[[DARK_GRAY]]GUADAGNO XP: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]La tua BARRA XP \u00E8 ora bloccata a {0}!
Commands.xplock.unlocked=[[GOLD]]La tua BARRA XP \u00E8 ora [[GREEN]]SBLOCCATA[[GOLD]]!
Commands.xprate.modified=Il TASSO XP \u00E8 stato portato a {0}
Commands.xprate.over=L'evento mcMMO di tasso XP \u00E8 FINITO!!
Commands.xprate.proper.0=L'uso corretto per cambiare il tasso di XP \u00E8 /xprate <numero intero> <true/false>
Commands.xprate.proper.1=L'uso corretto per ripristinare il tasso di XP al valore originale \u00E8 /xprate reset
Commands.xprate.proper.2=Per favore specifica "true" o "false" per indicare se questo \u00E8 un evento XP o meno
Commands.xprate.started.0=[[GOLD]]\u00C8 INIZIATO UN EVENTO XP PER mcMMO!
Commands.xprate.started.1=[[GOLD]]IL TASSO DI XP DI mcMMO ORA \u00C8 {0}x!
XPRate.Event=[[GOLD]]\u00C8 in corso un evento mcMMO sul tasso XP! Il tasso XP \u00E8 {0}x!
#EFFECTS
##generic
Effects.Effects=EFFETTI
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]LVL: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
#GUIDES
Guides.Available=[[GRAY]]Guida per {0} disponibile - digita /{1} ? [pagina]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Guida[[GOLD]]=-
Guides.Page.Invalid=Non \u00E8 un numero di pagina valido!
Guides.Page.OutOfRange=Quella pagina non esiste, ci sono solo {0} pagine in totale.
Guides.Usage=L'uso \u00E8 /{0} ? [pagina]
##Acrobatics
Guides.Acrobatics.Section.0=[[DARK_AQUA]]Riguardo L'Acrobatica:\n[[YELLOW]]L'Acrobatica \u00E8 l'arte di muoversi con grazia in mcMMO.\n[[YELLOW]]Essa fornisce bonus di combattimento e bonus di danni ambientali.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 \u00E8 necessario\n[[YELLOW]]eseguire schivate in combattimento\n[[YELLOW]]o sopravvivere a cadute che danneggiano.
Guides.Acrobatics.Section.1=[[DARK_AQUA]]Come funziona Rotolamento?\n[[YELLOW]]Hai una possibilit\u00E0 passiva quando prendi danni da caduta\n[[YELLOW]]di annullare il danno subito. Puoi tenere premuto il pulsante di\n[[YELLOW]]accovacciata per raddoppiare la possibilit\u00E0 durante la caduta.\n[[YELLOW]]Questo attiva una Capriola Aggraziata invece di quella\n[[YELLOW]]standard. Le Capriole Aggraziate sono come quelle normali\n[[YELLOW]]ma hanno il doppio delle probabilit\u00E0 di verificarsi e forniscono\n[[YELLOW]]pi\u00F9 sicurezza. La possibilit\u00E0 di capriola \u00E8 legata al livello abilit\u00E0
Guides.Acrobatics.Section.2=[[DARK_AQUA]]Come funziona la Schivata?\n[[YELLOW]]La Schivata \u00E8 una possibilit\u00E0 passiva quando si \u00E8\n[[YELLOW]]feriti in combattimento di dimezzare il danno preso.\n[[YELLOW]]\u00C8 legato al tuo livello di abilit\u00E0.
##Alchemy
Guides.Alchemy.Section.0=[[DARK_AQUA]]Riguardo l'Alchimia:\n[[YELLOW]]L'Alchimia riguarda il preparare pozioni.\n[[YELLOW]]Fornisce un aumento di velocit\u00E0 nella produzione di pozioni, cos\u00EC\n[[YELLOW]]come l'aggiunta di nuove (prima) pozioni introvabili.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 devi preparare pozioni.
Guides.Alchemy.Section.1=[[DARK_AQUA]]Come funziona la Catalisi?\n[[YELLOW]]La Catalisi accelera il processo di preparazione,\n[[YELLOW]]con una velocit\u00E0 massima di 4x al livello 1000.\n[[YELLOW]]Questa abilit\u00E0 \u00E8 sbloccata al livello 100 di default.
Guides.Alchemy.Section.2=[[DARK_AQUA]]Come funziona Intrugli?\n[[YELLOW]]Intrugli consente di preparare pi\u00F9 pozioni con ingredienti\n[[YELLOW]]personalizzati. Quali ingredienti speciali sono sbloccati\n[[YELLOW]]\u00C8 determinato dal tuo Grado. Ci sono 8 Gradi da sbloccare.
Guides.Alchemy.Section.3=[[DARK_AQUA]]Ingredienti Intrugli livello 1:\n[[YELLOW]]Polvere di Blaze, Occhio di Ragno Fermentato, Lacrima di Ghast,\n[[YELLOW]]Polvere di Luminite, Zucchero, Melone Luccicante,\n[[YELLOW]]Carota d'Oro, Crema di Magma, Verruca del Nether,\n[[YELLOW]]Occhio di Ragno, Zolfo, Ninfea, Pesce Palla\n[[YELLOW]](Pozioni Vanilla)
Guides.Alchemy.Section.4=[[DARK_AQUA]]Ingredienti Intrugli livello 2:\n[[YELLOW]]Carota (Pozione della Velocit\u00E0)\n[[YELLOW]]Palla di Gelatina (Pozione di Noia)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 3:\n[[YELLOW]]Quarzo (Pozione di Assorbimento)\n[[YELLOW]]Fungo Rosso (Pozione del Salto)
Guides.Alchemy.Section.5=[[DARK_AQUA]]Ingredienti Intrugli livello 4:\n[[YELLOW]]Mela (Pozione di Potenziamento Salute)\n[[YELLOW]]Carne Marcia (Pozione della Fame)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 5:\n[[YELLOW]]Fungo Marrone (Pozione di Nausea)\n[[YELLOW]]Sacca d'Inchiostro (Pozione di Cecit\u00E0)
Guides.Alchemy.Section.6=[[DARK_AQUA]]Ingredienti Intrugli livello 6:\n[[YELLOW]]Felce (Pozione di Saturazione)\n\n[[DARK_AQUA]]Ingredienti Intrugli livello 7:\n[[YELLOW]]Patata Velenosa (Pozione di Decadimento)\n\n[[DARK_AQUA]]Concoctions tier 8 ingredients:\n[[YELLOW]]Mela d'Oro (Pozione di Resistenza)
##Archery
Guides.Archery.Section.0=[[DARK_AQUA]]Riguardo Tiro con l'Arco:\n[[YELLOW]]Tiro con l'Arco riguarda il tirare con arco e freccia.\n[[YELLOW]]Fornisce vari bonus di combattimento, come un incremento\n[[YELLOW]]di danno che scala con il livello e l'abilit\u00E0 di stordire i tuoi\n[[YELLOW]]avversari in PvP. Inoltre puoi recuperare alcune delle\n[[YELLOW]]frecce spese dai cadaveri dei tuoi nemici.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 \u00E8 necessario\n[[YELLOW]]colpire i mob o gli altri giocatori.
Guides.Archery.Section.1=[[DARK_AQUA]]Come funziona Tiro da Maestro?\n[[YELLOW]]Tiro da Maestro fornisce un danno aggiuntivo ai tuoi colpi.\n[[YELLOW]]Il danno bonus da Tiro da Maestro aumenta\n[[YELLOW]]all'aumentare del livello di Tiro con l'Arco.\n[[YELLOW]]Con le impostazioni di default, il danno dei tiri con l'arco\n[[YELLOW]]aumenta del 10% ogni 50 livelli, fino a un massimo del 200%.
Guides.Archery.Section.2=[[DARK_AQUA]]Come funziona Stordire?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di stordire gli altri giocatori quando\n[[YELLOW]]li colpisci. Quando Stordire si innesca costringe gli avversari\n[[YELLOW]]a guardare verso l'alto per una breve durata.\n[[YELLOW]]Un colpo di Stordire procura anche ulteriori 4 danni (2 cuori).
Guides.Archery.Section.3=[[DARK_AQUA]]Come funziona Recupero Frecce?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di recuperare alcune\n[[YELLOW]]delle tue frecce quando uccidi un mob con l'arco.\n[[YELLOW]]Questa possibilit\u00E0 \u00E8 aumentata dal livello in Tiro con l'Arco.\n[[YELLOW]Di default, questa capacit\u00E0 aumenta di 0.1% per livello,\n[[YELLOW]]fino al 100% al livello 1000.
##Axes
Guides.Axes.Section.0=[[DARK_AQUA]]Riguardo Asce:\n[[YELLOW]]Con l'abilit\u00E0 Asce \u00E8 possibile utilizzare l'ascia per molto di\n[[YELLOW]]pi\u00F9 che solo deforestare! \u00E8 possibile incidere e sgretolare\n[[YELLOW]]mob e giocatori per guadagnare XP, colpire mob con l'effetto\n[[YELLOW]]di contraccolpo e infliggere danni critici MORTALI sui mob e\n[[YELLOW]]giocatori. La tua ascia diventa anche un biotrituratore\n[[YELLOW]]portatile, abbattendo l'armatura del nemico con facilit\u00E0 con\n[[YELLOW]]l'aumentare del livello.\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0 devi colpire mob\n[[YELLOW]]o altri giocatori con la tua Ascia.
Guides.Axes.Section.1=[[DARK_AQUA]]Come funziona Spacca Crani?\n[[YELLOW]]Questa capacit\u00E0 consente di fare un colpo EaA\n[[YELLOW]](Effetto ad Area). Questo EaA infligger\u00E0 la met\u00E0 del danno\n[[YELLOW]]fatto all'obbiettivo principale, quindi \u00E8 ottimo per sgombrare\n[[YELLOW]]grandi mucchi di mob.
Guides.Axes.Section.2=[[DARK_AQUA]]Come funziona Colpi Critici?\n[[YELLOW]]Colpi Critici \u00E8 una capacit\u00E0 passiva che d\u00E0 ai giocatori\n[[YELLOW]]la possibilit\u00E0 di fare danno aggiuntivo.\n[[YELLOW]]Con le impostazioni predefinite, ogni 2 livelli in Asce aggiudica\n[[YELLOW]]lo 0.1% di possibilit\u00E0 di fare un Colpo Critico, causando 2 volte\n[[YELLOW]]il danno ai mob, o 1.5 volte il danno agli altri giocatori.
Guides.Axes.Section.3=[[DARK_AQUA]]Come funziona Mestria con l'Ascia?\n[[YELLOW]]Maestria con l'Ascia \u00E8 una capacit\u00E0 passiva\n[[YELLOW]]che aggiunge danno ai tuoi colpi quando usi delle Asce.\n[[YELLOW]]Di default il bonus danno aumenta di 1 ogni 50 livelli,\n[[YELLOW]]fino a 4 danni extra al livello 200.
Guides.Axes.Section.4=[[DARK_AQUA]]Come funziona Sfonda Armature?\n[[YELLOW]]Un attacco con abbastanza forza da frantumare un armatura!\n[[YELLOW]]Sfonda Armature ha una possibilit\u00E0 passiva di danneggiare\n[[YELLOW]]l'armatura dell'avversario. Il livello in Asce aumenta il danno.
Guides.Axes.Section.5=[[DARK_AQUA]]Come funziona Impatto Maggiore?\n[[YELLOW]]Hai una possibilit\u00E0 passiva di ottenere un maggiore impatto\n[[YELLOW]]colpendo i mob o i giocatori con un'ascia.\n[[YELLOW]]Di default la possibilit\u00E0 \u00E8 del 25%. Questa capacit\u00E0\n[[YELLOW]]ha un estremo effetto contraccolpo, simile all'incantesimo\n[[YELLOW]]Contraccolpo. Inoltre, infligge danno bonus al bersaglio.
##Excavation
Guides.Excavation.Section.0=[[DARK_AQUA]]Riguardo l'Escavazione:\n[[YELLOW]]L'Escavazione \u00E8 l'atto di scavare per trovare tesori.\n[[YELLOW]]Scavando la terra si trovano tesori.\n[[YELLOW]]Quanto pi\u00F9 si esegue questa operazione\n[[YELLOW]]pi\u00F9 tesori si possono trovare.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP devi scavare con una pala in mano.\n[[YELLOW]]Solo alcuni materiali possono essere scavati per tesori e XP.
Guides.Excavation.Section.1=[[DARK_AQUA]]Materiali Compatibili:\n[[YELLOW]]Erba, Terra, Sabbia, Argilla, Ghiaia, Micelio,\n[[YELLOW]]Sabbia delle Anime, Neve
Guides.Excavation.Section.2=[[DARK_AQUA]]Come usare Giga-Trivella Demolitrice:\n[[YELLOW]]Con una pala in mano tasto destro del mouse per preparare\n[[YELLOW]]lo strumento. Una volta in questo stato si dispone di circa\n[[YELLOW]]4 secondi per fare contatto con i materiali compatibili,\n[[YELLOW]]questo attiver\u00E0 Giga-Trivella Demolitrice.
Guides.Excavation.Section.3=[[DARK_AQUA]]Cos'\u00E8 Giga-Trivella Demolitrice?\n[[YELLOW]]Giga-Trivella Demolitrice \u00E8 una capacit\u00E0 con raffreddamento\n[[YELLOW]]legata all'abilit\u00E0 Escavazione. Triplica la possibilit\u00E0\n[[YELLOW]]di trovare tesori e abilita la rottura istantanea\n[[YELLOW]]sui materiali di Escavazione.
Guides.Excavation.Section.4=[[DARK_AQUA]]Come funziona Cacciatore di Tesori?\n[[YELLOW]]Ogni possibile tesoro per Escavazione ha il suo livello\n[[YELLOW]]di abilit\u00E0 richiesto per essere droppato, di conseguenza \u00E8\n[[YELLOW]]difficile dire quanto ti sta aiutando.\n[[YELLOW]]Basta tenere a mente che pi\u00F9 alta \u00E8 l'abilit\u00E0 di Escavazione,\n[[YELLOW]]pi\u00F9 tesori si possono trovare.\n[[YELLOW]]E anche tenere a mente che ogni tipo di materiale\n[[YELLOW]]di Escavazione compatibile ha la sua lista di tesori unici.\n[[YELLOW]]In altre parole si trovano diversi tesori nella Terra\n[[YELLOW]]da quelli che si troverebbero nella Ghiaia.
Guides.Excavation.Section.5=[[DARK_AQUA]]Note sull'Escavazione:\n[[YELLOW]]I drop dell'Escavazione sono completamente personalizzabili\n[[YELLOW]]Quindi, i risultati variano da server a server.
##Fishing
Guides.Fishing.Section.0=[[DARK_AQUA]]Riguardo la Pesca:\n[[YELLOW]]Con l'abilit\u00E0 Pesca, pescare \u00E8 di nuovo emozionante!\n[[YELLOW]]Trovare tesori nascosti, e scrollare oggetti dai mob.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Catturare pesci.
Guides.Fishing.Section.1=[[DARK_AQUA]]Come funziona Cacciatore di Tesori?\n[[YELLOW]]Questa capacit\u00E0 consente di trovare tesori pescando\n[[YELLOW]]con una piccola possibilit\u00E0 di oggetti incantati.\n[[YELLOW]]Ogni possibile tesoro di pesca ha una possibilit\u00E0\n[[YELLOW]]di uscire a ogni livello. Dipende per\u00F2 dalla\n[[YELLOW]]rarit\u00E0 dell'oggetto ogni quanto esce.\n[[YELLOW]]Pi\u00F9 \u00E8 alta la tua abilit\u00E0 di Pesca, maggiori\n[[YELLOW]]sono le possibilit\u00E0 di trovare tesori migliori.
Guides.Fishing.Section.2=[[DARK_AQUA]]Come funziona Pesca sul Ghiaccio?\n[[YELLOW]]Questa capacit\u00E0 passiva permette di pescare nei laghi\n[[YELLOW]]ghiacciati! Lancia la tua canna da pesca e la capacit\u00E0\n[[YELLOW]]creer\u00E0 un piccolo buco nel ghiaccio dove pescare.
Guides.Fishing.Section.3=[[DARK_AQUA]]Come funziona Pescatore Provetto?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la possibilit\u00E0 di far abboccare\n[[YELLOW]]mentre si pesca. Quando hai sbloccato questa capacit\u00E0,\n[[YELLOW]]pescare in barca o in un bioma oceano raddoppia\n[[YELLOW]]la possibilit\u00E0 di far abboccare.
Guides.Fishing.Section.4=[[DARK_AQUA]]Come funziona Scuotere?\n[[YELLOW]]Questa capacit\u00E0 attiva consente di scrollare oggetti sciolti\n[[YELLOW]]dai mob agganciandoli con una canna da pesca.\n[[YELLOW]]I mob dropperanno gli oggetti che normalmente droppano\n[[YELLOW]]alla morte. \u00C8 anche possibile acquisire le teste dei mob,\n[[YELLOW]]che sono normalmente inottenibili in modalit\u00E0 sopravvivenza.
Guides.Fishing.Section.5=[[DARK_AQUA]]Come funziona Dieta del Pescatore?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la fame ripristinata \n[[YELLOW]]mangiando pesce.
Guides.Fishing.Section.6=[[DARK_AQUA]]Note sulla Pesca:\n[[YELLOW]]I drop di pesca sono completamente personalizzabili,\n[[YELLOW]]quindi variano da server a server.
##Herbalism
Guides.Herbalism.Section.0=[[DARK_AQUA]]Riguardo l'Erboristeria:\n[[YELLOW]]L'Erboristeria riguarda il raccogliere le erbe e le piante.\n\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Raccogliendo piante ed erbe.
Guides.Herbalism.Section.1=[[DARK_AQUA]]Blocchi Compatibili\n[[YELLOW]]Grano, Patate, Carote, Meloni, \n[[YELLOW]]Zucchine, Canne da Zucchero, Fave di Cacao, Fiori, Cactus,\n[[YELLOW]]Funghi, Verruche del Nether, Ninfee, e Rampicanti.
Guides.Herbalism.Section.2=[[DARK_AQUA]]Come funziona Terra Verde?\n[[YELLOW]]Terra Verde \u00E8 una capacit\u00E0 attiva, puoi fare tasto destro\n[[YELLOW]]mentre tieni in mano una zappa per attivare Terra Verde.\n[[YELLOW]]Terra Verde concede una possibilit\u00E0 di ottenere drop 3x\n[[YELLOW]]dalle piante raccolte. D\u00E0 anche ai giocatori la capacit\u00E0\n[[YELLOW]]di diffondere la vita nei blocchi e trasformarli utilizzando\n[[YELLOW]]semi dal tuo inventario.
Guides.Herbalism.Section.3=[[DARK_AQUA]]Come funziona Pollice Verde (Colture)?\n[[YELLOW]]Questa abilit\u00E0 passiva ripianta le colture quando\n[[YELLOW]]vengono raccolte.\n[[YELLOW]]Questa possibilit\u00E0 dipende dal tuo livello in Erboristeria.
Guides.Herbalism.Section.4=[[DARK_AQUA]]Come funziona Pollice Verde (Pietre/Mattoni di Pietra/Terra)?\n[[YELLOW]]Questa capacit\u00E0 attiva consente di trasformare i blocchi nelle\n[[YELLOW]]controparti "piante correlate". Puoi farlo con click destro\n[[YELLOW]]su un blocco, con in mano dei semi. Consumer\u00E0 1 seme.
Guides.Herbalism.Section.5=[[DARK_AQUA]]Come funziona Dieta del Contadino?\n[[YELLOW]]Questa capacit\u00E0 passiva aumenta la fame ripristinata \n[[YELLOW]]mangiando Pane, Biscotti, Meloni, Zuppe di Funghi, Carote,\n[[YELLOW]]e Patate.
Guides.Herbalism.Section.6=[[DARK_AQUA]]Come funziona Fortuna Hylian?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 una possibilit\u00E0 di trovare\n[[YELLOW]]oggetti rari quando certi blocchi sono rotti con una spada.
Guides.Herbalism.Section.7=[[DARK_AQUA]]Come funziona il Doppio Drop?\n[[YELLOW]]Questa abilit\u00E0 passiva d\u00E0 ai giocatori pi\u00F9 resa\n[[YELLOW]]dai loro raccolti.
##Mining
Guides.Mining.Section.0=[[DARK_AQUA]]Riguardo l'Estrazione:\n[[YELLOW]]L'Estrazione consiste nell'estrarre pietra e minerali.\n[[YELLOW]]Fornisce bonus alla quantit\u00E0 di materiali droppati minando.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0, devi minare con un piccone.\n[[YELLOW]]Solo alcuni blocchi assegnano XP.
Guides.Mining.Section.1=[[DARK_AQUA]]Materiali compatibili:\n[[YELLOW]]Pietra, Carbone Grezzo, Ferro Grezzo, Oro Grezzo, Diamante Grezzo, Pietrarossa Grezza,\n[[YELLOW]]Lapislazzuli Grezzo, Ossidiana, Pietra Muschiosa, Pietra dell'End,\n[[YELLOW]]Luminite e Netherrack.
Guides.Mining.Section.2=[[DARK_AQUA]]Come usare il Super Demolitore:\n[[YELLOW]]Con un piccone in mano, tasto destro del mouse\n[[YELLOW]]per preparare lo strumento.\n[[YELLOW]]Una volta in questo stato si dispone di 4 secondi\n[[YELLOW]]per entrare in contatto con i materiali compatibili,\n[[YELLOW]]che attiveranno il Super Demolitore.
Guides.Mining.Section.3=[[DARK_AQUA]]Cos'\u00E8 il Super Demolitore?\n[[YELLOW]]Il Super Demolitore \u00E8 una capacit\u00E0 a tempo legata all'abilit\u00E0\n[[YELLOW]]Estrazione. Triplica la possibilit\u00E0 di drop di oggetti extra e\n[[YELLOW]]abilita la rottura istantanea dei materiali estratti.
Guides.Mining.Section.4=[[DARK_AQUA]]Come usare l'Estrazione Esplosiva:\n[[YELLOW]]Con un detonatore in mano, un acciarino di default,\n[[YELLOW]]accovacciati e fai click destro su TNT a distanza. Questo causer\u00E0\n[[YELLOW]]l'esplosione istantanea della TNT.
Guides.Mining.Section.5=[[DARK_AQUA]]Come funziona Estrazione Esplosiva?\n[[YELLOW]]Estrazione Esplosiva \u00E8 una capacit\u00E0 legata all'abilit\u00E0\n[[YELLOW]]Estrazione. Da bonus minando con la TNT e consente di\n[[YELLOW]]detonare da lontano la TNT. Ci sono tre parti di Estrazione\n[[YELLOW]]Esplosiva. La prima parte \u00E8 Bombe Pi\u00F9 Grandi, che aumenta il\n[[YELLOW]]raggio d'esplosione. La seconda parte \u00E8 Esperto di Demolizioni,\n[[YELLOW]]che riduce il danno dalle esplosioni di TNT. La terza parte\n[[YELLOW]]aumenta semplicemente la quantit\u00E0 di minerali droppati dalla \n[[YELLOW]]TNT e riduce i detriti droppati.
##Repair
Guides.Repair.Section.0=[[DARK_AQUA]]Riguardo la Riparazione:\n[[YELLOW]]La Riparazione consente di utilizzare un blocco di ferro\n[[YELLOW]]per riparare armature e strumenti.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Riparando strumenti e armature con l'incudine mcMMO.\n[[YELLOW]]Questa \u00E8 di default un blocco di ferro e non deve essere\n[[YELLOW]]confusa con l'incudine di Minecraft Vanilla.
Guides.Repair.Section.1=[[DARK_AQUA]]Come posso usare Riparazione?\n[[YELLOW]]Piazza un'incudine mcMMO e fai click destro per riparare \n[[YELLOW]]l'oggetto in mano. Questo consuma 1 oggetto per ogni uso.
Guides.Repair.Section.2=[[DARK_AQUA]]Come funziona Maestria nella Riparazione?\n[[YELLOW]]Maestria nella Riparazione aumenta la quantit\u00E0 di riparazione.\n[[YELLOW]]La riparazione extra dipende dal tuo livello di Riparazione.
Guides.Repair.Section.3=[[DARK_AQUA]]Come funziona Super Riparazione?\n[[YELLOW]]Super Riparazione \u00E8 una capacit\u00E0 passiva. Riparando un oggetto,\n[[YELLOW]]concede ai giocatori una possibilit\u00E0 di riparare un oggetto con\n[[YELLOW]]doppia efficacia.
Guides.Repair.Section.4=[[DARK_AQUA]]Come funziona Forgiatura Arcana?\n[[YELLOW]]Questa capacit\u00E0 passiva consente di riparare oggetti con\n[[YELLOW]]una certa possibilit\u00E0 di mantenere i suoi incantesimi. Gli\n[[YELLOW]]incantesimi possono essere mantenuti ai loro livelli,\n[[YELLOW]]degradati a livelli pi\u00F9 bassi, o persi del tutto.
##Salvage
Guides.Salvage.Section.0=[[DARK_AQUA]]Riguardo la Rottamazione:\n[[YELLOW]]La Rottamazione consente di usare un blocco d'oro\n[[YELLOW]]per rottamare armature e strumenti.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Rottamazione \u00E8 un'abilit\u00E0 figlia di Riparazione\n[[YELLOW]]e Pesca, il livello di abilit\u00E0 \u00E8 basato sui livelli\n[[YELLOW]]di Pesca e Riparazione.
Guides.Salvage.Section.1=[[DARK_AQUA]]Come posso usare la Rottamazione?\n[[YELLOW]]Piazza un'incudine di Rottamazione mcMMO e facci click\n[[YELLOW]]destro per rottamare l'oggetto che hai in mano. Esso si\n[[YELLOW]]romper\u00E0 e restituir\u00E0 i materiali usati per costruirlo.\n\n[[YELLOW]]Per esempio, rottamando un piccone di ferro dar\u00E0 lingotti\n[[YELLOW]]di ferro.
Guides.Salvage.Section.2=[[DARK_AQUA]]Come funziona la Rottamazione Avanzata?\n[[YELLOW]]Quando sbloccata, questa capacit\u00E0 consente di rottamare\n[[YELLOW]]oggetti danneggiati. La percentuale di resa aumenta con\n[[YELLOW]]il salire di livello. Una resa maggiore significa che si possono\n[[YELLOW]]ottenere pi\u00F9 materiali indietro. Con la Rottamazione\n[[YELLOW]]Avanzata si otterr\u00E0 sempre 1 materiale indietro, a meno che\n[[YELLOW]]non sia troppo danneggiato. Quindi non ci si deve preoccupare\n[[YELLOW]]di distruggere oggetti senza ottenere nulla in cambio.
Guides.Salvage.Section.3=[[DARK_AQUA]]Per illustrare come funziona, ecco un esempio:\n[[YELLOW]]Diciamo che rottamiamo un piccone d'oro danneggiato per il 20%,\n[[YELLOW]]ci\u00F2 significa che l'importo massimo che potrebbe ottenere solo 2\n[[YELLOW]](Perch\u00E9 il piccone \u00E8 fatto con 3 lingotti - ciascuno del valore di\n[[YELLOW]]33,33% durabilit\u00E0) che \u00E8 uguale a 66%. Se la percentuale di\n[[YELLOW]]resa \u00E8 sotto il 66% non si \u00E8 in grado di ottenere 2 lingotti.\n[[YELLOW]]Se \u00E8 al di sopra di questo valore si \u00E8 in grado di ottenere lo\n[[YELLOW]]"intero importo", il che significa che si otterranno 2 lingotti.
Guides.Salvage.Section.4=[[DARK_AQUA]]Come funziona la Rottamazione Arcana?\n[[YELLOW]]Questa capacit\u00E0 consente di ottenere libri incantati\n[[YELLOW]]durante la rottamazione di oggetti incantati. A seconda del\n[[YELLOW]]livello la possibilit\u00E0 di estrarre con successo\n[[YELLOW]]un incantesimo totale o parziale varia.\n\n[[YELLOW]]Quando un incantesimo \u00E8 parzialmente estratto, il libro\n[[YELLOW]]incantato avr\u00E0 un livello inferiore.
##Smelting
Guides.Smelting.Section.0=Prossimamente...
##Swords
Guides.Swords.Section.0=[[DARK_AQUA]]Riguardo Spade:\n[[YELLOW]]Questa abilit\u00E0 d\u00E0 bonus di combattimento a chi\n[[YELLOW]]combatte con una spada.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Il guadagno degli XP \u00E8 basato sul danno inflitto\n[[YELLOW]]ai mob o ad altri giocatori con una spada.
Guides.Swords.Section.1=[[DARK_AQUA]]Come funziona Colpi Seghettati?\n[[YELLOW]]Colpi Seghettati \u00E8 una capacit\u00E0 attiva, puoi attivarla facendo\n[[YELLOW]]click destro con una spada. Questa capacit\u00E0 permette di fare\n[[YELLOW]]un colpo EaA (Effetto ad Area). Questo EaA far\u00E0 il 25% in pi\u00F9\n[[YELLOW]]di danni e infligger\u00E0 un effetto di sanguinamento che dura 5 tick.
Guides.Swords.Section.2=[[DARK_AQUA]]Come funziona Contrattacco?\n[[YELLOW]]Contrattacco \u00E8 una capacit\u00E0 attiva. Quando si ricevono\n[[YELLOW]]colpi dai mob, hai una possibilit\u00E0 di riflettere il 50% \n[[YELLOW]]del danno preso.
Guides.Swords.Section.3=[[DARK_AQUA]]Come funziona Emorragia?\n[[YELLOW]]Emorragia causa ai nemici danno ogni due secondi. Il \n[[YELLOW]]bersaglio sanguina fino allo svanire dell'effetto,\n[[YELLOW]]o alla morte, quello che viene prima.\n[[YELLOW]]La durata dell'Emorragia \u00E8 aumentata dall'abilit\u00E0 Spade.
##Taming
Guides.Taming.Section.0=[[DARK_AQUA]]Riguardo l'Addomesticamento:\n[[YELLOW]]L'Addomesticamento dar\u00E0 ai giocatori vari bonus di combattimento\n[[YELLOW]]quando si usano lupi addomesticati.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Per guadagnare XP in questa abilit\u00E0, devi addomesticare\n[[YELLOW]]lupi/ocelot o entrare in combattimento con i tuoi lupi.
Guides.Taming.Section.1=[[DARK_AQUA]]Come funziona Richiamo della Natura?\n[[YELLOW]]Richiamo della Natura \u00E8 una capacit\u00E0 attiva che consente\n[[YELLOW]]di evocare un lupo o un ocelot al proprio fianco. Puoi\n[[YELLOW]]farlo facendo click sinistro con in mano ossa o pesce.
Guides.Taming.Section.2=[[DARK_AQUA]]Come funziona Conoscenza delle Bestie?\n[[YELLOW]]Conoscenza delle Bestie consente ai giocatori di ispezionare\n[[YELLOW]]gli animali da compagnia e controllare lo stato di lupi\n[[YELLOW]]e ocelot. Click-sinistro su un lupo o un ocelot\n[[YELLOW]]per usare Conoscenza delle Bestie.
Guides.Taming.Section.3=[[DARK_AQUA]]Come funziona Sbranare?\n[[YELLOW]]Sbranare \u00E8 una capacit\u00E0 passiva che ha una possibilit\u00E0\n[[YELLOW]]di infliggere un effetto sanguinamento ai bersagli dei lupi.
Guides.Taming.Section.4=[[DARK_AQUA]]Come funziona Artigli Affilati?\n[[YELLOW]]Artigli Affilati offre un bonus di danni al danno inflitto\n[[YELLOW]]dai lupi. Il bonus danni dipende dal livello di Addomesticamento.
Guides.Taming.Section.5=[[DARK_AQUA]]Come funziona Sicurezza Ambientale?\n[[YELLOW]]Questa capacit\u00E0 passiva consente ai lupi di teletrasportarsi\n[[YELLOW]]da te quando si trovano vicino ai pericoli come Cactus/Lava.\n[[YELLOW]]D\u00E0 anche ai lupi l'immunit\u00E0 alle cadute.
Guides.Taming.Section.6=[[DARK_AQUA]]Come funziona Pelliccia Folta?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno\n[[YELLOW]]e rende i lupi resistenti al fuoco.
Guides.Taming.Section.7=[[DARK_AQUA]]Come funziona A Prova d'Urto?\n[[YELLOW]]Questa capacit\u00E0 passiva riduce il danno fatto ai lupi\n[[YELLOW]]dalle esplosioni.
Guides.Taming.Section.8=[[DARK_AQUA]]Come funziona il Servizio Fast Food?\n[[YELLOW]]Questa capacit\u00E0 passiva d\u00E0 ai lupi la possibilit\u00E0 di guarire\n[[YELLOW]]ogni volta che fanno un attacco.
##Unarmed
Guides.Unarmed.Section.0=[[DARK_AQUA]]Riguardo la Lotta:\n[[YELLOW]]La Lotta dar\u00E0 ai giocatori vari bonus di combattimento\n[[YELLOW]]quando si usano i pugni come arma.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si ottengono in base alla quantit\u00E0 di danno\n[[YELLOW]]inflitto ai mob o agli altri giocatori senza armi.
Guides.Unarmed.Section.1=[[DARK_AQUA]]Come funziona Furore?\n[[YELLOW]]Furore \u00E8 una capacit\u00E0 attiva che si attiva con il click\n[[YELLOW]]destro. In modalit\u00E0 Furore, Fai il 50% di danni\n[[YELLOW]]in pi\u00F9 e puoi rompere istantaneamente i materiali\n[[YELLOW]]deboli, come Terra ed Erba.
Guides.Unarmed.Section.2=[[DARK_AQUA]]Come funziona Braccio di Ferro?\n[[YELLOW]]Braccio di Ferro aumenta il danno quando si colpiscono\n[[YELLOW]]mob o giocatori con i pugni.
Guides.Unarmed.Section.3=[[DARK_AQUA]]Come funziona Deviazione Frecce?\n[[YELLOW]]Deviare Frecce \u00E8 una capacit\u00E0 passiva che d\u00E0 la\n[[YELLOW]]possibilit\u00E0 di deviare frecce tirate da Scheletri o altri\n[[YELLOW]]giocatori. La freccia cadr\u00E0 a terra innocuamente.
Guides.Unarmed.Section.4=[[DARK_AQUA]]Come funziona Presa di Ferro?\n[[YELLOW]]Presa di Ferro \u00E8 una capacit\u00E0 passiva che disarma.\n[[YELLOW]]Come sale il livello di lotta, aumenta la possibilit\u00E0\n[[YELLOW]]di prevenire un disarmo.
Guides.Unarmed.Section.5=[[DARK_AQUA]]Come funziona Disarmo?\n[[YELLOW]]Questa capacit\u00E0 passiva permette ai giocatori di\n[[YELLOW]]disarmare gli altri giocatori, facendo cadere\n[[YELLOW]]a terra l'oggetto in mano del bersaglio.
##Woodcutting
Guides.Woodcutting.Section.0=[[DARK_AQUA]]Riguardo Taglialegna:\n[[YELLOW]]Taglialegna sta tutto nell'abbattere alberi.\n\n[[DARK_AQUA]]GUADAGNO XP:\n[[YELLOW]]Gli XP si guadagnano ogni volta che si rompono ceppi di legno.
Guides.Woodcutting.Section.1=[[DARK_AQUA]]Come funziona Abbattitore d'Alberi?\n[[YELLOW]]Abbattitore d'Alberi \u00E8 una capacit\u00E0 attiva, puoi fare\n[[YELLOW]]click destro con in mano un'Ascia. Questo causer\u00E0\n[[YELLOW]]la rottura istantanea dell'albero, droppando tutto\n[[YELLOW]]il suo legno contemporaneamente.
Guides.Woodcutting.Section.2=[[DARK_AQUA]]Come funziona Soffia Foglie?\n[[YELLOW]]Soffia Foglie \u00E8 una capacit\u00E0 passiva che causer\u00E0 la\n[[YELLOW]]rottura istantanea dei blocchi di foglie colpiti con un ascia.\n[[YELLOW]]Di default, questa capacit\u00E0 si sblocca al livello 100.
Guides.Woodcutting.Section.3=[[DARK_AQUA]]Come funziona Doppi Drop?\n[[YELLOW]]Questa \u00E8 una capacit\u00E0 passiva che permette di ottenere\n[[YELLOW]]un blocco extra per ogni ceppo di legno che si taglia.
#INSPECT
Inspect.Offline=Non hai il permesso di esaminare giocatori disconnessi!
Inspect.OfflineStats=Statistiche mcMMO del Giocatore Disconnesso [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]Statistiche mcMMO di [[YELLOW]]{0}
Inspect.TooFar=Sei troppo lontano da quel giocatore per esaminarlo!
#ITEMS
Item.ChimaeraWing.Fail=**ALA CHIMERICA FALLITA!**
Item.ChimaeraWing.Pass=**ALA CHIMERICA**
Item.ChimaeraWing.Name=Ala Chimerica
Item.ChimaeraWing.Lore=[[GRAY]]Ti teletrasporta al tuo letto.
Item.Generic.Wait=Devi aspettare prima di poterlo usare di nuovo! [[YELLOW]]({0}s)
Item.Injured.Wait=Sei stato ferito di recente e devi aspettare per usarlo. [[YELLOW]]({0}s)
Item.FluxPickaxe.Name=Piccone Cuocente
Item.FluxPickaxe.Lore.1=[[GRAY]]Ha la possibilit\u00E0 di fusione immediata dei minerali.
Item.FluxPickaxe.Lore.2=[[GRAY]]Richiede livello di Fusione {0}+
#TELEPORTATION
Teleport.Commencing=[[GRAY]]Il teletrasporto avr\u00E0 inizio fra [[GOLD]]({0}) [[GRAY]]secondi, resta fermo per favore...
Teleport.Cancelled=[[DARK_RED]]Teletrasporto annullato!
#SKILLS
Skills.Child=[[GOLD]](ABILIT\u00C0 FIGLIA)
Skills.Disarmed=[[DARK_RED]]Sei stato disarmato!
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]Hai bisogno di pi\u00F9 [[GRAY]]{0}
Skills.Parents=ABILIT\u00C0 MADRI
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.ChildStats={0}[[GREEN]]{1}
Skills.TooTired=Sei troppo stanco per usare ancora questa capacit\u00E0. [[YELLOW]]({0}s)
Skills.Cancelled={0} annullata!
Skills.ConfirmOrCancel=[[GREEN]]Clicca ancora col destro per confermare [[GOLD]]{0}[[GREEN]]. Clicca col sinistro per annullare.
#STATISTICS
Stats.Header.Combat=[[GOLD]]-=ABILIT\u00C0 DI COMBATTIMENTO=-
Stats.Header.Gathering=[[GOLD]]-=ABILIT\u00C0 DI RACCOLTA=-
Stats.Header.Misc=[[GOLD]]-=ABILIT\u00C0 VARIE=-
Stats.Own.Stats=[[GREEN]][mcMMO] Statistiche
#PERKS
Perks.XP.Name=Esperienza
Perks.XP.Desc=Ricevi XP incrementati in determinate abilit\u00E0.
Perks.Lucky.Name=Fortuna
Perks.Lucky.Desc=Aumenta del 33.3% le probabilit\u00E0 di attivarsi delle abilit\u00E0 e capacit\u00E0 di {0}.
Perks.Lucky.Desc.Login=Aumenta del 33.3% le probabilit\u00E0 di attivarsi di certe abilit\u00E0 e capacit\u00E0.
Perks.Lucky.Bonus=[[GOLD]] ({0} con il Vantaggio Fortuna)
Perks.Cooldowns.Name=Recupero Rapido
Perks.Cooldowns.Desc=Riduce la durata della ricarica di {0}.
Perks.ActivationTime.Name=Resistenza
Perks.ActivationTime.Desc=Incrementa il tempo di attivazione della capacit\u00E0 di {0} secondi.
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s con il Vantaggio Resistenza)
#HARDCORE
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] Modalit\u00E0 Hardcore {0} disattivata per {1}.
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] Modalit\u00E0 Hardcore {0} attivata per {1}.
Hardcore.DeathStatLoss.Name=Penalit\u00E0 alle Abilit\u00E0 per Morte
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]Hai perso [[BLUE]]{0}[[DARK_RED]] livelli dalla morte.
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] La percentuale di perdita delle statistiche \u00E8 stata portata a {0}.
Hardcore.Vampirism.Name=Vampirismo
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] era troppo inesperto per concedere alcuna conoscenza.
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]Hai rubato [[BLUE]]{0}[[DARK_AQUA]] livelli da [[YELLOW]]{1}.
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]] non \u00E8 riuscito a rubarti ci\u00F2 che conosci!
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]] ti ha rubato [[BLUE]]{1}[[DARK_RED]] livelli!
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] La percentuale di perdita \u00E8 cambiata a {0}.
#MOTD
MOTD.Donate=[[DARK_AQUA]]Info Donazioni:
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]Modalit\u00E0 hardcore abilitata: [[DARK_RED]]{0}
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Penalit\u00E0 alle Abilit\u00E0 causa Morte: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Salasso di Statistiche da Vampirismo: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[Vantaggi mcMMO]
MOTD.Version=[[GOLD]][mcMMO] versione [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Sito di mcMMO
#SMELTING
Smelting.Ability.FluxMining=Possibilit\u00E0 di Estrazione Cuocente: [[YELLOW]]{0}
Smelting.Ability.FuelEfficiency=Moltiplicatore di Efficienza Combustibile: [[YELLOW]]{0}x
Smelting.Ability.Locked.0=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (INCREMENTO XP VANILLA)
Smelting.Ability.Locked.1=BLOCCATO FINO AD ABILIT\u00C0 {0}+ (ESTRAZIONE CUOCENTE)
Smelting.Ability.SecondSmelt=Possibilit\u00E0 di Seconda Fusione: [[YELLOW]]{0}
Smelting.Ability.VanillaXPBoost=Moltiplicatore XP Vanilla: [[YELLOW]]{0}x
Smelting.SubSkill.FuelEfficiency.Name=Efficienza Combustibile
Smelting.SubSkill.FuelEfficiency.Description=Aumenta il tempo di combustione del carburante usato nelle fornaci
Smelting.SubSkill.SecondSmelt.Name=Seconda Fusione
Smelting.SubSkill.SecondSmelt.Description=Raddoppia le risorse guadagnate con la fusione
Smelting.Effect.4=Incremento XP Vanilla
Smelting.Effect.5=Aumenta i normali XP ottenuti fondendo
Smelting.SubSkill.FluxMining.Name=Estrazione Cuocente
Smelting.SubSkill.FluxMining.Description=Probabilit\u00E0 che i minerali siano fusi istantaneamente mentre li si estrae
Smelting.Listener=Fusione:
Smelting.SkillName=FUSIONE
#COMMAND DESCRIPTIONS
Commands.Description.addlevels=Aggiungi XP di mcMMO a un utente
Commands.Description.adminchat=Attiva o disattiva la chat amministratori di mcMMO o invia messaggi in chat amministratori
Commands.Description.addxp=Aggiunge XP mcMMO a un utente
Commands.Description.hardcore=Modifica la percentuale hardcore di mcMMO o attiva/disattiva la modalit\u00E0 hardcore
Commands.Description.inspect=Visualizza dettagliate informazioni mcMMO su un altro giocatore
Commands.Description.mcability=Attiva o disattiva il fatto che le capacit\u00E0 mcMMO vengano preparate con un clic destro.
Commands.Description.mccooldown=Vedi tutto sulle ricariche delle abilit\u00E0 mcMMO
Commands.Description.mcgod=Attiva o Disattiva la modalit\u00E0 dio mcMMO
Commands.Description.mchud=Cambia il tuo stile di HUD di mcMMO
Commands.Description.mcmmo=Mostra una breve descrizione di mcMMO
Commands.Description.mcnotify=Attiva o disattiva la visualizzazione delle notifiche delle capacit\u00E0 di mcMMO in chat
Commands.Description.mcpurge=Elimina dal database mcMMO gli utenti senza livelli mcMMO e quelli che non si sono connessi negli ultimi {0} mesi.
Commands.Description.mcrank=Mostra la graduatoria mcMMO di un giocatore
Commands.Description.mcrefresh=Rigenera tutte le ricariche di mcMMO
Commands.Description.mcremove=Rimuovi un utente dal database mcMMO
Commands.Description.mcscoreboard=Gestisci la tua Scoreboard mcMMO
Commands.Description.mcstats=Mostra i tuoi livelli e XP mcMMO
Commands.Description.mctop=Mostra le classifiche mcMMO
Commands.Description.mmoedit=Modifica i livelli mcMMO di un utente
Commands.Description.mmoupdate=Migra un database mcMMO da un database vecchio a quello attuale
Commands.Description.mcconvert=Converte tipi di database oppure tipi di formule esperienza
Commands.Description.mmoshowdb=Mostra il nome dell'attuale tipo di database (per uso successivo con /mmoupdate)
Commands.Description.party=Controlla varie impostazioni del gruppo mcMMO
Commands.Description.partychat=Attiva o disattiva la chat del gruppo mcMMO o invia un messaggio in chat gruppo
Commands.Description.ptp=Teletrasportati da un membro del gruppo mcMMO
Commands.Description.Skill=Visualizza informazioni dettagliate sull'abilit\u00E0 mcMMO {0}
Commands.Description.skillreset=Azzera i livelli mcMMO di un utente
Commands.Description.vampirism=Modify the mcMMO vampirism percentage or toggle vampirism mode on/off
Commands.Description.xplock=Blocca la tua barra XP di mcMMO su una specifica abilit\u00E0 di mcMMO
Commands.Description.xprate=Modifica il tasso XP di mcMMO o d\u00E0 inizio a un evento XP mcMMO.
#UPDATE CHECKER
UpdateChecker.Outdated=Stai usando una versione non aggiornata di mcMMO!
UpdateChecker.NewAvailable=\u00C8 disponibile una nuova versione su BukkitDev.
#SCOREBOARD HEADERS
Scoreboard.Header.PlayerStats=Statistiche mcMMO
Scoreboard.Header.PlayerCooldowns=Ricariche mcMMO
Scoreboard.Header.PlayerRank=Graduatorie McMMO
Scoreboard.Header.PlayerInspect=Statistiche mcMMO: {0}
Scoreboard.Header.PowerLevel=Livello di Potere
Scoreboard.Misc.PowerLevel=[[GOLD]]Livello di Potere
Scoreboard.Misc.Level=[[DARK_AQUA]]Livello
Scoreboard.Misc.CurrentXP=[[GREEN]]XP attuali
Scoreboard.Misc.RemainingXP=XP restanti
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]Ricarica
Scoreboard.Misc.Overall=[[GOLD]]Complessivo
Scoreboard.Misc.Ability=Capacit\u00E0
#DATABASE RECOVERY
Profile.Loading.Success=[[GREEN]]Il tuo profilo mcMMO \u00E8 stato caricato.
Profile.Loading.Failure=mcMMO non pu\u00F2 ancora caricare i tuoi dati. Si consiglia di [[AQUA]]contattare il proprietario del server.\n[[YELLOW]]Puoi ancora giocare sul server, ma non avrai [[BOLD]]livelli mcMMO[[YELLOW]] e gli XP che otterrai [[BOLD]]non verranno salvati[[YELLOW]].
Profile.Loading.AdminFailureNotice=[[DARK_RED]][A][[RED]] mcMMO non \u00E8 stato in grado di caricare i dati del giocatore [[YELLOW]]{0}[[RED]]. [[LIGHT_PURPLE]]Si prega di controllare la configurazione del database.

View File

@@ -1,575 +0,0 @@
Acrobatics.Ability.Proc=[[GREEN]]**Mi\u0119kkie L\u0105dowanie**
Acrobatics.Combat.Proc=[[GREEN]]**Unikni\u0119to**
Acrobatics.DodgeChance=Szansa na Unik: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=Przewr\u00f3t
Acrobatics.SubSkill.Roll.Description=Redukuje lub te\u017c ca\u0142kowicie usuwa obra\u017cenia od upadku
Acrobatics.SubSkill.GracefulRoll.Name=\u0141agodny Przewr\u00f3t
Acrobatics.SubSkill.GracefulRoll.Description=Dwukrotnie bardziej efektywne niz zwykly Przewrot
Acrobatics.SubSkill.Dodge.Name=Unik
Acrobatics.SubSkill.Dodge.Description=Redukuje obra\u017cenia o po\u0142owe
Acrobatics.Listener=Akrobatyka:
Acrobatics.SubSkill.Roll.Chance=Szansa na Przewr\u00f3t: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=Szansa na \u0141agodny Przewr\u00f3t: [[YELLOW]]{0}
Acrobatics.Roll.Text=**Przewr\u00f3t**
Acrobatics.SkillName=AKROBATYKA
Acrobatics.Skillup=Umiejetnosc akrobatyka wzrosla o {0}. Razem ({1})
Archery.Combat.DazeChance=Szansa na Oszolomienie: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=Szansa na Odzyskanie Strza\u0142: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=Dodatkowe Obra\u017cenia dla Umiej\u0119tno\u015bci: [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=Umiej\u0119tno\u015b\u0107 Aktywna
Archery.SubSkill.SkillShot.Description=Zwi\u0119ksza obra\u017cenia zadane z \u0142uku
Archery.SubSkill.Daze.Name=Oszo\u0142omienie
Archery.SubSkill.Daze.Description=Oszalamia, straszy i zadaje {0} obrazen.
Archery.SubSkill.ArrowRetrieval.Name=Odzyskiwanie Strza\u0142
Archery.SubSkill.ArrowRetrieval.Description=Szansa na wyci\u0105gni\u0119cie strza\u0142 z martwego cia\u0142a
Archery.Listener=Lucznictwo
Archery.SkillName=LUCZNICTWO
Archery.Skillup=Umiejetnosc lucznictwo wzrosla o {0}. Razem ({1})
Axes.Ability.Bonus.0=Mistrzostwo pos\u0142ugiwania si\u0119 siekier\u0105
Axes.Ability.Bonus.1={0} Bonusowych obra\u017ce\u0144
Axes.Ability.Bonus.2=Wstrz\u0105s od Zbroi
Axes.Ability.Bonus.3=Zadaje {0} dodatkowych obra\u017ce\u0144 dla opancerzonych cel\u00f3w
Axes.Ability.Bonus.4=Trafienie Krytyczne
Axes.Ability.Bonus.5=Zadaje {0} dodatkowych obra\u017ce\u0144 dla nieopancerzonych cel\u00f3w
Axes.Ability.Lower=[[GRAY]]**CHOWASZ SIEKIERE**
Axes.Ability.Ready=[[GREEN]]**PRZYGOTOWUJESZ SWOJ\u0104 SIEKIERE**
Axes.Combat.CritStruck=[[DARK_RED]]Trafiono cie krytycznie!
Axes.Combat.CritChance=Szansa na Trafienie Krytyczne: [[YELLOW]]{0}
Axes.Combat.CriticalHit=TRAFIENIE KRYTYCZNE!
Axes.Combat.GI.Proc=[[GREEN]]**UDERZONO Z WIELK\u0104 MOC\u0104**
Axes.Combat.GI.Struck=TRAFIENIE KRYTYCZNE!
Axes.Combat.SS.Length=D\u0142ugo\u015bc \u0141amacza Czaszki: [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=\u0141amacz Czaszek
Axes.SubSkill.SkullSplitter.Description=Zadaje obra\u017cenia obszarowe
Axes.SubSkill.CriticalStrikes.Name=Krytyczne Uderzenia
Axes.SubSkill.CriticalStrikes.Description=Podwojne obrazania
Axes.SubSkill.AxeMastery.Name=Mistrzostwo pos\u0142ugiwania si\u0119 siekier\u0105
Axes.SubSkill.AxeMastery.Description=Dodaje bonus do obrazen
Axes.SubSkill.ArmorImpact.Name=Wstrz\u0105s od Zbroi
Axes.SubSkill.ArmorImpact.Description=Uderz z odpowiedni\u0105 si\u0142a aby przebi\u0107 zbroj\u0119
Axes.SubSkill.GreaterImpact.Name=Trafienie Krytyczne
Axes.SubSkill.GreaterImpact.Description=Zadaje dodatkowe obra\u017cenia nieopancerzonym celom
Axes.Listener=Siekiery:
Axes.SkillName=TOPORY
Axes.Skills.SS.Off=**\u0141amacz Czaszek si\u0119 sko\u0144czy\u0142**
Axes.Skills.SS.On=[[GREEN]]**\u0141amacz Czaszek AKTYWOWANY**
Axes.Skills.SS.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]\u0141amacz Czaszek [[GREEN]]jest ju\u017c dost\u0119pna!
Axes.Skills.SS.Other.Off=\u0141amacz Czaszek[[GREEN]] si\u0119 sko\u0144czy\u0142 [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]\u0141amacza Czaszki!
Axes.Skillup=Umiej\u0119tno\u015b\u0107 \u015bcinania wzros\u0142a o {0}. Razem ({1})
Excavation.Ability.Lower=[[GRAY]]**CHOWASZ \u0141OPAT\u0118**
Excavation.Ability.Ready=[[GREEN]]**PRZYGOTOWUJESZ SWOJ\u0104 \u0141OPAT\u0118**
Excavation.SubSkill.GigaDrillBreaker.Name=Mia\u017cdz\u0105ce Wiert\u0142o
Excavation.SubSkill.GigaDrillBreaker.Description=3x Szansa na znalezienie przedmiotu, 3x mno\u017cnik zdobywania do\u015bwiadczenia, +pr\u0119dko\u015b\u0107
Excavation.SubSkill.TreasureHunter.Name=Lowca Skarbow
Excavation.SubSkill.TreasureHunter.Description=Umiej\u0119tno\u015b\u0107 wykopywania skarb\u00f3w.
Excavation.Effect.Length=D\u0142ugo\u015bc Mia\u017cdz\u0105cego Wiert\u0142a: [[YELLOW]]{0}s
Excavation.Listener=Wykopaliska:
Excavation.SkillName=KOPANIE
Excavation.Skills.GigaDrillBreaker.Off=**Mia\u017cdz\u0105ce Wiert\u0142o si\u0119 sko\u0144czy\u0142o**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**MIA\u017bDZ\u0104CE WIERT\u0141O AKTYWOWANE**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]Mia\u017cdz\u0105ce Wiert\u0142o [[GREEN]]jest ju\u017c dost\u0119pna!
Excavation.Skills.GigaDrillBreaker.Other.Off=Mia\u017cdz\u0105ce Wiert\u0142o[[GREEN]] si\u0119 sko\u0144czy\u0142o [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Mia\u017cdz\u0105ce Wiert\u0142o!
Excavation.Skillup=Umiej\u0119tno\u015b\u0107 wykopalisk wzros\u0142a o {0}. Razem({1})
Fishing.Ability.Chance=Szansa na zlapanie ryby: [[YELLOW]]{0}
Fishing.Ability.Info=Magiczny \u0141owca: [[GRAY]] **Ulepsza si\u0119 wraz z rang\u0105 Poszukiwacza Skarb\u00f3w**
Fishing.Ability.Locked.0=ZABLOKOWANY DO POZIOMU {0}+ SKILL
Fishing.Ability.Locked.1=DOSTEPNE OD POZIOMU {0}+ (LODOWE LOWIENIE RYB)
Fishing.Ability.Rank=Ranga lowienia skarbow: [[YELLOW]]{0}/5
Fishing.Ability.TH.MagicRate=Szanse na Magicznego \u0141owc\u0119: [[YELLOW]]{0}
Fishing.Ability.Shake=Szansa na Wstrz\u0105s: [[YELLOW]]{0}
Fishing.Ability.IceFishing=Lodowe lowienie ryb: Idz lowic ryby w lodzie
Fishing.Ability.FD=Dieta Rybaka: [[YELLOW]]Ranga {0}
Fishing.SubSkill.TreasureHunter.Name=Lowca Skarbow (Pasywna)
Fishing.SubSkill.TreasureHunter.Description=\u0141owi\u0107 r\u00f3\u017cne obiekty
Fishing.SubSkill.MagicHunter.Name=Magiczny Lowca
Fishing.SubSkill.MagicHunter.Description=Znajdowanie Zakletych Przedmiotow
Fishing.SubSkill.Shake.Name=Potrz\u0105\u015bni\u0119cie (przeciwko jednostkom)
Fishing.SubSkill.Shake.Description=Okradaj potwory z przedmiot\u00f3w u\u017cywaj\u0105c w\u0119dki.
Fishing.SubSkill.FishermansDiet.Name=Dieta Rybaka
Fishing.SubSkill.FishermansDiet.Description=Zwi\u0119ksza nasycenie posi\u0142k\u00f3w (ryby)
Fishing.SubSkill.MasterAngler.Description=Zwieksza szanse na zlapanie ryby na haczyk
Fishing.SubSkill.IceFishing.Name=Lodowe lowienie ryb
Fishing.SubSkill.IceFishing.Description=Pozwala na lowienie ryb w zimowych biomach
Fishing.Chance.Raining=[[BLUE]] Bonus od Deszczu
Fishing.Listener=Rybactwo
Fishing.Ability.TH.MagicFound=[[GRAY]]Wyczuwasz w pobli\u017cu \u017ar\u00f3d\u0142o magii...
Fishing.SkillName=RYBACTWO
Fishing.Skillup=Umiej\u0119tno\u015b\u0107 \u0142owienia wzros\u0142a o {0}. Razem ({1})
Herbalism.Ability.DoubleDropChance=Szansa na Podw\u00f3jny Drop: [[YELLOW]]{0}
Herbalism.Ability.FD=Dieta Farmera: [[YELLOW]]Poziom {0}
Herbalism.Ability.GTe.Length=D\u0142ugo\u015b\u0107 ?Green Terra?: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=Potrzebujesz wi\u0119cej nasion aby u\u017cy\u0107 Zielonego \u017bycia.
Herbalism.Ability.GTh.Chance=Szansa na Zielony Palec: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=[[GREEN]]**ZIELONY PALEC SI\u0118 NIE UDA\u0141**
Herbalism.Ability.GTh.Stage=Etap Zielonego Dotyku: [[YELLOW]] Ro\u015bliny rosn\u0105 w etapie {0}
Herbalism.Ability.GTh=[[GREEN]]**ZIELONY PALEC**
Herbalism.Ability.HylianLuck=Szansa na Szczescie Hylian: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**CHOWASZ SWOJ\u0104 MOTYKE**
Herbalism.Ability.Ready=[[GREEN]]**PRZYGOTOWUJESZ MOTYKE**
Herbalism.SubSkill.GreenTerra.Name=Zielone \u017bycie (ZDOLNO\u015a\u0106)
Herbalism.SubSkill.GreenTerra.Description=Rozprzestrzenia \u017cycie na powierzchni, 3x wi\u0119ksza szansa na zdobycie przedmiot\u00f3w
Herbalism.SubSkill.GreenThumb.Name=Zielony palec (Pszenica)
Herbalism.SubSkill.GreenThumb.Description=Automatycznie zasadza ro\u015bliny podczas ich zbierania
Herbalism.SubSkill.GreenThumb.Description.2=Oplata ceg\u0142y zieleni\u0105, lub te\u017c wspomaga rozw\u00f3j trawy.
Herbalism.SubSkill.FarmersDiet.Name=Dieta Farmerska
Herbalism.SubSkill.FarmersDiet.Description=Zwi\u0119ksza nasycenie posi\u0142k\u00f3w
Herbalism.SubSkill.DoubleDrops.Name=Podw\u00f3jny Drop (Wszystkie Zielska)
Herbalism.SubSkill.DoubleDrops.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w
Herbalism.SubSkill.HylianLuck.Name=Szczescie Hylian
Herbalism.SubSkill.HylianLuck.Description=Daje niewielka szanse na znalezienie rzadkich przedmiot\u00f3w
Herbalism.HylianLuck=[[GREEN]]Szczescie Hyrule jest dzisiaj z Toba!
Herbalism.Listener=Zielarstwo
Herbalism.SkillName=ZIELARSTWO
Herbalism.Skills.GTe.On=[[GREEN]]**?GREEN TERRA? AKTYWOWANA**
Herbalism.Skills.GTe.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]?Green Terra?[[GREEN]]jest ju\u017c gotowa!
Herbalism.Skills.GTe.Other.Off=?Green Terra?[[GREEN]] si\u0119 sko\u0144czy\u0142o [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]?Green Terra?!
Herbalism.Skillup=Umiej\u0119tno\u015b\u0107 zielarstwa wzros\u0142a o {0}. Ca\u0142kowicie ({1})
Mining.Ability.Length=D\u0142ugo\u015bc Super Kopacza: [[YELLOW]]{0}s
Mining.Ability.Locked.0=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Mining.Ability.Locked.1=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Mining.Ability.Locked.2=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Mining.Ability.Lower=[[GRAY]]**CHOWASZ SW\u00d3J KILOF**
Mining.Ability.Ready=[[GREEN]]**PRZYGOTOWUJESZ SWOJA SIEKIERE**
Mining.SubSkill.SuperBreaker.Name=Super \u0141amacz (ZDOLNO\u015a\u0106)
Mining.SubSkill.SuperBreaker.Description=Szybko\u015b\u0107+, Szansa potr\u00f3jnego dropa
Mining.SubSkill.DoubleDrops.Name=Podwojny Drop
Mining.SubSkill.DoubleDrops.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w
Mining.SubSkill.BlastMining.Name=Szybki Kopacz
Mining.SubSkill.BlastMining.Description=Bonus do wydobycia z TNT
Mining.SubSkill.BiggerBombs.Name=Wieksze bomby
Mining.SubSkill.BiggerBombs.Description=Zwieksza zasieg wybuchu TNT
Mining.SubSkill.DemolitionsExpertise.Name=Mistrzostwo w pos\u0142ugiwaniu si\u0119 materia\u0142ami wybuchowymi
Mining.SubSkill.DemolitionsExpertise.Description=Zmniejsza obrazenia od explozji TNT
Mining.Effect.Decrease=Redukcja Obra\u017ce\u0144 od Materia\u0142\u00f3w Wybuchowych: [[YELLOW]]{0}
Mining.Effect.DropChance=Szansa na Podw\u00f3jny Drop: [[YELLOW]]{0}
Mining.Listener=G\u00f3rnictwo
Mining.SkillName=GORNICTWO
Mining.Skills.SuperBreaker.Off=**Super \u0141amacz si\u0119 sko\u0144czy\u0142**
Mining.Skills.SuperBreaker.On=[[GREEN]]**SUPER \u0141AMACZ AKTYWOWANY**
Mining.Skills.SuperBreaker.Other.Off=Super Kopacz[[GREEN]] si\u0119 sko\u0144czy\u0142 [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Super Kopacza!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]Super \u0141amacz [[GREEN]]jest ju\u017c dost\u0119pna!
Mining.Skillup=Umiejetnosc Gornictwa wzrosla o {0}. Calkowicie ({1})
Mining.Blast.Boom=[[GRAY]]**BOOM**
Mining.Blast.Radius.Increase=Zasi\u0119g zwi\u0119kszony o: [[YELLOW]]+{0}
Mining.Blast.Rank=Szybki Kopacz: [[YELLOW]] Ranga {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Szybkiego Kopacza!
Mining.Blast.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]B\u0142yskawiczny Kopacz [[GREEN]]jest ju\u017c dost\u0119pna!
Repair.SubSkill.Repair.Name=Naprawa
Repair.SubSkill.Repair.Description=Naprawa Narz\u0119dzi i Pancerza
Repair.SubSkill.GoldRepair.Name=Naprawa Z\u0142ota ({0}+ SKILL)
Repair.SubSkill.GoldRepair.Description=Naprawa Z\u0142otych Narz\u0119dzi i Pancerza
Repair.SubSkill.IronRepair.Name=Naprawa \u017belaza ({0}+ SKILL)
Repair.SubSkill.IronRepair.Description=Naprawa \u017belaznych Narz\u0119dzi i Pancerza
Repair.SubSkill.StoneRepair.Name=Naprawa Kamienia ({0}+ SKILL)
Repair.SubSkill.StoneRepair.Description=Naprawa Kamiennych Narz\u0119dzi
Repair.SubSkill.RepairMastery.Name=Mistrzostwo napraw
Repair.SubSkill.RepairMastery.Description=Zwi\u0119kszono ilo\u015b\u0107 napraw
Repair.SubSkill.SuperRepair.Name=Super Naprawa
Repair.SubSkill.SuperRepair.Description=Podw\u00f3jnia efektywno\u015b\u0107
Repair.SubSkill.DiamondRepair.Name=Naprawa Diamentu ({0}+ SKILL)
Repair.SubSkill.DiamondRepair.Description=Naprawa diamentowych narzedzi i pancerza
Repair.SubSkill.ArcaneForging.Name=Kowalstwo Ezoteryczne
Repair.SubSkill.ArcaneForging.Description=Naprawa rzeczy magicznych
Repair.SubSkill.Salvage.Name=Odzyskiwanie ({0}+ SKILL)
Repair.SubSkill.Salvage.Description=Odzyskiwanie Narz\u0119dzi i Pancerza
Repair.Error=[[DARK_RED]]mcMMO napotka\u0142 problem pr\u00f3buj\u0105c naprawi\u0107 ten przedmiot!
Repair.Listener.Anvil=[[DARK_RED]]Postawi\u0142e\u015b kowad\u0142o - kowad\u0142a s\u0142u\u017c\u0105 do naprawiania narz\u0119dzi i zbroi.
Repair.Listener.Anvil2=[[DARK_RED]]Postawi\u0142e\u015b kowad\u0142o Odzysku, u\u017cyj go aby Odzyska\u0107 narz\u0119dzia oraz zbroj\u0119.
Repair.Listener=Naprawa:
Repair.SkillName=Naprawa
Repair.Skills.AdeptSalvage=[[DARK_RED]]Nie masz odpowiedniego poziomu aby Odzyskiwa\u0107 przedmioty.
Repair.Skills.AdeptDiamond=[[DARK_RED]]Masz za niski poziom aby naprawia\u0107 diament.
Repair.Skills.AdeptGold=[[DARK_RED]]Masz za niski poziom aby naprawia\u0107 z\u0142oto.
Repair.Skills.AdeptIron=[[DARK_RED]]Masz za niski poziom aby naprawia\u0107 \u017celazo.
Repair.Skills.AdeptStone=[[DARK_RED]]Masz za niski poziom aby naprawi\u0107 kamie\u0144.
Repair.Skills.Adept=Musisz mie\u0107 [[YELLOW]]{0}[[RED]] poziom \u017ceby naprawi\u0107 [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]Bu\u0142ka z mas\u0142em.
Repair.Skills.FullDurability=[[GRAY]]Ten przedmiot jest ju\u017c w pe\u0142ni sprawny.
Repair.Skills.SalvageSuccess=[[GRAY]]Przedmiot Odzyskany!
Repair.Skills.NotFullDurability=[[DARK_RED]]Nie mo\u017cesz odzyska\u0107 uszkodzonych przedmiot\u00f3w.
Repair.Skills.Mastery=Mistrzostwo Napraw: [[YELLOW]] {0} dodatkowej wytrzyma\u0142o\u015bci dla przedmiot\u00f3w
Repair.Skills.StackedItems=[[DARK_RED]]Nie mo\u017cesz naprawia\u0107 zestackowanych przedmiot\u00f3w.
Repair.Skills.Super.Chance=Szansa Super Naprawy: [[YELLOW]]{0}
Repair.Skillup=Umiejetnosc naprawiania wzrosla o {0}. Razem ({1})
Repair.Pretty.Name=Naprawa
Salvage.Pretty.Name=Przetapianie
Repair.Arcane.Chance.Downgrade=[[GRAY]]AF Szansa na zdegradowanie: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]AF Szanse na sukces: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=Energia magiczna tego przedmiotu spad\u0142a.
Repair.Arcane.Fail=Moc Arcane na zawsze opuscila przedmiot !
Repair.Arcane.Lost=Nie posiada\u0142e\u015b wystarczaj\u0105co du\u017co do\u015bwiadczenia aby zatrzyma\u0107 ulepszenia.
Repair.Arcane.Perfect=[[GREEN]]Nasyci\u0142e\u015b ten przedmiot magiczn\u0105 moc\u0105.
Repair.Arcane.Rank=Kowalstwo Ezoteryczne: [[YELLOW]]Ranga {0}/4
Swords.Ability.Lower=[[GRAY]]**CHOWASZ SW\u00d3J MIECZ**
Swords.Ability.Ready=[[GREEN]] **PODNIOSLES SWOJ MIECZ**
Swords.Combat.Bleed.Chance=Szansa na Krwawienie: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=D\u0142ugo\u015bc Krwotoku: [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]NOTE: [[YELLOW]]1 tykni\u0119cie zdarza si\u0119 co 2 sekundy
Swords.Combat.Bleeding.Started=[[DARK_RED]] Krwawisz!
Swords.Combat.Bleeding.Stopped=[[GRAY]]Krwawienie [[GREEN]]usta\u0142o[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**PRZECIWNIK KRAWI**
Swords.Combat.Counter.Chance=Szansa na Kontratak: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]Kontratak!
Swords.Combat.Countered=[[GREEN]]**KONTR-ATAK**
Swords.Combat.SS.Struck=[[DARK_RED]]Zosta\u0142e\u015b powalony przez Z\u0104BKOWANY ATAK!
Swords.SubSkill.CounterAttack.Name=Kontratak
Swords.SubSkill.SerratedStrikes.Name=Z\u0105bkowany Atak (ZDOLNO\u015a\u0106)
Swords.SubSkill.SerratedStrikes.Description={0} obrazen obszarowych, Krawienie+ obszarowo
Swords.Effect.4=Z\u0105bkowany Atak spowodowa\u0142 krwawienie
Swords.Effect.5={0} Czas miedzy krawieniem
Swords.SubSkill.Bleed.Name=Krwawienie
Swords.SubSkill.Bleed.Description=Spowodowano krwawienie
Swords.Listener=Miecze
Swords.SkillName=MIECZE
Swords.Skills.SS.Off=**Z\u0105bkowany Atak si\u0119 sko\u0144czy\u0142**
Swords.Skills.SS.On=[[GREEN]]**?Z\u0104BKOWANY? ATAK AKTYWOWANY**
Swords.Skills.SS.Refresh=[[GREEN]]Tw\u00f3j [[YELLOW]]Z\u0105bkowany Atak [[GREEN]]jest ju\u017c dost\u0119pny!
Swords.Skills.SS.Other.Off=Z\u0105bkowany Atak[[GREEN]] si\u0119 sko\u0144czy\u0142 [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Z\u0105bkowanego Ciosu!
Swords.Skillup=Umiej\u0119tno\u015b\u0107 Pos\u0142ugiwania si\u0119 Mieczem wzros\u0142a o {0}. Ca\u0142kowicie ({1})
Swords.SS.Length=D\u0142ugo\u015b\u0107 Z\u0105bkowanego Ataku: [[YELLOW]]{0}s
Taming.Ability.Bonus.0=Przyjazne dla \u015brodowiska
Taming.Ability.Bonus.1=Wilki unikn\u0119\u0142y zagro\u017cenia
Taming.Ability.Bonus.2=Grube Futro
Taming.Ability.Bonus.3=1/{0} Obrazenia, Odpornosc na ogien
Taming.Ability.Bonus.4=Odporno\u015b\u0107 na wstrz\u0105sy
Taming.Ability.Bonus.5=Eksplozje powoduja 1/{0} typowych obrazen
Taming.Ability.Bonus.6=Zaostrzone Pazury
Taming.Ability.Bonus.7=+{0} Obrazen
Taming.Ability.Bonus.8=Serwis FastFood\'u
Taming.Ability.Bonus.9={0} Szansa przy ataku na odnowienie \u017cycia
Taming.Ability.Bonus.11=Odzyskuj zdrowie podczas otrzymania obrazen od magii czy trucizny
Taming.Ability.Locked.0=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Taming.Ability.Locked.1=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Taming.Ability.Locked.2=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Taming.Ability.Locked.3=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Taming.Ability.Locked.4=ZABLOKOWANE DO POZIOMU {0}+ SKILL
Taming.Combat.Chance.Gore=Szansa na Brutalno\u015b\u0107: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=Wiedza o zwierz\u0119tach
Taming.SubSkill.BeastLore.Description=Ko\u015b\u0107 - przyci\u0105ga uwag\u0119 wilk\u00f3w i ocelot\u00f3w
Taming.SubSkill.ShockProof.Name=Odporno\u015b\u0107 na wstrz\u0105sy
Taming.SubSkill.ShockProof.Description=Redukcja obra\u017ce\u0144 wybuchowych
Taming.SubSkill.CallOfTheWild.Name=Wezwanie Dzikich
Taming.SubSkill.CallOfTheWild.Description=Przywo\u0142uje zwierze po twojej stronie
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]COTW (Ocelot): Kucnij i kliknij LPM {0} z ryb\u0105 w r\u0119ce
Taming.Effect.15=[[GRAY]]COTW (Wolf): Kucnij i kliknij LPM {0} z ko\u015bci\u0105 w d\u0142oni
Taming.SubSkill.FastFoodService.Name=Serwis FastFood\'u
Taming.SubSkill.FastFoodService.Description=Szansa dla wilk\u00f3w na odnowienie \u017cycia przy ataku
Taming.SubSkill.Gore.Name=Brutalno\u015b\u0107
Taming.SubSkill.Gore.Description=Cios krytyczny kt\u00f3ry wywo\u0142uje krwawienie
Taming.SubSkill.SharpenedClaws.Name=Zaostrzone Pazury
Taming.SubSkill.SharpenedClaws.Description=Dodatkowe Obra\u017cenia
Taming.SubSkill.EnvironmentallyAware.Name=Przyjazne dla \u015brodowiska
Taming.SubSkill.EnvironmentallyAware.Description=Strach przed Kaktusami/Law\u0105, Odporno\u015b\u0107 obra\u017cenia ze spadania
Taming.SubSkill.ThickFur.Name=Grube Futro
Taming.SubSkill.ThickFur.Description=Redukcja Obra\u017ce\u0144, Odporno\u015b\u0107 na ogie\u0144
Taming.Listener.Wolf=[[DARK_GRAY]]Tw\u00f3j wilk biegnie do ciebie...
Taming.Listener=Oswajanie:
Taming.SkillName=OSWAJANIE
Taming.Skillup=Umiej\u0119tno\u015b\u0107 oswajania wzros\u0142a o {0}. Razem ({1})
Taming.Summon.Complete=[[GREEN]]Przywo\u0142ywanie uko\u0144czone
Taming.Summon.Fail.Ocelot=Obecnie masz przy sobie zbyt du\u017co ocelot\u00f3w aby przywo\u0142a\u0107 kolejnego.
Taming.Summon.Fail.Wolf=Obecnie masz przy sobie zbyt du\u017co wilk\u00f3w aby przywo\u0142a\u0107 kolejnego.
Unarmed.Ability.Berserk.Length=D\u0142ugo\u015b\u0107 Berserka: [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=Styl \u017belaznej D\u0142oni
Unarmed.Ability.Bonus.1=Ulepszenie obra\u017ce\u0144 +{0}
Unarmed.Ability.Chance.ArrowDeflect=Szansa na Odbicie Strza\u0142y: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=Szansa na Rozbrojenie: [[YELLOW]]{0}
Unarmed.Ability.Chance.IronGrip=Szansa za Zelazny Chwyt: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=Tw\u00f3j przeciwnik ma \u017celazny u\u015bcisk!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]Tw\u00f3j \u017belazny Uchwyt uchroni\u0142 ci\u0119 przed Rozbrojeniem!
Unarmed.Ability.Lower=[[GRAY]]**OPUSZCZASZ SWOJE PI\u0118\u015aCI**
Unarmed.Ability.Ready=[[GREEN]]**PRZYGOTOWUJESZ SWOJE PIESCI**
Unarmed.SubSkill.Berserk.Name=Berserk (Zdolnosc)
Unarmed.SubSkill.Berserk.Description=+50% DMG, Niszczy slabe materialy
Unarmed.SubSkill.Disarm.Name=Rozbrojenie
Unarmed.SubSkill.Disarm.Description=Rozbraja przeciwnika z przedmiotu trzymanego przez niego w r\u0119ku
Unarmed.SubSkill.IronArmStyle.Name=Styl zelaznego ramienia
Unarmed.SubSkill.IronArmStyle.Description=Wzmacnia twoj\u0105 d\u0142o\u0144 w czasie
Unarmed.SubSkill.ArrowDeflect.Name=Odbicie strzaly
Unarmed.SubSkill.ArrowDeflect.Description=Odbijanie strzal
Unarmed.SubSkill.IronGrip.Name=Zelazny Chwyt
Unarmed.SubSkill.IronGrip.Description=Zapobiega przed Twoim rozbrojeniem
Unarmed.Listener=NIEUZBROJONY
Unarmed.SkillName=NIEUZBROJONY
Unarmed.Skills.Berserk.Off=**Berserk si\u0119 sko\u0144czy\u0142**
Unarmed.Skills.Berserk.On=[[GREEN]]**BERSERK AKTYWOWANY**
Unarmed.Skills.Berserk.Other.Off=Berserk[[GREEN]] si\u0119 sko\u0144czy\u0142 [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Berserka!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]Berserka [[GREEN]]jest ju\u017c dost\u0119pna!
Unarmed.Skillup=Umiej\u0119tno\u015b\u0107 boksowania zwi\u0119kszona o {0}. Ca\u0142kowicie ({1})
Woodcutting.Ability.0=Dmucharka do li\u015bci
Woodcutting.Ability.1=Zdmuchuje li\u015bcie
Woodcutting.Ability.Chance.DDrop=Szansa na Dwukrotny Drop: [[YELLOW]]{0}
Woodcutting.Ability.Length=D\u0142ugo\u015bc Powalacza Drzew: [[YELLOW]]{0}s
Woodcutting.Ability.Locked.0=ZABLOKOWANY DO POZIOMU {0}+ SKILL
Woodcutting.SubSkill.TreeFeller.Name=Powalacz Drzew
Woodcutting.SubSkill.TreeFeller.Description=Sprawia, i\u017c drzewa eksploduj\u0105
Woodcutting.SubSkill.LeafBlower.Name=Dmucharka do li\u015bci
Woodcutting.SubSkill.LeafBlower.Description=Zdmuchuje li\u015bcie
Woodcutting.SubSkill.HarvestLumber.Name=Podwojny Drop
Woodcutting.SubSkill.HarvestLumber.Description=Podwaja ilo\u015b\u0107 zdobywanych przedmiot\u00f3w
Woodcutting.Listener=\u015aCINANIE DRZEW
Woodcutting.SkillName=\u015aCINANIE DRZEW
Woodcutting.Skills.TreeFeller.Off=**Powalacz Drzew si\u0119 sko\u0144czy\u0142**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**POWALACZ DRZEW AKTYWOWANY**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]Twoja zdolno\u015b\u0107 [[YELLOW]]Powalacz Drzew [[GREEN]] jest ju\u017c dost\u0119pna!
Woodcutting.Skills.TreeFeller.Other.Off=Powalenie Drzewa[[GREEN]] si\u0119 sko\u0144czy\u0142o [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] u\u017cy\u0142 [[RED]]Powalacza Drzew!
Woodcutting.Skills.TreeFeller.Splinter=TWOJA SIEKIERA ROZPAD\u0141A SI\u0118 NA DRZAZGI!
Woodcutting.Skills.TreeFeller.Threshold=To drzewo jest zbyt du\u017ce!
Woodcutting.Skillup=Umiej\u0119tno\u015b\u0107 \u015bcinania wzros\u0142a o {0}. Razem ({1})
Ability.Generic.Refresh=[[GREEN]]**UMIEJ\u0118TNO\u015aCI DOST\u0118PNE!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
Combat.ArrowDeflect=[[WHITE]]**ODBICIE STRZALY**
Combat.BeastLore=[[GREEN]]**WIEDZA O ZWIERZETACH**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u017bycie ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]Wlasciciel ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**KRWOTOK**
Combat.StruckByGore=**WYKRWAWIASZ SI\u0118**
Combat.TargetDazed=Cel zostal [[DARK_RED]]oszolomiony.
Combat.TouchedFuzzy=[[DARK_RED]]Zostales oszolomiony.
mcMMO.Description=[[DARK_AQUA]]O [[YELLOW]]mcMMO[[DARK_AQUA]] Project:,[[GOLD]]mcMMO jest [[RED]]open source[[GOLD]] modem RPG stworzonym w lutym 2011 r.,[[GOLD]]przez [[BLUE]]com.gmail.nossr50[[GOLD]]. Celem jest wprowadzenie doswiadczen RPG.,[[DARK_AQUA]]Porady:,[[GOLD]] - [[GREEN]]Uzywaj [[RED]]/mcmmo help[[GREEN]] by zobaczyc komendy,[[GOLD]] - [[GREEN]]Pisz [[RED]]/NAZWA_UMIEJETNOSCI[[GREEN]] by zobaczyc informacje na jej temat,[[DARK_AQUA]]Programisci:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](Zalozyciel),[[GOLD]] - [[GREEN]]GJ [[BLUE]](Manager projektu),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](Developer),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](Developer),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](Developer),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](Developer),[[DARK_AQUA]]Przydatne linki:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] Zglaszanie bled\u00f3w,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,
Commands.addlevels.AwardAll.1=[[GREEN]]Otrzyma\u0142e\u015b {0} poziom\u00f3w we wszystkich dziedzinach!
Commands.addlevels.AwardAll.2=Wszystkie dziedziny zosta\u0142y zmienione na poziom {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]Zdoby\u0142e\u015b {0} poziom\u00f3w w dziedzinie {1}!
Commands.addlevels.AwardSkill.2={0} zosta\u0142 zmieniony dla {1}.
Commands.addxp.AwardAll=[[GREEN]]Otrzyma\u0142e\u015b {0} XP\'a we wszystkich dziedzinach!
Commands.addxp.AwardSkill=[[GREEN]]Otrzyma\u0142e\u015b {0} XP\'a we dziedzinie {1}!
Commands.Ability.Off=Umiej\u0119tno\u015b\u0107 wy\u0142\u0105czona [[RED]]
Commands.Ability.On=Umiej\u0119tno\u015b\u0107 w\u0142\u0105czona [[GREEN]]
Commands.AdminChat.Off=Czat tylko dla adminow [[RED]] Wylaczony
Commands.AdminChat.On=Czat tylko dla adminow [[RED]] W\u0142\u0105czony
Commands.AdminToggle=- Wlacza/wylacza czat adminow
Commands.Chat.Console=\"Konsola\"
Commands.Disabled=Komenda ta jest wylaczona.
Commands.DoesNotExist=Nie ma takiego gracza!
Commands.GodMode.Disabled=Nie\u015bmiertelno\u015b\u0107 wy\u0142\u0105czona
Commands.GodMode.Enabled=Nie\u015bmiertelno\u015b\u0107 w\u0142\u0105czona
Commands.GodMode.Forbidden=[mcMMO] Nie\u015bmiertelno\u015b\u0107 nie jest dozwolona na tym \u015bwiecie.
Commands.Inspect=<player> [[RED]]- Pokazuje informacje o graczu
Commands.Party.Invite.Accepted=[[GREEN]]Zaproszenie zaakceptowane. Do\u0142\u0105czy\u0142e\u015b do dru\u017cyny {0}
Commands.Invite.Success=[[GREEN]]Pomyslnie wyslano zaproszenie
Commands.Leaderboards=<skill> <page> [[RED]]- Rankingi
Commands.mcc.Header=---[][[YELLOW]]mcMMO Komendy[[RED]][]---
Commands.mcgod=- W\u0142\u0105cza/Wy\u0142\u0105cza Nie\u015bmiertelno\u015b\u0107
Commands.mchud.Invalid=Nie ma takiego Typu Interfejsu.
Commands.mcpurge.Success=[[GREEN]]Baza danych zosta\u0142a wyczyszczona!
Commands.mcrank.Heading=[[GOLD]]-=OSOBISTE RANKINGI=-
Commands.mcrank.Overall=Og\u00f3lne Statystyki[[GREEN]] - [[GOLD]]Ranga [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=CEL: [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]Ranga [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]Bez Rangi
Commands.mcrefresh.Success=Umiejetnosci [[RED]]{0} zostaly odnowione.
Commands.mcremove.Success=[[GREEN]]{0} zosta\u0142 usuni\u0119ty z bazy danych!
Commands.mctop.Tip=[[GOLD]]Porada: Wpisz [[RED]]/mcrank[[GOLD]] aby zobaczy\u0107 swoje rankingi!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - Modyfikuje cel
Commands.mmoedit.Modified.1=[[GREEN]]Tw\u00f3j poziom w {0} zosta\u0142 zmieniony na {1}!
Commands.mmoedit.Modified.2={0} zosta\u0142 zmieniony na {1}.
Commands.ModDescription=- Przeczytaj opis
Commands.NoConsole=Konsola nie obs\u0142uguje tej komendy.
Commands.Notifications.Off=Informacje na temat umiejetnosci [[RED]]wylaczone
Commands.Notifications.On=Informacje na temat umiejetnosci [[GREEN]]wlaczone
Commands.Other=[[GREEN]]--POZOSTA\u0141E KOMENDY--
Commands.Party.Header=-----[][[GREEN]]DRUZYNA[[RED]][]-----
Commands.Party.ShareMode=[[DARK_GRAY]]TRYB DZIELENIA SIE:
Commands.Party.ItemShare=[[GRAY]]PRZEDMIOT [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]EXP [[DARK_AQUA]]({0})
Commands.Party.MembersNear=[[DARK_GRAY]]OBOK CIEBIE [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=- Akceptuje zaproszenie grupy
Commands.Party.Chat.Off=Czat wy\u0142acznie dla dru\u017cyny [[RED]]Off
Commands.Party.Chat.On=Czat wy\u0142acznie dla dru\u017cyny w\u0142\u0105czony [[RED]]
Commands.Party.Commands=[[GREEN]]--KOMENDY DLA DRU\u017bYN--
Commands.Party.Invite.0=ALERT: [[GREEN]]Otrzyma\u0142e\u015b zaproszenie do dru\u017cyny {0} od {1}
Commands.Party.Invite.1=Wpisz [[GREEN]]/party accept[[YELLOW]] by akceptowac zaproszenie
Commands.Party.Invite=- Wysyla zaproszenie do druzyny
Commands.Party.Join=[[GRAY]]Dolaczono do druzyny: {0}
Commands.Party.Create=[[GRAY]]Utworzono druzyne: {0}
Commands.Party.Rename=[[GRAY]]Nazwa druzyny zmieniona na: [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]Druzyny {0} dzielenie sie przedmiotami ustawiono na: [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]Druzyna {0} juz istnieje!
Commands.Party.Kick=Zosta\u0142e\u015b wyrzucony z dru\u017cyny {0}!
Commands.Party.Leave=Opu\u015bci\u0142e\u015b dru\u017cyn\u0119.
Commands.Party.Members.Header=-----[][[GREEN]]CZLONKOWIE[[RED]][]-----
Commands.Party.None=Nie jestes w druzynie.
Commands.Party.Quit=- Opuszcza obecn\u0105 dru\u017cyne
Commands.Party.Teleport=<player> [[RED]]- Teleportacja do czlonka grupy.
Commands.Party.Toggle=- W\u0142\u0105cza/Wy\u0142\u0105cza czat dla dru\u017cyn
Commands.Party.1=- Tworzy nowa druzyne
Commands.Party.2=- Dolacza do druzyny gracza
Commands.ptp.Enabled=Teleportacja druzynowa [[GREEN]]aktywna
Commands.ptp.Disabled=Teleportacja druzynowa [[RED]]wylaczona
Commands.ptp.NoRequests=Nie masz zadnych zadan teleportacji w tym momencie
Commands.ptp.NoWorldPermissions=[mcMMO] Nie masz uprawnien do teleportacji do swiata {0}.
Commands.ptp.Request1={0} [[GREEN]]chce sie steleportowac do Ciebie.
Commands.ptp.Request2=[[GREEN]]By sie steleportowac, wpisz [[YELLOW]]/ptp accept. [[GREEN]]Zadanie wygasa po [[RED]]{0} [[GREEN]]sekundach.
Commands.ptp.AcceptAny.Disabled=Potwierdzenie zadania teleportacji druzynowej [[RED]]wylaczone
Commands.ptp.RequestExpired=Zadanie druzynowego teleportu wygaslo!
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] Poziom Mocy [[YELLOW]]Ranking--
Commands.PowerLevel.Capped=[[DARK_RED]]POZIOM MOCY: [[GREEN]]{0} [[DARK_RED]]MAKSYMALNY POZIOM: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]POZIOM MOCY: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]Wszystkie twoje umiej\u0119tno\u015bci zosta\u0142y zresetowane.
Commands.Reset.Single=[[GREEN]]Tw\u00f3j poziom w {0} zosta\u0142 zresetowany.
Commands.Reset=Resetuje poziom umiej\u0119tno\u015bci do 0
Commands.Skill.Invalid=Nie ma takiej umiej\u0119tno\u015bci!
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] Ranking--
Commands.SkillInfo=- Zobacz szczeg\u00f3lowe informacje na temat tej umiejetnosci
Commands.Stats.Self=TWOJE STATYSTYKI
Commands.Stats=- Zobacz swoje statystyki
Commands.ToggleAbility=- W\u0142\u0105cza/Wy\u0142\u0105cza zdolno\u015b\u0107 PPM
Commands.Usage.1=W\u0142a\u015bciwa komenda to /{0} {1}
Commands.Usage.2=W\u0142a\u015bciwa komenda to /{0} {1} {2}
Commands.Usage.3=W\u0142a\u015bciwa komenda to /{0} {1} {2} {3}
Commands.Usage.Level=poziom
Commands.Usage.Message=wiadomo\u015b\u0107
Commands.Usage.Page=strona
Commands.Usage.Password=haslo
Commands.Usage.Player=gracz
Commands.Usage.Skill=zdolno\u015b\u0107
Commands.Usage.XP=xp
mcMMO.NoInvites=Nie masz zadnych zaproszen
mcMMO.NoPermission=[[DARK_RED]]Nie wystarczaj\u0105ce uprawnienia.
mcMMO.NoSkillNote=[[DARK_GRAY]]Je\u015bli nie posiadasz dost\u0119pu do zdolno\u015bci, nie b\u0119dzie ona tu ukazana.
Party.Forbidden=[mcMMO] Dru\u017cyny nie s\u0105 dozwolone na tym \u015bwiecie
Party.Help.9=Uzyj [[DARK_AQUA]]{0} [[RED]]by dzielic sie przedmiotami z czlonkami druzyny
Party.Help.10=Uzyj [[DARK_AQUA]]{0} [[RED]]by aktywowac dzielenie sie XP z czlonkami druzyny
Party.InformedOnJoin={0} [[GREEN]]dolaczyl do Twojej druzyny
Party.InformedOnQuit={0} [[GREEN]]opuscil Twoja druzyne
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]zmienil nazwe druzyny na [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]Nie istnieje dru\u017cyna o takiej nazwie!
Party.Invite.Self=Nie mozesz zaprosic siebie samego!
Party.IsLocked=Ta grupa jest juz zamknieta!
Party.IsntLocked=Ta grupa nie jest zamkni\u0119ta!
Party.Locked=Grupa jest zamknieta, tylko wlasciciel moze dodac graczy.
Party.NotInYourParty=[[DARK_RED]]{0} nie jest cz\u0142onkiem twojej dru\u017cyny.
Party.NotOwner=[[DARK_RED]]Nie jeste\u015b liderem grupy.
Party.Owner.New=[[GREEN]]{0} jest nowym liderem grupy.
Party.Owner.NotLeader=[[DARK_RED]]Nie jeste\u015b ju\u017c liderem grupy.
Party.Owner.Player=[[GREEN]]Jeste\u015b teraz liderem grupy.
Party.Password.Incorrect=Has\u0142o grupy nieprawid\u0142owe.
Party.Password.Set=[[GREEN]]Haslo grupy zmienione na: {0}
Party.Password.Removed=[[GREEN]]Haslo druzyny zostalo wyczyszczone.
Party.Player.Invalid=Nie ma takiego gracza.
Party.NotOnline=[[DARK_RED]]{0} jest offline!
Party.Player.InSameParty={0} juz jest w Twojej druzynie!
Party.PlayerNotInParty=[[DARK_RED]]{0} nie jest w druzynie
Party.Teleport.Dead=Nie mo\u017cesz si\u0119 teleportowa\u0107 do zmar\u0142ego gracza.
Party.Teleport.Hurt=Zostales ranny przed {0} sekundami i nie mozesz sie steleportowac.
Party.Teleport.Player=[[GREEN]]Teleportowa\u0142e\u015b si\u0119 do {0}.
Party.Teleport.Self=Nie mo\u017cesz teleportowa\u0107 si\u0119 do samego siebie!
Party.Teleport.Target=[[GREEN]]{0} teleportowa\u0142 si\u0119 do Ciebie.
Party.Teleport.Disabled={0} nie zezwala na teleportacje druzynowa.
Party.Rename.Same=Taka juz jest wlasnie nazwa Twojej druzyny!
Party.Join.Self=Nie mozesz dolaczyc do samego siebie!
Party.Unlocked=[[GRAY]]Grupa jest otwarta dla wszystkich.
Party.Disband=[[GRAY]]Druzyna zostala rozwiazana
Party.Status.Locked=[[DARK_RED]](TYLKO NA ZAPROSZENIE)
Party.ShareType.Xp=EXP
Party.ShareType.Item=PRZEDMIOTOWY
Party.ShareMode.Equal=R\u00d3WNY
Party.ShareMode.Random=LOSOWY
Party.ItemShare.Disabled=Druzynowe dzielenie sie przedmiotami jest wylaczone.
Party.ItemShare.Category.Loot=Loot
Party.ItemShare.Category.Mining=G\u00f3rnictwo
Party.ItemShare.Category.Herbalism=Zielarstwo
Party.ItemShare.Category.Woodcutting=Scinanie drzew
Party.ItemShare.Category.Misc=R\u00f3zne
Commands.XPGain.Acrobatics=Upadanie
Commands.XPGain.Archery=Atak potworow
Commands.XPGain.Axes=Atak potworow
Commands.XPGain.Child=Podnosi poziomy z nadrzednych umiejetnosci
Commands.XPGain.Excavation=Kopanie i odnajdywanie skarb\u00f3w
Commands.XPGain.Fishing=Rybactwo
Commands.XPGain.Herbalism=Zbieranie Zi\u00f3\u0142
Commands.XPGain.Mining=Wydobywa Kamie\u0144 i Surowce
Commands.XPGain.Repair=Naprawianie
Commands.XPGain.Swords=Atak potworow
Commands.XPGain.Taming=Oswoj zwierze, lub walcz ze swoimi wilkami.
Commands.XPGain.Unarmed=Atak potworow
Commands.XPGain.Woodcutting=\u015acina drzewa
Commands.XPGain=[[DARK_GRAY]Zdobyte do\u015bwiadczenie: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]Tw\u00f3j pasek XP\'a jest zablokowany {0}!
Commands.xplock.unlocked=[[GOLD]]Tw\u00f3j pasek XP\'a jest odblokowany {0}!
Commands.xprate.modified=Modyfikator zdobywania do\u015bwiadczenia zosta\u0142 zmieniony na {0}
Commands.xprate.over=[[GOLD]]Event[[RED]] zwi\u0119kszonego zdobywania XP\'a jest zako\u0144czony!
Commands.xprate.proper.0=Aby zmieni\u0107 mno\u017cnik XP - /xprate <mno\u017cnik> <true/false>
Commands.xprate.proper.1=Aby przywr\u00f3ci\u0107 normalny mno\u017cnik zdobywania XP\'a - /xprate reset
Commands.xprate.proper.2=Wpisz true/false aby okre\u015bli\u0107 czy jest to EVENT czy te\u017c nie
Commands.xprate.started.0=[[GOLD]]EVENT zwi\u0119kszonego zdobywania XP\'a w\u0142a\u015bnie si\u0119 zacz\u0105\u0142!
Commands.xprate.started.1=[[GOLD]]Mno\u017cnik zdobywania XP\'a wynosi {0}x!
XPRate.Event=[[GOLD]]mcMMO is currently in an XP rate event! XP rate is {0}x!
Effects.Effects=EFEKTY
Effects.Child=[[DARK_GRAY]]LVL: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]Poziom: [[GREEN]]{0} [[DARK_AQUA]]Doswiadczenie[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Available=[[GRAY]]Przewodnik dla {0} jest dost\u0119pny - wpisz /{1} ? [strona]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} Przewodnik[[GOLD]]=-
Guides.Page.Invalid=Niew\u0142a\u015bciwa strona!
Guides.Page.OutOfRange=Ta strona nie istnieje, jest tylko {0} stron.
Guides.Usage=W\u0142a\u015bciwa Komenda to /{0} ? [strona]
Guides.Smelting.Section.0=Wkrotce...
Inspect.Offline=Nie masz odpowiednich uprawnie\u0144 aby przygl\u0105da\u0107 si\u0119 graczom offline!
Inspect.OfflineStats=Statystyki Gracza Offline [[YELLOW]]{0}
Inspect.Stats=[[GREEN]]Statystyki Gracza [[YELLOW]]{0}
Inspect.TooFar=Jeste\u015b zbyt daleko aby przyjrze\u0107 si\u0119 temu graczowi!
Item.ChimaeraWing.Fail=**U\u017bYCIE SKRZYD\u0141A CHIMERY NIE POWIOD\u0141O SI\u0118**
Item.ChimaeraWing.Pass=**SKRZYD\u0141O CHIMERY**
Item.ChimaeraWing.Name=Skrzydlo Chimery
Item.ChimaeraWing.Lore=[[GRAY]]Teleportuje Cie do Twojego l\u00f3zka.
Item.Generic.Wait=Musisz poczekac, nim bedziesz m\u00f3gl uzyc tego ponownie! [[YELLOW]]({0}s)
Item.Injured.Wait=Zosta\u0142e\u015b ostatnio ranny i musisz poczeka\u0107 aby tego u\u017cy\u0107. [[YELLOW]]({0}s)
Teleport.Commencing=[[GRAY]]Teleportacja za [[GOLD]]({0}) [[GRAY]]sekund, nie ruszaj sie...
Teleport.Cancelled=[[DARK_RED]]Teleportacja anulowana!
Skills.Disarmed=[[DARK_RED]]Zostales rozbrojony!
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]Potrzebujesz wiecej
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.TooTired=Musisz odpoczac zanim ponownie uzyjesz tej umiejetnosci.
Skills.ConfirmOrCancel=[[GREEN]]Prawy-klik ponownie by potwierdzic [[GOLD]]{0}[[GREEN]]. Lewy-klik by anulowac.
Stats.Header.Combat=[[GOLD]]-=UMIEJ\u0118TNO\u015aCI BOJOWE=-
Stats.Header.Gathering=[[GOLD]]-=UMIEJ\u0118TNO\u015aCI ZBIERANIA=-
Stats.Header.Misc=[[GOLD]]-=ROZNE UMIEJETNOSCI=-
Stats.Own.Stats=[[GREEN]][mcMMO] Statystyki
Perks.XP.Name=Do\u015bwiadczenie
Perks.XP.Desc=Otrzymuje {0}x XP\'a.
Perks.Lucky.Name=Szcz\u0119\u015bcie
Perks.Lucky.Desc=Daje {0} i umiej\u0119tno\u015bciom o 33.3% lepsz\u0105 szanse na aktywacj\u0119.
Perks.Lucky.Desc.Login=Daje wybranym skillom i umiej\u0119tno\u015bciom o 33.3% lepsz\u0105 szanse na aktywacj\u0119.
Perks.Lucky.Bonus=[[GOLD]] ({0} ze zdolno\u015bci\u0105 Szcz\u0119\u015bcia)
Perks.Cooldowns.Name=Szybka Regeneracja
Perks.Cooldowns.Desc=Zmniejsza czas odnowienia zdolno\u015bci o {0}.
Perks.ActivationTime.Name=Wytrzyma\u0142o\u015b\u0107
Perks.ActivationTime.Desc=Zwi\u0119ksza czas na u\u017cycie zdolno\u015bci o {0} sekund.
Perks.ActivationTime.Bonus=[[GOLD]] ({0}s ze zdolno\u015bci\u0105 Wytrzyma\u0142o\u015bci)
MOTD.Donate=[[DARK_AQUA]]Informacje o Dotacji:
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Kara za \u015amier\u0107: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Statystyki Wampirycznych Pijawek: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[mcMMO Zdolno\u015bci]
MOTD.Version=[[GOLD]][mcMMO] Obecna Wersja [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - Strona mcMMO
Smelting.Ability.FuelEfficiency=Mnoznik wydajnosci paliwa: [[YELLOW]]{0}x
Smelting.Ability.Locked.0=DOSTEPNE OD POZIOMU {0}+ (VANILLA XP BOOST)
Smelting.Ability.Locked.1=DOSTEPNE OD POZIOMU {0}+ (FLUX MINING)
Smelting.Ability.SecondSmelt=Szansa na drugie przetopienie: [[YELLOW]]{0}
Smelting.Ability.VanillaXPBoost=Vanilla mnoznik XP: [[YELLOW]]{0}x
Smelting.SubSkill.FuelEfficiency.Name=Wydajnosc paliwa
Smelting.SubSkill.FuelEfficiency.Description=Zwieksza czas spalania sie paliwa w piecu podczas przetapiania
Smelting.SubSkill.SecondSmelt.Name=Drugie przetopienie
Smelting.SubSkill.SecondSmelt.Description=Podwaja zasoby zdobyte z przetapiania
Smelting.Effect.4=Vanilla XP Boost
Smelting.Effect.5=Zwieksza XP zdobywane poprzez przetapianie
Smelting.SubSkill.FluxMining.Description=Szansa dla zl\u00f3z by zostaly natychmiastowo przetopione podczas wykopywania
Smelting.FluxMining.Success=[[GREEN]]Zloze przetopilo sie samoistnie!
Smelting.Listener=Przetapianie:
Smelting.SkillName=PRZETAPIANIE
Commands.Description.adminchat=Wlacza/wylacza czat admin\u00f3w lub wysyla wiadomosc na czat admin\u00f3w
Commands.Description.mcnotify=Wlacza/wylacza informacje na temat umiejetnosci mcMMO na czacie
Commands.Description.vampirism=Zmodyfikuj wartosc procentowa na aktywowanie wampiryzmu mcMMO lub go wlacz/wylacz
UpdateChecker.Outdated=Uzywasz przestarzalej wersji mcMMO!
UpdateChecker.NewAvailable=Dostepna jest nowa wersja na BukkitDev.

View File

@@ -1,799 +0,0 @@
Acrobatics.Ability.Proc=[[GREEN]]**\u534e\u5c14\u5179\u822c\u7684\u964d\u843d**
Acrobatics.Combat.Proc=[[GREEN]]**\u95ea\u907f**
Acrobatics.DodgeChance=\u95ea\u907f\u51e0\u7387: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.Name=\u7ffb\u6eda
Acrobatics.SubSkill.Roll.Description=\u51cf\u5c11\u6216\u8005\u53d6\u6d88\u6389\u843d\u4f24\u5bb3
Acrobatics.SubSkill.GracefulRoll.Name=\u4f18\u96c5\u7684\u7ffb\u6eda
Acrobatics.SubSkill.GracefulRoll.Description=\u4e24\u500d\u7684\u7ffb\u6eda\u6548\u679c
Acrobatics.SubSkill.Dodge.Name=\u95ea\u907f
Acrobatics.SubSkill.Dodge.Description=\u51cf\u5c11\u4e00\u534a\u7684\u4f24\u5bb3
Acrobatics.Listener=\u6742\u6280(Acrobatics):
Acrobatics.SubSkill.Roll.Chance=\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0}
Acrobatics.SubSkill.Roll.GraceChance=\u4f18\u96c5\u7684\u7ffb\u6eda\u51e0\u7387: [[YELLOW]]{0}
Acrobatics.Roll.Text=**\u7ffb\u6eda**
Acrobatics.SkillName=\u6742\u6280
Acrobatics.Skillup=\u6742\u6280\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Alchemy.SubSkill.Catalysis.Name=\u50ac\u5316
Alchemy.SubSkill.Catalysis.Description=\u63d0\u5347\u836f\u6c34\u917f\u9020\u901f\u5ea6
Alchemy.SubSkill.Concoctions.Name=\u6df7\u5408
Alchemy.SubSkill.Concoctions.Description=\u917f\u9020\u5e26\u6709\u591a\u91cd\u539f\u6599\u7684\u836f\u6c34
Alchemy.Listener=\u70bc\u91d1(Alchemy):
Alchemy.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u50ac\u5316\uff09
Alchemy.Catalysis.Speed=\u917f\u9020\u901f\u5ea6: [[YELLOW]]{0}
Alchemy.Concoctions.Rank=\u6df7\u5408\u7b49\u7ea7: [[YELLOW]]{0}/{1}
Alchemy.Concoctions.Ingredients=\u914d\u65b9 [[[YELLOW]]{0}[[RED]]]: [[YELLOW]]{1}
Alchemy.SkillName=\u70bc\u91d1
Alchemy.Skillup=\u70bc\u91d1\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Archery.Combat.DazeChance=\u51fb\u6655\u51e0\u7387: [[YELLOW]]{0}
Archery.Combat.RetrieveChance=\u56de\u6536\u7bad\u77e2\u7684\u51e0\u7387: [[YELLOW]]{0}
Archery.Combat.SkillshotBonus=\u6280\u5de7\u5c04\u51fb\u5956\u52b1\u4f24\u5bb3: [[YELLOW]]{0}
Archery.SubSkill.SkillShot.Name=\u6280\u5de7\u5c04\u51fb
Archery.SubSkill.SkillShot.Description=\u589e\u52a0\u5f13\u7bad\u4f24\u5bb3
Archery.SubSkill.Daze.Name=\u51fb\u6655 (\u9650\u73a9\u5bb6\u4e4b\u95f4)
Archery.SubSkill.Daze.Description=\u8ff7\u60d1\u654c\u4eba\u5e76\u9020\u6210 {0} \u4f24\u5bb3
Archery.SubSkill.ArrowRetrieval.Name=\u56de\u6536\u5f13\u7bad
Archery.SubSkill.ArrowRetrieval.Description=\u6709\u51e0\u7387\u4ece\u5c38\u4f53\u4e0a\u56de\u6536\u7bad\u77e2
Archery.Listener=\u7bad\u672f(Archery):
Archery.SkillName=\u7bad\u672f
Archery.Skillup=\u7bad\u672f\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Axes.Ability.Bonus.0=\u65a7\u5934\u7cbe\u901a
Axes.Ability.Bonus.1=\u5956\u52b1 {0} \u4f24\u5bb3
Axes.Ability.Bonus.2=\u51b2\u51fb
Axes.Ability.Bonus.3=\u5bf9\u6709\u62a4\u7532\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3
Axes.Ability.Bonus.4=\u5f3a\u70c8\u51b2\u51fb
Axes.Ability.Bonus.5=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u9020\u6210 {0} \u70b9\u989d\u5916\u4f24\u5bb3
Axes.Ability.Lower=[[GRAY]]**\u4f60\u6536\u8d77\u4e86\u4f60\u7684\u65a7\u5934**
Axes.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u65a7\u5934**
Axes.Combat.CritStruck=[[DARK_RED]]\u4f60\u6253\u51fa\u4e86\u66b4\u51fb!
Axes.Combat.CritChance=\u81f4\u547d\u4e00\u51fb: [[YELLOW]]{0}%
Axes.Combat.CriticalHit=\u66b4\u51fb!
Axes.Combat.GI.Proc=[[GREEN]]**\u5de8\u529b\u6253\u51fb**
Axes.Combat.GI.Struck=**\u88ab\u5f3a\u70c8\u51b2\u51fb\u51fb\u4e2d**
Axes.Combat.SS.Struck=[[DARK_RED]]\u88ab\u65a9\u9996\u8005\u6280\u80fd\u653b\u51fb!
Axes.Combat.SS.Length=\u65a9\u9996\u8005\u6280\u80fd\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Axes.SubSkill.SkullSplitter.Name=\u65a9\u9996\u8005 (\u4e3b\u52a8\u6280\u80fd)
Axes.SubSkill.SkullSplitter.Description=\u9020\u6210\u8303\u56f4\u4f24\u5bb3
Axes.SubSkill.CriticalStrikes.Name=\u81f4\u547d\u4e00\u51fb
Axes.SubSkill.CriticalStrikes.Description=\u53cc\u500d\u4f24\u5bb3
Axes.SubSkill.AxeMastery.Name=\u65a7\u5934\u7cbe\u901a
Axes.SubSkill.AxeMastery.Description=\u589e\u52a0\u989d\u5916\u4f24\u5bb3
Axes.SubSkill.ArmorImpact.Name=\u51b2\u51fb
Axes.SubSkill.ArmorImpact.Description=\u7528\u8db3\u591f\u7684\u529b\u91cf\u51fb\u788e\u62a4\u7532
Axes.SubSkill.GreaterImpact.Name=\u5f3a\u70c8\u51b2\u51fb
Axes.SubSkill.GreaterImpact.Description=\u5bf9\u65e0\u62a4\u7532\u654c\u4eba\u9020\u6210\u989d\u5916\u4f24\u5bb3
Axes.Listener=\u65a7\u6280(Axes):
Axes.SkillName=\u65a7\u6280
Axes.Skills.SS.Off=**\u65a9\u9996\u8005\u6280\u80fd\u5df2\u7ed3\u675f**
Axes.Skills.SS.On=[[GREEN]]**\u65a9\u9996\u8005\u6280\u80fd\u542f\u52a8**
Axes.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u65a9\u9996\u8005 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\uff01\uff01\uff01
Axes.Skills.SS.Other.Off=\u65a9\u9996\u8005[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Axes.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]]\u4f7f\u7528\u4e86 [[RED]]\u65a9\u9996\u8005!
Axes.Skillup=\u65a7\u5934\u6280\u80fd\u589e\u52a0\u4e86 {0}. \u603b\u5171 ({1})
Excavation.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u94f2\u5b50**
Excavation.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u94f2\u5b50**
Excavation.SubSkill.GigaDrillBreaker.Name=\u66b4\u8d70\u94bb\u5934 (\u4e3b\u52a8\u6280\u80fd)
Excavation.SubSkill.GigaDrillBreaker.Description=3x \u6389\u843d\u7387, 3x \u7ecf\u9a8c\u503c, +\u901f\u5ea6
Excavation.SubSkill.TreasureHunter.Name=\u5b9d\u7269\u730e\u4eba
Excavation.SubSkill.TreasureHunter.Description=\u6316\u51fa\u5b9d\u85cf\u7684\u80fd\u529b
Excavation.Effect.Length=\u66b4\u8d70\u94bb\u5934\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Excavation.Listener=\u6316\u6398(Excavation):
Excavation.SkillName=\u6316\u6398
Excavation.Skills.GigaDrillBreaker.Off=**\u66b4\u8d70\u94bb\u5934\u5df2\u7ecf\u7ed3\u675f\u4e86**
Excavation.Skills.GigaDrillBreaker.On=[[GREEN]]**\u66b4\u8d70\u94bb\u5934\u6fc0\u6d3b**
Excavation.Skills.GigaDrillBreaker.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u66b4\u8d70\u94bb\u5934 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
Excavation.Skills.GigaDrillBreaker.Other.Off=\u66b4\u8d70\u94bb\u5934[[GREEN]] \u8fdb\u5165\u51b7\u5374 [[YELLOW]]{0}
Excavation.Skills.GigaDrillBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u66b4\u8d70\u94bb\u5934!
Excavation.Skillup=\u6316\u6398\u6280\u80fd\u63d0\u5347 {0}. \u603b\u5171 ({1})
Fishing.Ability.Chance=\u6495\u54ac\u51e0\u7387: [[YELLOW]]{0}
Fishing.Ability.Info=\u9b54\u6cd5\u730e\u4eba: [[GRAY]] ** \u968f\u7740\u5b9d\u85cf\u730e\u4eba\u7b49\u7ea7\u63d0\u9ad8 **
Fishing.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd\uff08\u6447\uff09
Fishing.Ability.Locked.1={0}+ \u7ea7\u540e\u89e3\u9501 (\u51b0\u9493)
Fishing.Ability.Locked.2=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd (\u9493\u9c7c\u5927\u5e08)
Fishing.Ability.Rank=\u5b9d\u7269\u730e\u4eba\u7b49\u7ea7: [[YELLOW]]{0}/5
Fishing.Ability.TH.DropRate=\u6389\u5b9d\u7387: [[DARK_RED]]\u9677\u9631: [[YELLOW]]{0} [[GRAY]]\u5e38\u89c1: [[YELLOW]]{1} [[GREEN]]\u7f55\u89c1: [[YELLOW]]{2}\n[[BLUE]]\u7a00\u6709: [[YELLOW]]{3} [[LIGHT_PURPLE]]\u53f2\u8bd7: [[YELLOW]]{4} [[GOLD]]\u4f20\u8bf4: [[YELLOW]]{5} [[AQUA]]\u521b\u7eaa\u5f55: [[YELLOW]]{6}
Fishing.Ability.TH.MagicRate=\u9b54\u6cd5\u730e\u4eba\u51e0\u7387: [[YELLOW]]{0}
Fishing.Ability.Shake=\u9c7c\u94a9\u7a83\u53d6\u51e0\u7387: [[YELLOW]]{0}
Fishing.Ability.IceFishing=\u51b0\u9493: \u5728\u51b0\u4e0a\u9493\u9c7c
Fishing.Ability.FD=\u6e14\u6c11\u7684\u98df\u8c31: [[YELLOW]]\u6392\u540d {0}
Fishing.SubSkill.TreasureHunter.Name=\u5b9d\u7269\u730e\u4eba (\u88ab\u52a8\u6280\u80fd)
Fishing.SubSkill.TreasureHunter.Description=\u9493\u5230\u6742\u7269
Fishing.SubSkill.MagicHunter.Name=\u9b54\u6cd5\u730e\u4eba
Fishing.SubSkill.MagicHunter.Description=\u627e\u5230\u9644\u9b54\u7269\u54c1
Fishing.SubSkill.Shake.Name=\u6643\u52a8\u602a\u7269 (\u5bf9\u602a\u7269\u4f7f\u7528)
Fishing.SubSkill.Shake.Description=\u7528\u9c7c\u7aff\u628a\u602a\u7269\u8eab\u4e0a\u7684\u4e1c\u897f\u6447\u4e0b\u6765
Fishing.SubSkill.FishermansDiet.Name=\u6e14\u592b\u98df\u8c31
Fishing.SubSkill.FishermansDiet.Description=\u63d0\u9ad8\u9c7c\u7c7b\u98df\u7269\u6062\u590d\u7684\u9971\u98df\u5ea6
Fishing.SubSkill.MasterAngler.Name=\u9493\u9c7c\u5927\u5e08
Fishing.SubSkill.MasterAngler.Description=\u63d0\u9ad8\u9493\u9c7c\u54ac\u94a9\u51e0\u7387
Fishing.SubSkill.IceFishing.Name=\u51b0\u9493
Fishing.SubSkill.IceFishing.Description=\u5141\u8bb8\u4f60\u5728\u51b0\u51b7\u7684\u73af\u5883\u4e0b\u9493\u9c7c
Fishing.Chance.Raining=[[BLUE]] \u5927\u91cf\u5956\u52b1
Fishing.Listener=\u9493\u9c7c(Fishing):
Fishing.Ability.TH.MagicFound=[[GRAY]]\u4f60\u611f\u5230\u4e00\u80a1\u9b54\u529b\u7684\u6ce2\u52a8...
Fishing.Ability.TH.Boom=[[GRAY]]\u7e41\u8363\u65f6\u671f!!!
Fishing.Ability.TH.Poison=[[GRAY]]\u4ec0\u4e48\u4e1c\u897f,\u95fb\u8d77\u6765\u597d\u81ed\u554a...
Fishing.SkillName=\u9493\u9c7c
Fishing.Skillup=\u9493\u9c7c\u6280\u80fd\u63d0\u5347\u4e86 {0}. \u603b\u5171 ({1})
Herbalism.Ability.DoubleDropChance=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
Herbalism.Ability.FD=\u519c\u592b\u98df\u8c31: [[YELLOW]]\u6392\u540d {0}
Herbalism.Ability.GTe.Length=\u571f\u795e\u5e87\u4f51\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Herbalism.Ability.GTe.NeedMore=\u4f60\u9700\u8981\u66f4\u591a\u7684\u79cd\u5b50\u8fdb\u884c\u7eff\u5316
Herbalism.Ability.GTh.Chance=\u7eff\u5316\u51e0\u7387: [[YELLOW]]{0}
Herbalism.Ability.GTh.Fail=**\u7eff\u5316\u5931\u8d25**
Herbalism.Ability.GTh.Stage=\u7eff\u5316:[[YELLOW]]\u519c\u4f5c\u7269\u751f\u957f\u671f{0}
Herbalism.Ability.GTh=[[GREEN]]**\u7eff\u5316**
Herbalism.Ability.HylianLuck=\u6d77\u62c9\u5c14\u7684\u795d\u798f\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
Herbalism.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u9504\u5934**
Herbalism.Ability.Ready=[[GREEN]]**\u4f60\u6311\u8d77\u4e86\u4f60\u7684\u9504\u5934**
Herbalism.Ability.ShroomThumb.Chance=\u83cc\u4e1d\u5316\u51e0\u7387: [[YELLOW]]{0}
Herbalism.Ability.ShroomThumb.Fail=**\u83cc\u4e1d\u5316\u5931\u8d25**
Herbalism.SubSkill.GreenTerra.Name=\u571f\u795e\u5e87\u4f51 (\u4e3b\u52a8\u6280\u80fd)
Herbalism.SubSkill.GreenTerra.Description=\u64ad\u6492\u5973\u795e\u7684\u6069\u60e0, \u83b7\u5f973\u500d\u6389\u7387
Herbalism.SubSkill.GreenThumb.Name=\u7eff\u5316 (\u5c0f\u9ea6)
Herbalism.SubSkill.GreenThumb.Description=\u6536\u83b7\u7684\u65f6\u5019\u81ea\u52a8\u79cd\u690d\u5c0f\u9ea6
Herbalism.Effect.4=\u7eff\u5316 (\u65b9\u5757)
Herbalism.SubSkill.GreenThumb.Description.2=\u788e\u77f3/\u77f3\u5757 -> \u7528\u79cd\u5b50\u4f7f\u5b83\u4eec\u53d8\u6210\u9752\u82d4\u77f3,\u6216\u8005\u8ba9\u8349\u751f\u957f
Herbalism.SubSkill.FarmersDiet.Name=\u519c\u592b\u98df\u8c31
Herbalism.SubSkill.FarmersDiet.Description=\u98df\u7528\u519c\u4ea7\u54c1\u65f6\u989d\u5916\u56de\u590d\u9965\u997f\u5ea6
Herbalism.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d (\u6240\u6709\u7684\u690d\u7269)
Herbalism.SubSkill.DoubleDrops.Description=\u53cc\u500d\u7269\u54c1
Herbalism.SubSkill.HylianLuck.Name=\u6d77\u62c9\u5c14\u7684\u795d\u798f
Herbalism.SubSkill.HylianLuck.Description=\u7ed9\u4e88\u5c0f\u51e0\u7387\u627e\u5230\u7a00\u6709\u7269\u54c1\u7684\u80fd\u529b
Herbalism.SubSkill.ShroomThumb.Name=\u83cc\u4e1d\u5316
Herbalism.SubSkill.ShroomThumb.Description=\u5411\u6ce5\u571f&\u8349\u5730\u6563\u64ad\u83cc\u4e1d
Herbalism.HylianLuck=[[GREEN]]\u613f\u6d77\u62c9\u5c14\u7684\u795d\u798f\u4e0e\u4f60\u540c\u5728!
Herbalism.Listener=\u8349\u836f\u5b66(Herbalism):
Herbalism.SkillName=\u8349\u836f\u5b66
Herbalism.Skills.GTe.Off=**\u571f\u795e\u5e87\u4f51\u6280\u80fd\u5df2\u7ed3\u675f**
Herbalism.Skills.GTe.On=[[GREEN]]**\u6fc0\u6d3b\u571f\u795e\u5e87\u4f51\u6280\u80fd**
Herbalism.Skills.GTe.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u571f\u795e\u5e87\u4f51 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
Herbalism.Skills.GTe.Other.Off=\u571f\u795e\u5e87\u4f51[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Herbalism.Skills.GTe.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u571f\u795e\u5e87\u4f51!
Herbalism.Skillup=\u8349\u836f\u5b66\u6280\u80fd\u7b49\u7ea7\u4e0a\u5347 {0}. \u73b0\u5728\u662f ({1})
Mining.Ability.Length=\u8d85\u7ea7\u788e\u77f3\u673a\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Mining.Ability.Locked.0=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u5f00\u91c7)
Mining.Ability.Locked.1=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u5927\u53f7\u70b8\u5f39)
Mining.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u7206\u7834\u4e13\u5bb6)
Mining.Ability.Lower=[[GRAY]]**\u4f60\u6536\u8d77\u4e86\u4f60\u7684\u9550\u5b50**
Mining.Ability.Ready=[[GREEN]]**\u4f60\u62ff\u8d77\u4e86\u4f60\u7684\u77ff\u9504**
Mining.SubSkill.SuperBreaker.Name=\u8d85\u7ea7\u788e\u77f3\u673a (\u4e3b\u52a8\u6280\u80fd)
Mining.SubSkill.SuperBreaker.Description=\u901f\u5ea6+, 3\u500d\u6389\u843d\u7387
Mining.SubSkill.DoubleDrops.Name=\u53cc\u500d\u6389\u843d
Mining.SubSkill.DoubleDrops.Description=\u53cc\u500d\u7269\u54c1
Mining.SubSkill.BlastMining.Name=\u7206\u7834\u5f00\u91c7
Mining.SubSkill.BlastMining.Description=\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u4f1a\u83b7\u5f97\u989d\u5916\u5956\u52b1
Mining.SubSkill.BiggerBombs.Name=\u5927\u53f7\u70b8\u5f39
Mining.SubSkill.BiggerBombs.Description=\u589e\u52a0TNT\u7206\u70b8\u8303\u56f4
Mining.SubSkill.DemolitionsExpertise.Name=\u7206\u7834\u4e13\u5bb6
Mining.SubSkill.DemolitionsExpertise.Description=\u51cf\u5c11\u6765\u81eaTNT\u7684\u4f24\u5bb3
Mining.Effect.Decrease=\u7206\u7834\u4e13\u5bb6\u4f24\u5bb3\u51cf\u5c11: [[YELLOW]]{0}
Mining.Effect.DropChance=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
Mining.Listener=\u6316\u77ff(Mining):
Mining.SkillName=\u6316\u77ff
Mining.Skills.SuperBreaker.Off=**\u8d85\u7ea7\u788e\u77f3\u673a\u5df2\u7ed3\u675f**
Mining.Skills.SuperBreaker.On=[[GREEN]]**\u8d85\u7ea7\u788e\u77f3\u673a\u5df2\u6fc0\u6d3b**
Mining.Skills.SuperBreaker.Other.Off=\u8d85\u7ea7\u788e\u77f3\u673a[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Mining.Skills.SuperBreaker.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u8d85\u7ea7\u788e\u77f3\u673a!
Mining.Skills.SuperBreaker.Refresh=[[GREEN]]\u4f60\u7684[[YELLOW]] \u8d85\u7ea7\u788e\u77f3\u673a [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u518d\u6b21\u4f7f\u7528\u4e86\uff01
Mining.Skillup=\u6316\u77ff\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Mining.Blast.Boom=[[GRAY]]**\u5623**
Mining.Blast.Effect=+{0} \u77ff\u7269\u91cf, -{1} \u788e\u7247\u91cf, {2}x \u6389\u843d
Mining.Blast.Radius.Increase=\u7206\u70b8\u534a\u5f84\u63d0\u5347: [[YELLOW]]+{0}
Mining.Blast.Rank=\u7206\u7834\u5f00\u91c7: [[YELLOW]] \u6392\u540d {0}/8 [[GRAY]]({1})
Mining.Blast.Other.On=Mining.Blast.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u7206\u7834\u5f00\u91c7!
Mining.Blast.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u7206\u7834\u5f00\u91c7 [[GREEN]]\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!
Repair.SubSkill.Repair.Name=\u4fee\u7406
Repair.SubSkill.Repair.Description=\u4fee\u7406\u5de5\u5177\u548c\u88c5\u5907
Repair.SubSkill.GoldRepair.Name=\u4fee\u7406\u9ec4\u91d1 ({0}+ SKILL)
Repair.SubSkill.GoldRepair.Description=\u4fee\u7406\u9ec4\u91d1\u5de5\u5177\u548c\u88c5\u5907
Repair.SubSkill.IronRepair.Name=\u4fee\u7406\u94c1\u8d28\u7269\u54c1 ({0}+ SKILL)
Repair.SubSkill.IronRepair.Description=\u4fee\u7406\u94c1\u8d28\u5de5\u5177\u548c\u62a4\u7532
Repair.SubSkill.StoneRepair.Name=\u4fee\u7406\u77f3\u5934\u7269\u54c1 ({0}+ SKILL)
Repair.SubSkill.StoneRepair.Description=\u4fee\u7406\u77f3\u5934\u5de5\u5177
Repair.SubSkill.RepairMastery.Name=\u4fee\u7406\u7cbe\u901a
Repair.SubSkill.RepairMastery.Description=\u5df2\u589e\u52a0\u4fee\u7406\u6570\u91cf
Repair.SubSkill.SuperRepair.Name=\u8d85\u7ea7\u4fee\u7406
Repair.SubSkill.SuperRepair.Description=\u53cc\u500d\u6548\u679c
Repair.SubSkill.DiamondRepair.Name=\u94bb\u77f3\u4fee\u7406 ({0}+ SKILL)
Repair.SubSkill.DiamondRepair.Description=\u4fee\u7406\u94bb\u77f3\u5de5\u5177\u548c\u88c5\u5907
Repair.SubSkill.ArcaneForging.Name=\u79d8\u6cd5\u953b\u9020
Repair.SubSkill.ArcaneForging.Description=\u4fee\u7406\u9644\u9b54\u7269\u54c1
Repair.Error=[[DARK_RED]]mcMMO \u5728\u5c1d\u8bd5\u4fee\u7406\u6b64\u7269\u54c1\u65f6\u53d1\u751f\u4e86\u9519\u8bef!
Repair.Listener.Anvil=[[DARK_RED]]\u4f60\u653e\u7f6e\u7684\u94c1\u65b9\u5757\u53ef\u4ee5\u7528\u6765\u4fee\u7406\u5de5\u5177\u548c\u9632\u5177.
Repair.Listener=\u4fee\u7406\uff1a
Repair.SkillName=\u4fee\u7406
Repair.Skills.AdeptDiamond=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u94bb\u77f3\u88c5\u5907.
Repair.Skills.AdeptGold=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u7406\u9ec4\u91d1\u88c5\u5907.
Repair.Skills.AdeptIron=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u4e0d\u8db3\u4ee5\u4fee\u590d\u94c1\u8d28\u88c5\u5907.
Repair.Skills.AdeptStone=[[DARK_RED]]\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fee\u590d\u77f3\u5934\u88c5\u5907
Repair.Skills.Adept=\u4f60\u5fc5\u987b\u8fbe\u5230\u7b49\u7ea7 [[YELLOW]]{0}[[RED]] \u624d\u80fd\u4fee\u7406 [[YELLOW]]{1}
Repair.Skills.FeltEasy=[[GRAY]]\u90a3\u770b\u8d77\u6765\u5f88\u7b80\u5355.
Repair.Skills.FullDurability=[[GRAY]]\u4f60\u7684\u88c5\u5907\u5df2\u7ecf\u6ee1\u8010\u4e45\u5ea6\u4e86
Repair.Skills.Mastery=\u4fee\u7406\u7cbe\u901a: [[YELLOW]]\u989d\u5916\u56de\u590d {0} \u8010\u4e45\u5ea6
Repair.Skills.StackedItems=[[DARK_RED]]\u4f60\u65e0\u6cd5\u4fee\u7406\u5df2\u53e0\u52a0\u7684\u7269\u54c1.
Repair.Skills.Super.Chance=\u8d85\u7ea7\u4fee\u7406\u51e0\u7387: [[YELLOW]]{0}
Repair.Skillup=\u4fee\u7406\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u5171 ({1})
Repair.Pretty.Name=\u4fee\u7406
Repair.Arcane.Chance.Downgrade=[[GRAY]]\u9644\u9b54\u964d\u7ea7\u51e0\u7387: [[YELLOW]]{0}%
Repair.Arcane.Chance.Success=[[GRAY]]\u795e\u79d8\u953b\u9020\u6210\u529f\u7387: [[YELLOW]]{0}%
Repair.Arcane.Downgrade=\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u7b49\u7ea7\u5df2\u4e0b\u964d.
Repair.Arcane.Fail=\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54\u5df2\u6d88\u5931.
Repair.Arcane.Lost=\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u4fdd\u7559\u9644\u9b54\u5c5e\u6027.
Repair.Arcane.Perfect=[[GREEN]]\u4f60\u6210\u529f\u5730\u4fdd\u7559\u4e86\u8fd9\u4ef6\u7269\u54c1\u7684\u9644\u9b54.
Repair.Arcane.Rank=\u79d8\u6cd5\u953b\u9020: [[YELLOW]]\u7b49\u7ea7 {0}/4
Salvage.Pretty.Name=\u5206\u89e3
Salvage.SubSkill.AdvancedSalvage.Name=\u8fdb\u9636\u5206\u89e3
Salvage.SubSkill.AdvancedSalvage.Description=\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1
Salvage.SubSkill.ArcaneSalvaging.Name=\u795e\u79d8\u5206\u89e3
Salvage.SubSkill.ArcaneSalvaging.Description=\u4ece\u7269\u54c1\u4e2d\u62c6\u89e3\u51fa\u9644\u9b54
Salvage.Ability.Locked.0=\u80fd\u529b\u9501\u5b9a\u76f4\u81f3 {0}+ \u6280\u80fd\u7b49\u7ea7 (\u8fdb\u9636\u5206\u89e3)
Salvage.Ability.Bonus.0=\u8fdb\u9636\u5206\u89e3
Salvage.Ability.Bonus.1=\u6700\u5927\u9650\u5ea6\u56de\u6536 {0} \u635f\u574f\u7684\u7269\u54c1
Salvage.Arcane.Rank=\u795e\u79d8\u5206\u89e3: [[YELLOW]]\u7b49\u7ea7 {0}/{1}
Salvage.Arcane.ExtractFull=[[GRAY]]\u5b8c\u5168\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387
Salvage.Arcane.ExtractPartial=[[GRAY]]\u90e8\u5206\u62c6\u89e3\u51fa\u9644\u9b54\u51e0\u7387
Salvage.Skills.Success=[[GREEN]]\u7269\u54c1\u5df2\u5206\u89e3\uff01
Salvage.Skills.Adept.Damaged=[[DARK_RED]]\u60a8\u7684\u6280\u80fd\u7b49\u7ea7\u4e0d\u8db3\u4ee5\u5206\u89e3\u635f\u574f\u7684\u7269\u54c1\u3002
Salvage.Skills.Adept.Level=\u60a8\u5fc5\u987b\u8fbe\u5230 [[YELLOW]]{0}[[RED]] \u7ea7\u624d\u80fd\u5206\u89e3 [[YELLOW]]{1}
Salvage.Skills.TooDamaged=[[DARK_RED]]\u8be5\u7269\u54c1\u635f\u574f\u8fc7\u4e8e\u4e25\u91cd\uff0c\u65e0\u6cd5\u5206\u89e3\u3002
Salvage.Skills.ArcaneFailed=\u60a8\u65e0\u6cd5\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u77e5\u8bc6\u3002
Salvage.Skills.ArcanePartial=\u60a8\u53ea\u80fd\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u8574\u542b\u7684\u90e8\u5206\u77e5\u8bc6\u3002
Salvage.Skills.ArcaneSuccess=[[GREEN]]\u60a8\u80fd\u591f\u5b8c\u5168\u62c6\u89e3\u51fa\u672c\u7269\u54c1\u6240\u542b\u7684\u77e5\u8bc6\uff01
Salvage.Listener.Anvil=[[DARK_RED]]\u60a8\u5df2\u7ecf\u653e\u7f6e\u4e86\u4e00\u4e2a\u5206\u89e3\u7827\uff0c\u4f7f\u7528\u5b83\u6765\u5206\u89e3\u5de5\u5177\u548c\u62a4\u7532\u3002
Salvage.Listener=\u5206\u89e3:
Salvage.SkillName=\u5206\u89e3
Anvil.Unbreakable=\u8be5\u7269\u54c1\u662f\u65e0\u6cd5\u7834\u574f\u7684\uff01
Swords.Ability.Lower=[[GRAY]]**\u4f60\u6536\u597d\u4e86\u4f60\u7684\u5251**
Swords.Ability.Ready=[[GREEN]]**\u4f60\u628a\u5251\u7d27\u63e1\u5728\u4e86\u624b\u4e2d**
Swords.Combat.Bleed.Chance=\u653e\u8840\u51e0\u7387: [[YELLOW]]{0}
Swords.Combat.Bleed.Length=\u6d41\u8840\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0} ticks
Swords.Combat.Bleed.Note=[[GRAY]]\u6ce8\u610f: [[YELLOW]]\u6bcf\u4e24\u79d2\u51cf\u4e00\u6ef4\u8840
Swords.Combat.Bleeding.Started=[[DARK_RED]] \u4f60\u6b63\u5728\u6d41\u8840!
Swords.Combat.Bleeding.Stopped=[[GRAY]]\u653e\u8840 [[GREEN]]\u5df2\u505c\u6b62[[GRAY]]!
Swords.Combat.Bleeding=[[GREEN]]**\u654c\u4eba\u6b63\u5728\u4e0d\u65ad\u6d41\u8840**
Swords.Combat.Counter.Chance=\u53cd\u51fb\u51e0\u7387: [[YELLOW]]{0}
Swords.Combat.Counter.Hit=[[DARK_RED]]\u4f60\u53cd\u51fb\u4e86\u5bf9\u624b!
Swords.Combat.Countered=[[GREEN]]**\u53cd\u51fb\u4e86\u654c\u4eba**
Swords.Combat.SS.Struck=[[DARK_RED]]\u53d1\u52a8\u5229\u5203\u7a81\u523a!
Swords.SubSkill.CounterAttack.Name=\u53cd\u51fb
Swords.SubSkill.CounterAttack.Description=\u683c\u6863\u65f6\u53cd\u5f39{0}\u4f24\u5bb3\u503c
Swords.SubSkill.SerratedStrikes.Name=\u5229\u5203\u7a81\u523a (\u4e3b\u52a8\u6280\u80fd)
Swords.SubSkill.SerratedStrikes.Description={0} \u653b\u51fb\u8303\u56f4, \u653e\u8840\u8303\u56f4
Swords.Effect.4=\u5229\u5203\u7a81\u523a \u6d41\u8840\u4f24\u5bb3\u589e\u52a0
Swords.Effect.5={0} \u6b21 \u6d41\u8840
Swords.SubSkill.Bleed.Name=\u653e\u8840
Swords.SubSkill.Bleed.Description=\u4ea7\u751f\u653e\u8840\u4f24\u5bb3
Swords.Listener=\u5251\u672f(Swords):
Swords.SkillName=\u5251\u672f
Swords.Skills.SS.Off=**\u5229\u5203\u7a81\u523a\u5df2\u7ecf\u7ed3\u675f\u4e86**
Swords.Skills.SS.On=[[GREEN]]**\u5229\u5203\u7a81\u523a\u542f\u52a8**
Swords.Skills.SS.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u5229\u5203\u7a81\u523a [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
Swords.Skills.SS.Other.Off=\u5229\u5203\u7a81\u523a[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Swords.Skills.SS.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u5229\u5203\u7a81\u523a!
Swords.Skillup=\u5251\u672f\u6280\u80fd\u7b49\u7ea7\u4e0a\u5347 {0}. \u73b0\u5728\u662f ({1})
Swords.SS.Length=\u952f\u9f7f\u5229\u5203\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Taming.Ability.Bonus.0=\u73af\u5883\u611f\u77e5
Taming.Ability.Bonus.1=\u72fc\u4f1a\u907f\u514d\u5371\u9669
Taming.Ability.Bonus.2=\u539a\u5b9e\u7684\u76ae\u6bdb
Taming.Ability.Bonus.3=1/{0} \u4f24\u5bb3, \u706b\u7130\u62b5\u6297
Taming.Ability.Bonus.4=\u51b2\u51fb\u62b5\u6297
Taming.Ability.Bonus.5=\u7206\u70b8\u9020\u6210 1/{0} \u666e\u901a\u4f24\u5bb3
Taming.Ability.Bonus.6=\u5229\u722a
Taming.Ability.Bonus.7=+{0} \u4f24\u5bb3
Taming.Ability.Bonus.8=\u5feb\u9910\u670d\u52a1
Taming.Ability.Bonus.9={0} \u7684\u51e0\u7387\u653b\u51fb\u65f6\u56de\u8840
Taming.Ability.Bonus.10=\u72ac\u795e\u7684\u5e87\u62a4
Taming.Ability.Bonus.11=\u53d7\u5230\u9b54\u6cd5\u6216\u4e2d\u6bd2\u4f24\u5bb3\u65f6\u6062\u590d\u751f\u547d\u503c
Taming.Ability.Locked.0={0}+ \u7ea7\u540e\u89e3\u9501 (\u73af\u5883\u611f\u77e5)
Taming.Ability.Locked.1=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u539a\u5b9e\u7684\u76ae\u6bdb)
Taming.Ability.Locked.2=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u51b2\u51fb\u62b5\u6297)
Taming.Ability.Locked.3=\u9501\u5b9a\u76f4\u5230 {0}+ \u6280\u80fd (\u5229\u722a)
Taming.Ability.Locked.4={0}+ \u7ea7\u540e\u89e3\u9501 (FAST FOOD SERVICE)
Taming.Ability.Locked.5={0}+ \u7ea7\u540e\u89e3\u9501 (\u72ac\u795e\u7684\u5e87\u62a4)
Taming.Combat.Chance.Gore=\u55dc\u8840\u51e0\u7387: [[YELLOW]]{0}
Taming.SubSkill.BeastLore.Name=\u9a6f\u517d\u77e5\u8bc6
Taming.SubSkill.BeastLore.Description=\u7528\u9aa8\u5934\u53f3\u952e\u5355\u51fb\u72fc\u6216\u8005\u8c79\u732b\u4ee5\u68c0\u67e5\u5b83\u4eec\u7684\u72b6\u51b5
Taming.SubSkill.ShockProof.Name=\u51b2\u51fb\u62b5\u6297
Taming.SubSkill.ShockProof.Description=\u7206\u70b8\u4f24\u5bb3\u51cf\u5c11
Taming.SubSkill.CallOfTheWild.Name=\u91ce\u6027\u547c\u5524
Taming.SubSkill.CallOfTheWild.Description=\u4e3a\u4f60\u53ec\u5524\u4e00\u53ea\u5ba0\u7269
Taming.SubSkill.CallOfTheWild.Description.2=[[GRAY]]\u53ec\u5524 (\u8c79\u732b): \u624b\u91cc\u62ff\u7740 {0} \u6761\u9c7c,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
Taming.Effect.15=[[GRAY]]\u53ec\u5524 (\u72fc): \u624b\u91cc\u62ff\u7740 {0} \u6839\u9aa8\u5934,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
Taming.SubSkill.Gore.Name0=[[GRAY]]\u53ec\u5524 (\u9a6c): \u624b\u91cc\u62ff\u7740 {0} \u4e2a\u82f9\u679c,\u6309\u4f4f\u6f5c\u884c\u540c\u65f6\u5355\u51fb\u5de6\u952e\u53ec\u5524.
Taming.SubSkill.FastFoodService.Name=\u5feb\u9910\u670d\u52a1
Taming.SubSkill.FastFoodService.Description=\u4e00\u5b9a\u51e0\u7387\u4f7f\u72fc\u5728\u653b\u51fb\u65f6\u56de\u590d\u81ea\u8eab\u8840\u91cf
Taming.SubSkill.HolyHound.Name=\u72ac\u795e\u7684\u5e87\u62a4
Taming.SubSkill.HolyHound.Description=\u5df2\u88ab\u9b54\u6cd5 & \u4e2d\u6bd2\u6548\u679c\u6cbb\u6108
Taming.SubSkill.Gore.Name=\u55dc\u8840
Taming.SubSkill.Gore.Description=\u81f4\u547d\u653b\u51fb\u4f1a\u7ed9\u76ee\u6807\u653e\u8840
Taming.SubSkill.SharpenedClaws.Name=\u5229\u722a
Taming.SubSkill.SharpenedClaws.Description=\u4f24\u5bb3\u5956\u52b1
Taming.SubSkill.EnvironmentallyAware.Name=\u73af\u5883\u611f\u77e5
Taming.SubSkill.EnvironmentallyAware.Description=\u4ed9\u4eba\u638c/\u5ca9\u6d46 \u6050\u60e7\u75c7, \u514d\u75ab\u6389\u843d\u4f24\u5bb3
Taming.SubSkill.ThickFur.Name=\u539a\u5b9e\u7684\u76ae\u6bdb
Taming.SubSkill.ThickFur.Description=\u524a\u51cf\u53d7\u5230\u7684\u4f24\u5bb3, \u706b\u7130\u62b5\u6297
Taming.Listener.Wolf=[[DARK_GRAY]]\u4f60\u7684\u72fc\u98de\u901f\u5730\u8dd1\u56de\u4e86\u4f60\u8eab\u8fb9...
Taming.Listener=\u9a6f\u517d(Taming):
Taming.SkillName=\u9a6f\u517d
Taming.Skillup=\u9a6f\u517d\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u5171 ({1})
Taming.Summon.Complete=[[GREEN]]\u53ec\u5524\u5b8c\u6bd5
Taming.Summon.Fail.Ocelot=\u4f60\u4e0d\u80fd\u53ec\u5524\u8c79\u732b\u56e0\u4e3a\u4f60\u53ec\u5524\u4e86\u592a\u591a\u4e86.
Taming.Summon.Fail.Wolf=\u4f60\u8eab\u8fb9\u5df2\u7ecf\u62e5\u6709\u8db3\u591f\u591a\u7684\u72fc,\u65e0\u6cd5\u53ec\u5524\u66f4\u591a.
Taming.Summon.Fail.Horse=\u4f60\u8eab\u8fb9\u5df2\u7ecf\u62e5\u6709\u8db3\u591f\u591a\u7684\u9a6c\u4e86,\u65e0\u6cd5\u53ec\u5524.
Taming.Summon.Name.Format={0}\u7684 {1}
Unarmed.Ability.Berserk.Length=\u72c2\u66b4\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}s
Unarmed.Ability.Bonus.0=\u94c1\u8155\u6a21\u5f0f
Unarmed.Ability.Bonus.1=\u589e\u52a0{0}\u70b9\u4f24\u5bb3
Unarmed.Ability.Chance.ArrowDeflect=\u7bad\u77e2\u504f\u5411\u51e0\u7387: [[YELLOW]]{0}
Unarmed.Ability.Chance.Disarm=\u7f34\u68b0\u51e0\u7387: [[YELLOW]]{0}
Unarmed.Ability.Chance.IronGrip=\u8d85\u5f3a\u63e1\u529b\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
Unarmed.Ability.IronGrip.Attacker=\u4f60\u7684\u5bf9\u624b\u6709\u8d85\u5f3a\u63e1\u529b!
Unarmed.Ability.IronGrip.Defender=[[GREEN]]\u4f60\u7684\u8d85\u5f3a\u63e1\u529b\u62b5\u6321\u4f4f\u4e86\u5bf9\u65b9\u7684\u7f34\u68b0\u653b\u51fb!
Unarmed.Ability.Lower=[[GRAY]]**\u4f60\u653e\u4e0b\u4e86\u4f60\u7684\u62f3\u5934**
Unarmed.Ability.Ready=[[GREEN]]**\u4f60\u63e1\u7d27\u4e86\u4f60\u7684\u62f3\u5934**
Unarmed.SubSkill.Berserk.Name=\u72c2\u66b4 (\u4e3b\u52a8\u6280\u80fd)
Unarmed.SubSkill.Berserk.Description=+50% \u4f24\u5bb3, \u80fd\u7834\u574f\u786c\u5ea6\u4f4e\u7684\u65b9\u5757
Unarmed.SubSkill.Disarm.Name=\u7f34\u68b0 (\u4ec5\u9650\u73a9\u5bb6)
Unarmed.SubSkill.Disarm.Description=\u4f7f\u654c\u4eba\u624b\u4e2d\u6b66\u5668\u6389\u843d
Unarmed.SubSkill.IronArmStyle.Name=\u94c1\u8155\u6a21\u5f0f
Unarmed.SubSkill.IronArmStyle.Description=\u4f7f\u4f60\u7684\u62a4\u7532\u968f\u65f6\u95f4\u589e\u52a0\u800c\u589e\u5f3a
Unarmed.SubSkill.ArrowDeflect.Name=\u7bad\u77e2\u504f\u5411
Unarmed.SubSkill.ArrowDeflect.Description=\u8ba9\u7bad\u77e2\u504f\u5411
Unarmed.SubSkill.IronGrip.Name=\u8d85\u5f3a\u63e1\u529b
Unarmed.SubSkill.IronGrip.Description=\u9632\u6b62\u4f60\u88ab\u7f34\u68b0
Unarmed.Listener=\u683c\u6597(Unarmed):
Unarmed.SkillName=\u683c\u6597
Unarmed.Skills.Berserk.Off=**\u72c2\u66b4\u6280\u80fd\u5df2\u7ed3\u675f**
Unarmed.Skills.Berserk.On=[[GREEN]]**\u72c2\u66b4\u6fc0\u6d3b**
Unarmed.Skills.Berserk.Other.Off=\u72c2\u66b4[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Unarmed.Skills.Berserk.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u72c2\u66b4!
Unarmed.Skills.Berserk.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u72c2\u66b4 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86!
Unarmed.Skillup=\u683c\u6597\u6280\u80fd\u4e0a\u5347\u4e86 {0}. \u603b\u7b49\u7ea7 ({1})
Woodcutting.Ability.0=\u79cb\u98ce\u626b\u843d\u53f6
Woodcutting.Ability.1=\u626b\u9664\u6811\u53f6
Woodcutting.Ability.Chance.DDrop=\u53cc\u500d\u6389\u843d\u51e0\u7387: [[YELLOW]]{0}
Woodcutting.Ability.Length=\u6811\u6728\u780d\u4f10\u8005\u6301\u7eed\u65f6\u95f4: [[YELLOW]]{0}\u79d2
Woodcutting.Ability.Locked.0=\u9501\u5b9a\u72b6\u6001,\u76f4\u5230 {0}+ \u6280\u80fd (\u5439\u53f6\u673a)
Woodcutting.SubSkill.TreeFeller.Name=\u7cbe\u9510\u4f10\u6728\u5de5(\u6280\u80fd)
Woodcutting.SubSkill.TreeFeller.Description=\u7206\u53d1\u5f0f\u7684\u780d\u6811
Woodcutting.SubSkill.LeafBlower.Name=\u4e71\u780d\u65e0\u53cc
Woodcutting.SubSkill.LeafBlower.Description=\u626b\u9664\u6811\u53f6
Woodcutting.SubSkill.HarvestLumber.Name=\u53cc\u500d\u6389\u843d
Woodcutting.SubSkill.HarvestLumber.Description=\u53cc\u500d\u6389\u843d\u7269\u54c1
Woodcutting.Listener=\u4f10\u6728(Woodcutting):
Woodcutting.SkillName=\u4f10\u6728
Woodcutting.Skills.TreeFeller.Off=**\u4f10\u6728\u6280\u80fd\u5df2\u7ed3\u675f**
Woodcutting.Skills.TreeFeller.On=[[GREEN]]**\u4f10\u6728\u6280\u80fd\u6fc0\u6d3b**
Woodcutting.Skills.TreeFeller.Refresh=[[GREEN]]\u4f60\u7684 [[YELLOW]]\u4f10\u6728 [[GREEN]]\u6280\u80fd\u5df2\u7ecf\u53ef\u4ee5\u4f7f\u7528\u4e86\uff01
Woodcutting.Skills.TreeFeller.Other.Off=\u4f10\u6728\u6280\u80fd[[GREEN]] \u5df2\u7ecf\u7ed3\u675f\u4e86 [[YELLOW]]{0}
Woodcutting.Skills.TreeFeller.Other.On=[[GREEN]]{0}[[DARK_GREEN]] \u4f7f\u7528\u4e86 [[RED]]\u4f10\u6728\u6280\u80fd!
Woodcutting.Skills.TreeFeller.Splinter=\u4f60\u7684\u65a7\u5934\u53d8\u6210\u4e86\u4e00\u5806\u788e\u7247\uff01
Woodcutting.Skills.TreeFeller.Threshold=\u90a3\u68f5\u6811\u592a\u5927\u4e86!
Woodcutting.Skillup=\u4f10\u6728\u6280\u80fd\u63d0\u5347 {0}. \u603b\u5171 ({1})
Ability.Generic.Refresh=[[GREEN]]**\u6280\u80fd\u51b7\u5374\u5b8c\u6bd5!**
Ability.Generic.Template.Lock=[[GRAY]]{0}
Ability.Generic.Template=[[GOLD]]{0}: [[DARK_AQUA]]{1}
Combat.ArrowDeflect=[[WHITE]]**\u7bad\u77e2\u504f\u5411**
Combat.BeastLore=[[GREEN]]**\u9a6f\u517d\u77e5\u8bc6**
Combat.BeastLoreHealth=[[DARK_AQUA]]\u751f\u547d\u503c ([[GREEN]]{0}[[DARK_AQUA]]/{1})
Combat.BeastLoreOwner=[[DARK_AQUA]]\u62e5\u6709\u8005 ([[RED]]{0}[[DARK_AQUA]])
Combat.Gore=[[GREEN]]**\u76ee\u6807\u88ab\u653e\u8840**
Combat.StruckByGore=**\u4f60\u88ab\u653e\u8840\u4e86**
Combat.TargetDazed=\u76ee\u6807\u88ab [[DARK_RED]]\u88ab\u51fb\u6655
Combat.TouchedFuzzy=[[DARK_RED]]\u5934\u6655\u76ee\u7729
mcMMO.Description=[[DARK_AQUA]]\u5173\u4e8e [[YELLOW]]mcMMO[[DARK_AQUA]]:,[[GOLD]]mcMMO \u662f\u4e00\u4e2a [[RED]]\u5f00\u6e90[[GOLD]] RPG mod \u521b\u5efa\u4e8e2011\u5e742\u6708,[[GOLD]]by [[BLUE]]com.gmail.nossr50[[GOLD]]. \u76ee\u6807\u4e3a\u73a9\u5bb6\u63d0\u4f9b\u4e00\u4e2a\u9ad8\u8d28\u91cf\u7684RPG\u4f53\u9a8c.,[[DARK_AQUA]]\u63d0\u793a:,[[GOLD]] - [[GREEN]]\u4f7f\u7528 [[RED]]/mcmmo help[[GREEN]] \u67e5\u770b\u6307\u4ee4,[[GOLD]] - [[GREEN]]\u8f93\u5165 [[RED]]/\u6280\u80fd\u540d[[GREEN]] \u67e5\u770b\u8be6\u7ec6\u7684\u6280\u80fd\u4fe1\u606f,[[DARK_AQUA]]\u5f00\u53d1\u8005:,[[GOLD]] - [[GREEN]]com.gmail.nossr50 [[BLUE]](\u521b\u59cb\u4eba),[[GOLD]] - [[GREEN]]GJ [[BLUE]](\u9879\u76ee\u7ec4\u957f),[[GOLD]] - [[GREEN]]NuclearW [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]bm01 [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]TfT_02 [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]Glitchfinder [[BLUE]](\u5f00\u53d1\u8005),[[GOLD]] - [[GREEN]]t00thpick1 [[BLUE]](\u5f00\u53d1\u8005),[[DARK_AQUA]]\u6709\u7528\u7684\u94fe\u63a5:,[[GOLD]] - [[GREEN]]https://github.com/mcMMO-Dev/mcMMO/issues[[GOLD]] \u62a5\u544aBUG,[[GOLD]] - [[GREEN]]#mcmmo @ irc.esper.net[[GOLD]] IRC Chat,[[YELLOW]]\u53c2\u4e0e\u8fc7\u7ffb\u8bd1\u4e0e\u6da6\u8272\u7684\u4eba[[DARK_AQUA]]:,[[GREEN]]hzk11o11k11o wolski Chikaze(Cirno) 664365842 zesty HDfunctions CNAmira,[[DARK_AQUA]]\u4fee\u6b63\u8865\u6f0f\u5de5\u4f5c\u8fd8\u5728\u7ee7\u7eed...
Commands.addlevels.AwardAll.1=[[GREEN]]\u4f60\u7684\u6240\u6709\u7b49\u7ea7\u88ab\u5956\u52b1\u4e0a\u5347\u4e86 {0} \u7ea7!
Commands.addlevels.AwardAll.2=\u6240\u6709\u6280\u80fd\u7b49\u7ea7\u5df2\u88ab\u8bbe\u7f6e\u4e3a {0}.
Commands.addlevels.AwardSkill.1=[[GREEN]]\u4f60\u5728 {1} \u91cc\u5347\u4e86 {0} \u7ea7!
Commands.addlevels.AwardSkill.2={0} \u56e0\u4e3a {1} \u800c\u88ab\u4fee\u6539.
Commands.addxp.AwardAll=[[GREEN]]\u4f60\u7684\u6240\u6709\u6280\u80fd\u83b7\u5f97 {0} \u70b9\u7ecf\u9a8c!
Commands.addxp.AwardSkill=[[GREEN]]\u4f60\u5728 {1} \u88ab\u5956\u52b1\u4e86 {0} \u70b9\u7ecf\u9a8c!
Commands.Ability.Off=\u6280\u80fd\u4f7f\u7528 [[GREEN]]\u5173\u95ed
Commands.Ability.On=\u6280\u80fd\u4f7f\u7528 [[GREEN]]\u5f00\u542f
Commands.Ability.Toggle=\u6280\u80fd\u4f7f\u7528\u5df2\u5207\u6362\u4e3a [[YELLOW]]{0}
Commands.AdminChat.Off=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f [[RED]]\u5173\u95ed
Commands.AdminChat.On=\u4ec5\u7ba1\u7406\u804a\u5929\u6a21\u5f0f [[GREEN]]\u5f00\u542f
Commands.AdminToggle=- \u5207\u6362\u7ba1\u7406\u5458\u804a\u5929
Commands.Chat.Console=*\u63a7\u5236\u53f0*
Commands.Cooldowns.Header=[[GOLD]]--= [[GREEN]]mcMMO \u80fd\u529b\u51b7\u5374[[GOLD]] =--
Commands.Cooldowns.Row.N=\ [[RED]]{0}[[WHITE]] - \u5269\u4f59 [[GOLD]]{1} \u79d2
Commands.Cooldowns.Row.Y=\ [[AQUA]]{0}[[WHITE]] - [[DARK_GREEN]]\u5df2\u5c31\u7eea\uff01
Commands.Database.Cooldown=\u518d\u6b21\u4f7f\u7528\u8fd9\u4e2a\u547d\u4ee4\u8fd8\u9700\u8981\u7b49\u5f851\u79d2.
Commands.Disabled=\u8fd9\u4e2a\u6307\u4ee4\u88ab\u7981\u7528\u4e86.
Commands.DoesNotExist=\u8be5\u540d\u73a9\u5bb6\u4e0d\u5b58\u5728\u4e8e\u6570\u636e\u5e93\u4e2d\uff01
Commands.GodMode.Disabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u5173\u95ed
Commands.GodMode.Enabled=mcMMO \u4e0a\u5e1d\u6a21\u5f0f\u5f00\u542f
Commands.GodMode.Forbidden=[mcMMO] \u4e0a\u5e1d\u6a21\u5f0f\u4e0d\u5141\u8bb8\u5728\u8fd9\u4e2a\u4e16\u754c\u5f00\u542f (\u8be6\u60c5\u8bf7\u770b\u6743\u9650\u914d\u7f6e)
Commands.GodMode.Toggle=\u4e0a\u5e1d\u6a21\u5f0f\u5df2\u5207\u6362\u4e3a [[YELLOW]]{0}
Commands.Healthbars.Changed.HEARTS=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a [[RED]]\u5fc3\u5f62[[WHITE]].
Commands.Healthbars.Changed.BAR=[mcMMO] \u4f60\u7684\u8840\u6761\u663e\u793a\u7c7b\u578b\u5df2\u66f4\u6539\u4e3a [[RED]]\u65b9\u5f62[[WHITE]].
Commands.Healthbars.Changed.DISABLED=[mcMMO] \u4f60\u7684\u602a\u7269\u8840\u6761\u663e\u793a\u5df2\u88ab [[GRAY]]\u7981\u7528[[WHITE]].
Commands.Healthbars.Invalid=\u65e0\u6548\u7684\u8840\u6761\u7c7b\u578b!
Commands.Inspect=<player> [[RED]]-\u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u4fe1\u606f
Commands.Party.Invite.Accepted=[[GREEN]]\u63a5\u53d7\u9080\u8bf7,\u4f60\u6210\u4e3a\u4e86\u961f\u4f0d {0} \u4e2d\u7684\u4e00\u5458.
Commands.Invite.Success=[[GREEN]]\u9080\u8bf7\u53d1\u9001\u6210\u529f.
Commands.Leaderboards=<skill> <page> [[RED]]- \u6392\u884c\u699c
Commands.mcc.Header=---[][[YELLOW]]mcMMO \u6307\u4ee4[[RED]][]---
Commands.mcgod=- \u5207\u6362\u4e0a\u5e1d\u6a21\u5f0f
Commands.mchud.Invalid=\u90a3\u5e76\u4e0d\u662f\u53ef\u7528\u7684HUD\u7c7b\u578b.
Commands.mcpurge.Success=[[GREEN]]\u6570\u636e\u5df2\u91cd\u7f6e!
Commands.mcrank.Heading=[[GOLD]]-=\u4e2a\u4eba\u6392\u540d=-
Commands.mcrank.Overall=\u7efc\u5408[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{0}
Commands.mcrank.Player=\u76ee\u6807: [[WHITE]]{0}
Commands.mcrank.Skill={0}[[GREEN]] - [[GOLD]]\u6392\u540d [[WHITE]]#[[GREEN]]{1}
Commands.mcrank.Unranked=[[WHITE]]\u65e0\u6392\u540d
Commands.mcrefresh.Success={0} \u7684\u51b7\u5374\u65f6\u95f4\u5df2\u5237\u65b0
Commands.mcremove.Success=[[GREEN]]{0} \u5df2\u4ece\u6570\u636e\u5e93\u4e2d\u6210\u529f\u79fb\u9664!
Commands.mctop.Tip=[[GOLD]]\u63d0\u793a: \u4f7f\u7528 [[RED]]/mcrank[[GOLD]] \u6765\u67e5\u770b\u4f60\u6240\u6709\u7684\u4e2a\u4eba\u6392\u540d!
Commands.mmoedit=[player] <skill> <newvalue> [[RED]] - \u7f16\u8f91\u76ee\u6807
Commands.mmoedit.AllSkills.1=[[GREEN]]\u4f60\u7684\u6240\u6709\u6280\u80fd\u7b49\u7ea7\u8bbe\u7f6e\u4e3a {0}!
Commands.mmoedit.Modified.1=[[GREEN]]\u4f60\u7684\u7b49\u7ea7 {0} \u88ab\u8bbe\u7f6e\u4e3a {1}!
Commands.mmoedit.Modified.2={0} \u5df2\u66f4\u6539\u4e3a {1}.
Commands.mcconvert.Database.Same=\u4f60\u5df2\u7ecf\u5728\u4f7f\u7528 {0} \u6570\u636e\u5e93!
Commands.mcconvert.Database.InvalidType={0} \u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6570\u636e\u5e93\u7c7b\u578b.
Commands.mcconvert.Database.Start=[[GRAY]]\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u81f3{1}...
Commands.mcconvert.Database.Finish=[[GRAY]]\u6570\u636e\u5e93\u8fc1\u79fb\u5b8c\u6210; {1}\u6570\u636e\u5e93\u73b0\u5728\u62e5\u6709{0}\u6570\u636e\u5e93\u7684\u6240\u6709\u6570\u636e.
Commands.mmoshowdb=\u5f53\u524d\u4f7f\u7528\u7684\u6570\u636e\u5e93\u4e3a [[GREEN]]{0}
Commands.mcconvert.Experience.Invalid=\u9519\u8bef\u7684\u516c\u5f0f\u7c7b\u578b! \u6709\u6548\u7c7b\u578b\u4e3a: [[GREEN]]\u7ebf\u6027 [[RED]]\u548c [[GREEN]]\u6307\u6570.
Commands.mcconvert.Experience.Same=\u6b63\u5728\u4f7f\u7528\u516c\u5f0f{0}
Commands.mcconvert.Experience.Start=[[GRAY]]\u5f00\u59cb\u4ece{0}\u8f6c\u6362\u5230{1}\u66f2\u7ebf
Commands.mcconvert.Experience.Finish=[[GRAY]]\u516c\u5f0f\u8f6c\u6362\u5b8c\u6210; \u73b0\u5728\u4f7f\u7528 {0} \u7ecf\u9a8c\u66f2\u7ebf.
Commands.ModDescription=- \u8bf7\u9605\u8bfb\u7b80\u8981\u63d2\u4ef6\u63cf\u8ff0
Commands.NoConsole=\u8fd9\u4e2a\u6307\u4ee4\u4e0d\u652f\u6301\u5728\u63a7\u5236\u53f0\u4f7f\u7528.
Commands.Notifications.Off=\u6280\u80fd\u63d0\u793a [[RED]]\u5173\u95ed
Commands.Notifications.On=\u6280\u80fd\u63d0\u793a [[GREEN]]\u5f00\u542f
Commands.Offline=\u8fd9\u4e2a\u6307\u4ee4\u5bf9\u79bb\u7ebf\u73a9\u5bb6\u65e0\u6548
Commands.NotLoaded=\u73a9\u5bb6\u8d44\u6599\u5c1a\u672a\u52a0\u8f7d\u3002
Commands.Other=[[GREEN]]--\u5176\u4ed6\u547d\u4ee4--
Commands.Party.Header=-----[][[GREEN]]\u961f\u4f0d[[RED]][]-----
Commands.Party.Features.Header=-----[][[GREEN]]\u529f\u80fd[[RED]][]-----
Commands.Party.Status=[[DARK_GRAY]]\u540d\u5b57: [[WHITE]]{0} {1} [[DARK_GRAY]]\u7b49\u7ea7: [[DARK_AQUA]]{2}
Commands.Party.Status.Alliance=[[DARK_GRAY]]\u540c\u76df: [[WHITE]]{0}
Commands.Party.UnlockedFeatures=[[DARK_GRAY]]\u5df2\u89e3\u9501\u529f\u80fd: [[GRAY]][[ITALIC]]{0}
Commands.Party.ShareMode=[[DARK_GRAY]]\u5171\u4eab\u6a21\u5f0f:
Commands.Party.ItemShare=[[GRAY]]\u7269\u54c1 [[DARK_AQUA]]({0})
Commands.Party.ExpShare=[[GRAY]]\u7ecf\u9a8c [[DARK_AQUA]]({0})
Commands.Party.ItemShareCategories=[[DARK_GRAY]]\u7269\u54c1\u5206\u914d: [[GRAY]][[ITALIC]]{0}
Commands.Party.MembersNear=[[DARK_GRAY]]\u4f60\u9644\u8fd1 [[DARK_AQUA]]{0}[[DARK_GRAY]]/[[DARK_AQUA]]{1}
Commands.Party.Accept=- \u63a5\u53d7\u961f\u4f0d\u9080\u8bf7
Commands.Party.Chat.Off=\u53ea\u5141\u8bb8\u961f\u4f0d\u804a\u5929 [[RED]]\u5173\u95ed
Commands.Party.Chat.On=\u56e2\u961f\u804a\u5929 [[GREEN]]\u5f00\u542f
Commands.Party.Commands=[[GREEN]]--\u7ec4\u961f\u547d\u4ee4--
Commands.Party.Invite.0=\u6ce8\u610f: [[GREEN]]\u4f60\u6536\u5230\u4e86\u4e00\u4e2a\u7ec4\u961f\u9080\u8bf7 {0} \u6765\u81ea {1}
Commands.Party.Invite.1=\u8f93\u5165 [[GREEN]]/party accept[[YELLOW]] \u6765\u63a5\u53d7\u9080\u8bf7
Commands.Party.Invite=- \u53d1\u9001\u7ec4\u961f\u9080\u8bf7
Commands.Party.Invite.Accepted=[[GREEN]]\u5df2\u63a5\u53d7\u7ec4\u961f\u9080\u8bf7\u3002\u60a8\u5df2\u7ecf\u52a0\u5165\u961f\u4f0d {0}
Commands.Party.Join=[[GRAY]]\u52a0\u5165\u7684\u961f\u4f0d: {0}
Commands.Party.Create=[[GRAY]]\u5df2\u521b\u5efa\u961f\u4f0d: {0}
Commands.Party.Rename=[[GRAY]]\u961f\u4f0d\u540d\u53d8\u66f4\u4e3a: [[WHITE]]{0}
Commands.Party.SetSharing=[[GRAY]]\u961f\u4f0d {0} \u5171\u4eab\u8bbe\u7f6e\u4e3a: [[DARK_AQUA]]{1}
Commands.Party.ToggleShareCategory=[[GRAY]]\u961f\u4f0d\u7269\u54c1\u5206\u914d\u7531 [[GOLD]]{0} [[GRAY]] \u53d8\u4e3a [[DARK_AQUA]]{1}
Commands.Party.AlreadyExists=[[DARK_RED]]\u961f\u4f0d {0} \u5df2\u5b58\u5728!
Commands.Party.Kick=\u4f60\u5df2\u88ab {0} \u8e22\u51fa!
Commands.Party.Leave=\u4f60\u79bb\u5f00\u4e86\u8fd9\u652f\u961f\u4f0d
Commands.Party.Members.Header=-----[][[GREEN]]\u6210\u5458[[RED]][]-----
Commands.Party.None=\u4f60\u4e0d\u5728\u961f\u4f0d\u4e2d.
Commands.Party.Quit=- \u79bb\u5f00\u4f60\u73b0\u6709\u7684\u961f\u4f0d
Commands.Party.Teleport=<player> [[RED]]- \u4f20\u9001\u5230\u961f\u4f0d\u6210\u5458
Commands.Party.Toggle=- \u5207\u6362\u961f\u4f0d\u804a\u5929
Commands.Party1=- \u521b\u5efa\u4e00\u4e2a\u65b0\u961f\u4f0d
Commands.Party2=- \u52a0\u5165\u4e00\u4e2a\u73a9\u5bb6\u7684\u961f\u4f0d
Commands.Party.Alliance.Header=-----[][[GREEN]]\u961f\u4f0d\u540c\u76df[[RED]][]-----
Commands.Party.Alliance.Ally=[[WHITE]]{0} [[DARK_GRAY]]\u540c\u76df\u6709: [[WHITE]]{1}
Commands.Party.Alliance.Members.Header=-----[][[GREEN]]\u540c\u76df\u6210\u5458[[RED]][]-----
Commands.Party.Alliance.Invite.0=\u8b66\u544a: [[GREEN]]\u60a8\u4ece {1} \u6536\u5230\u961f\u4f0d\u540c\u76df\u9080\u8bf7\u6765 {0}
Commands.Party.Alliance.Invite.1=\u8f93\u5165 [[GREEN]]/party alliance accept[[YELLOW]] \u6765\u63a5\u53d7\u9080\u8bf7
Commands.Party.Alliance.Invite.Accepted=[[GREEN]]\u5df2\u63a5\u53d7\u540c\u76df\u9080\u8bf7\u3002
Commands.Party.Alliance.None=\u60a8\u6ca1\u6709\u540c\u76df\u3002
Commands.Party.Alliance.AlreadyAllies=\u60a8\u7684\u961f\u4f0d\u5df2\u7ecf\u6709\u4e00\u4e2a\u540c\u76df\u3002\u4f7f\u7528 [[DARK_AQUA]]/party alliance disband [[RED]]\u6765\u89e3\u6563
Commands.Party.Alliance.Help.0=\u8fd9\u4e2a\u961f\u4f0d\u6ca1\u6709\u7ec4\u6210\u540c\u76df\uff0c\u4f7f\u7528 [[DARK_AQUA]]/party alliance invite <player>[[RED]] \u9080\u8bf7
Commands.Party.Alliance.Help.1=\u5b83\u7684\u961f\u957f\u6765\u7ed3\u76df\u3002
Commands.ptp.Enabled=\u961f\u4f0d\u4f20\u9001 [[GREEN]]\u542f\u7528
Commands.ptp.Disabled=\u961f\u4f0d\u4f20\u9001 [[RED]]\u7981\u7528
Commands.ptp.NoRequests=\u5f53\u524d\u6ca1\u6709\u4f20\u9001\u8bf7\u6c42
Commands.ptp.NoWorldPermissions=[mcMMO] \u4f60\u6ca1\u6709\u6743\u9650\u4f20\u9001\u5230\u4e16\u754c {0}.
Commands.ptp.Request1={0} [[GREEN]]\u5df2\u7ecf\u5411\u4f60\u53d1\u51fa\u8bf7\u6c42\u4f20\u9001
Commands.ptp.Request2=[[GREEN]]\u540c\u610f\u4f20\u9001\u8f93\u5165 [[YELLOW]]/ptp accept. [[GREEN]]\u8bf7\u6c42\u5c06\u5728 [[RED]]{0} [[GREEN]] \u79d2\u540e\u5931\u6548
Commands.ptp.AcceptAny.Enabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 [[GREEN]]\u542f\u7528
Commands.ptp.AcceptAny.Disabled=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u786e\u8ba4 [[RED]]\u7981\u7528
Commands.ptp.RequestExpired=\u961f\u4f0d\u4f20\u9001\u8bf7\u6c42\u5df2\u5931\u6548!
Commands.PowerLevel.Leaderboard=--mcMMO[[BLUE]] \u6218\u6597\u529b [[YELLOW]]\u6392\u884c\u699c--
Commands.PowerLevel.Capped=[[DARK_RED]]\u6218\u6597\u529b: [[GREEN]]{0} [[DARK_RED]]\u6700\u9ad8\u7b49\u7ea7: [[YELLOW]]{1}
Commands.PowerLevel=[[DARK_RED]]\u6218\u6597\u529b: [[GREEN]]{0}
Commands.Reset.All=[[GREEN]]\u4f60\u7684\u6280\u672f\u6c34\u5e73\u5df2\u590d\u4f4d\u6210\u529f.
Commands.Reset.Single=[[GREEN]]\u4f60\u7684 {0} \u6280\u80fd\u7b49\u7ea7\u5df2\u6210\u529f\u91cd\u7f6e.
Commands.Reset=\u91cd\u7f6e\u6280\u80fd\u7b49\u7ea7\u4e3a0
Commands.Scoreboard.Clear=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5df2\u6e05\u7a7a\u3002
Commands.Scoreboard.NoBoard=mcMMO \u8bb0\u5206\u677f\u5f53\u524d\u672a\u6fc0\u6d3b\u3002
Commands.Scoreboard.Keep=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5c06\u60ac\u505c\u76f4\u5230\u60a8\u4f7f\u7528 [[GREEN]]/mcscoreboard clear[[DARK_AQUA]]\u3002
Commands.Scoreboard.Timer=[[DARK_AQUA]]mcMMO \u8bb0\u5206\u677f\u5c06\u5728 [[GOLD]]{0}[[DARK_AQUA]] \u79d2\u540e\u6e05\u7a7a\u3002
Commands.Scoreboard.Help.0=[[GOLD]] == [[RED]]/mcscoreboard [[GREEN]]\u5e2e\u52a9[[GOLD]] ==
Commands.Scoreboard.Help.1=[[DARK_AQUA]]/mcscoreboard[[AQUA]] clear [[WHITE]] - \u6e05\u7a7a mcMMO \u8bb0\u5206\u677f
Commands.Scoreboard.Help.2=[[DARK_AQUA]]/mcscoreboard[[AQUA]] keep [[WHITE]] - \u4fdd\u6301 mcMMO \u8bb0\u5206\u677f\u60ac\u505c
Commands.Scoreboard.Help.3=[[DARK_AQUA]]/mcscoreboard[[AQUA]] time [n] [[WHITE]] - [[LIGHT_PURPLE]]n[[WHITE]] \u79d2\u540e\u6e05\u7a7a mcMMO \u8bb0\u5206\u677f
Commands.Scoreboard.Tip.Keep=[[GOLD]]\u63d0\u793a: \u5f53\u8bb0\u5206\u677f\u663e\u793a\u65f6\u4f7f\u7528 [[RED]]/mcscoreboard keep[[GOLD]] \u6765\u4fdd\u6301\u5b83\u4e0d\u6d88\u5931\u3002
Commands.Scoreboard.Tip.Clear=[[GOLD]]\u63d0\u793a: \u4f7f\u7528 [[RED]]/mcscoreboard clear[[GOLD]] \u6765\u5173\u95ed\u8ba1\u5206\u677f\u3002
Commands.Skill.Invalid=\u8fd9\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u6280\u80fd\u540d\u5b57!
Commands.Skill.ChildSkill=\u5b50\u6280\u80fd\u5bf9\u8be5\u547d\u4ee4\u65e0\u6548\uff01
Commands.Skill.Leaderboard=--mcMMO [[BLUE]]{0}[[YELLOW]] \u6392\u884c\u699c--
Commands.SkillInfo=- \u67e5\u770b\u6280\u80fd\u7684\u8be6\u7ec6\u4fe1\u606f
Commands.Stats.Self=\u4f60\u7684\u4fe1\u606f
Commands.Stats=- \u67e5\u770b\u4f60\u7684mcMMO\u7edf\u8ba1\u4fe1\u606f
Commands.ToggleAbility=- \u7528\u9f20\u6807\u53f3\u952e\u5207\u6362\u6280\u80fd\u6fc0\u6d3b\u6a21\u5f0f
Commands.Usage.0=\u6b63\u786e\u7684\u7528\u6cd5 /{0}
Commands.Usage.1=\u6b63\u786e\u7684\u7528\u6cd5\u5e94\u4e3a /{0} {1}
Commands.Usage.2=\u6b63\u786e\u7684\u7528\u6cd5 /{0} {1} {2}
Commands.Usage.3=\u6b63\u786e\u7684\u7528\u6cd5 /{0} {1} {2} {3}
Commands.Usage.FullClassName=\u6570\u636e\u7c7b\u578b
Commands.Usage.Level=\u7b49\u7ea7
Commands.Usage.Message=\u6d88\u606f
Commands.Usage.Page=\u9875
Commands.Usage.PartyName=\u540d\u79f0
Commands.Usage.Password=\u5bc6\u7801
Commands.Usage.Player=\u73a9\u5bb6
Commands.Usage.Rate=\u6bd4\u7387
Commands.Usage.Skill=\u6280\u80fd
Commands.Usage.XP=\u7ecf\u9a8c\u503c
mcMMO.NoInvites=\u4f60\u73b0\u5728\u6ca1\u6709\u6536\u5230\u4efb\u4f55\u9080\u8bf7
mcMMO.NoPermission=[[DARK_RED]]\u6743\u9650\u4e0d\u8db3.
mcMMO.NoSkillNote=[[DARK_GRAY]]\u5982\u679c\u4f60\u6ca1\u6709\u67d0\u4e2a\u6280\u80fd\u7684\u4f7f\u7528\u6743\u9650\u90a3\u4e48\u4ed6\u5c06\u4e0d\u4f1a\u5728\u8fd9\u91cc\u663e\u793a.
Party.Forbidden=[mcMMO] \u961f\u4f0d\u529f\u80fd\u4e0d\u5141\u8bb8\u5728\u8fd9\u4e2a\u4e16\u754c\u5f00\u542f (\u8be6\u60c5\u8bf7\u770b\u6743\u9650\u914d\u7f6e)
Party.Help.0=\u6b63\u786e\u7684\u7528\u6cd5 [[DARK_AQUA]]{0} <player> [password].
Party.Help.1=\u521b\u5efa\u4e00\u4e2a\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0} <name> [password].
Party.Help.2=\u67e5\u9605 [[DARK_AQUA]]{0} [[RED]]\u83b7\u53d6\u66f4\u591a\u4fe1\u606f
Party.Help.3=\u4f7f\u7528 [[DARK_AQUA]]{0} <player> [password] [[RED]]\u52a0\u5165\u6216 [[DARK_AQUA]]{1} [[RED]]\u9000\u51fa
Party.Help.4=\u9501\u5b9a\u6216\u89e3\u9501\u4f60\u7684\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0}
Party.Help.5=\u8bbe\u7f6e\u961f\u4f0d\u5bc6\u7801, \u4f7f\u7528 [[DARK_AQUA]]{0} <password>
Party.Help.6=\u4ece\u4f60\u7684\u961f\u4f0d\u4e2d\u8e22\u51fa\u73a9\u5bb6, \u4f7f\u7528 [[DARK_AQUA]]{0} <player>
Party.Help.7=\u79fb\u4ea4\u961f\u957f, \u4f7f\u7528 [[DARK_AQUA]]{0} <player>
Party.Help.8=\u89e3\u6563\u961f\u4f0d, \u4f7f\u7528 [[DARK_AQUA]]{0}
Party.Help.9=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u6765\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7269\u54c1
Party.Help.10=\u4f7f\u7528 [[DARK_AQUA]]{0} [[RED]]\u5f00\u542f\u4e0e\u4f60\u7684\u961f\u4f0d\u6210\u5458\u5206\u4eab\u7ecf\u9a8c
Party.InformedOnJoin={0} [[GREEN]]\u5df2\u7ecf\u52a0\u5165\u4f60\u7684\u961f\u4f0d
Party.InformedOnQuit={0} [[GREEN]]\u79bb\u5f00\u4e86\u961f\u4f0d
Party.InformedOnNameChange=[[GOLD]]{0} [[GREEN]]\u5df2\u8bbe\u7f6e\u961f\u4f0d\u540d\u4e3a [[WHITE]]{1}
Party.InvalidName=[[DARK_RED]]\u90a3\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u961f\u4f0d\u540d\u5b57.
Party.Invite.Self=\u4f60\u4e0d\u80fd\u9080\u8bf7\u81ea\u5df1!
Party.IsLocked=\u8fd9\u4e2a\u961f\u4f0d\u5df2\u7ecf\u9501\u5b9a!
Party.IsntLocked=\u8fd9\u4e2a\u961f\u4f0d\u5e76\u6ca1\u6709\u9501\u5b9a!
Party.Locked=\u961f\u4f0d\u88ab\u9501\u5b9a, \u53ea\u6709\u961f\u957f\u53ef\u4ee5\u9080\u8bf7.
Party.NotInYourParty=[[DARK_RED]]{0} \u4f60\u4e0d\u5728\u4f60\u7684\u56e2\u961f
Party.NotOwner=[[DARK_RED]]\u4f60\u4e0d\u662f\u961f\u957f
Party.Target.NotOwner=[[DARK_RED]]{0} \u4e0d\u662f\u961f\u957f\u3002
Party.Owner.New=[[GREEN]]{0} \u73b0\u5728\u662f\u65b0\u7684\u6d3e\u7cfb\u9886\u961f.
Party.Owner.NotLeader=[[DARK_RED]]\u4f60\u5df2\u7ecf\u4e0d\u518d\u662f\u6d3e\u7cfb\u5185\u7684\u9886\u961f.
Party.Owner.Player=[[GREEN]]\u4f60\u73b0\u5728\u4e0d\u662f\u961f\u957f\u4e86
Party.Password.None=\u52a0\u5165\u8fd9\u4e2a\u961f\u4f0d\u9700\u8981\u5bc6\u7801. \u8bf7\u63d0\u4f9b\u5bc6\u7801\u518d\u52a0\u5165
Party.Password.Incorrect=\u961f\u4f0d\u5bc6\u7801\u9519\u8bef
Party.Password.Set=[[GREEN]]\u961f\u4f0d\u5bc6\u7801\u8bbe\u7f6e\u4e3a {0}
Party.Password.Removed=[[GREEN]]\u961f\u4f0d\u5bc6\u7801\u5df2\u88ab\u6e05\u9664
Party.Player.Invalid=\u8fd9\u4e0d\u662f\u4e00\u540d\u6709\u6548\u7684\u73a9\u5bb6
Party.NotOnline=[[DARK_RED]]{0} \u4e0d\u5728\u7ebf!
Party.Player.InSameParty={0} \u5df2\u7ecf\u5728\u961f\u4f0d\u4e2d!
Party.PlayerNotInParty=[[DARK_RED]]{0} \u4e0d\u5728\u961f\u4f0d\u91cc
Party.Specify=\u4f60\u5fc5\u987b\u6307\u5b9a\u4e00\u4e2a\u961f\u4f0d
Party.Teleport.Dead=\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u6b7b\u4ea1\u7684\u73a9\u5bb6\u8eab\u8fb9
Party.Teleport.Hurt=\u4f60\u53d7\u5230\u4f24\u5bb3, \u81f3\u5c11 {0} \u79d2\u5185\u4e0d\u80fd\u4f20\u9001
Party.Teleport.Player=[[GREEN]]\u4f60\u5df2\u7ecf\u4f20\u9001\u5230 {0}.
Party.Teleport.Self=\u4f60\u4e0d\u80fd\u4f20\u9001\u5230\u4f60\u81ea\u5df1\u90a3\u91cc!
Party.Teleport.Target=[[GREEN]]{0} \u5df2\u7ecf\u4f20\u9001\u5230\u4f60\u8eab\u8fb9.
Party.Teleport.Disabled={0} \u4e0d\u5141\u8bb8\u961f\u4f0d\u4f20\u9001
Party.Rename.Same=\u8fd9\u5df2\u7ecf\u662f\u4f60\u7684\u961f\u4f0d\u540d\u5b57\u4e86!
Party.Join.Self=\u4f60\u4e0d\u80fd\u52a0\u5165\u4f60\u81ea\u5df1!
Party.Unlocked=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u9501
Party.Disband=[[GRAY]]\u961f\u4f0d\u5df2\u89e3\u6563
Party.Alliance.Formed=[[GRAY]]\u60a8\u7684\u961f\u4f0d\u5f53\u524d\u4e0e [[GREEN]]{0} [[GRAY]]\u7ed3\u76df
Party.Alliance.Disband=[[GRAY]]\u60a8\u7684\u961f\u4f0d\u4e0d\u518d\u4e0e [[RED]]{0} [[GRAY]]\u7ed3\u76df
Party.Status.Locked=[[DARK_RED]](\u4ec5\u9080\u8bf7)
Party.Status.Unlocked=[[DARK_GREEN]](\u5f00\u542f)
Party.LevelUp=\u961f\u4f0d\u7b49\u7ea7\u63d0\u5347 {0} \u7ea7. \u603b\u8ba1 ({1})
Party.Feature.Chat=\u961f\u4f0d\u804a\u5929
Party.Feature.Teleport=\u961f\u4f0d\u4f20\u9001
Party.Feature.Alliance=\u540c\u76df
Party.Feature.ItemShare=\u7269\u54c1\u5171\u4eab
Party.Feature.XpShare=\u7ecf\u9a8c\u5171\u4eab
Party.Feature.Locked.Chat=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ \u7ea7(\u961f\u4f0d\u804a\u5929)
Party.Feature.Locked.Teleport=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u961f\u4f0d\u4f20\u9001)
Party.Feature.Locked.Alliance=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u540c\u76df)
Party.Feature.Locked.ItemShare=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u7269\u54c1\u5171\u4eab)
Party.Feature.Locked.XpShare=\u529f\u80fd\u9501\u5b9a\u76f4\u81f3 {0}+ (\u7ecf\u9a8c\u5171\u4eab)
Party.Feature.Disabled.1=\u961f\u4f0d\u804a\u5929\u5c1a\u672a\u89e3\u9501\u3002
Party.Feature.Disabled.2=\u961f\u4f0d\u4f20\u9001\u5c1a\u672a\u89e3\u9501\u3002
Party.Feature.Disabled.3=\u961f\u4f0d\u540c\u76df\u5c1a\u672a\u89e3\u9501\u3002
Party.Feature.Disabled.4=\u961f\u4f0d\u7269\u54c1\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002
Party.Feature.Disabled.5=\u961f\u4f0d\u7ecf\u9a8c\u5171\u4eab\u5c1a\u672a\u89e3\u9501\u3002
Party.ShareType.Xp=\u7ecf\u9a8c
Party.ShareType.Item=\u7269\u54c1
Party.ShareMode.None=\u65e0
Party.ShareMode.Equal=\u5747\u5206
Party.ShareMode.Random=\u968f\u673a
Party.ItemShare.Category.Loot=\u63a0\u593a
Party.ItemShare.Category.Mining=\u6316\u77ff
Party.ItemShare.Category.Herbalism=\u8349\u836f\u5b66
Party.ItemShare.Category.Woodcutting=\u4f10\u6728
Party.ItemShare.Category.Misc=\u6742\u9879
Commands.XPGain.Acrobatics=\u6389\u843d
Commands.XPGain.Alchemy=\u917f\u9020\u836f\u6c34
Commands.XPGain.Archery=\u7a7a\u624b\u653b\u51fb\u602a\u7269
Commands.XPGain.Axes=\u653b\u51fb\u602a\u7269
Commands.XPGain.Child=\u4ece\u4e3b\u6280\u80fd\u83b7\u53d6\u7b49\u7ea7
Commands.XPGain.Excavation=\u6316\u5230\u5b9d\u7269
Commands.XPGain.Fishing=\u9493\u9c7c (\u53bb\u60f3\u60f3\u5427\uff01)
Commands.XPGain.Herbalism=\u6536\u83b7\u4f5c\u7269
Commands.XPGain.Mining=\u6316\u6398\u77f3\u5934\u548c\u77ff\u7269
Commands.XPGain.Repair=\u4fee\u7406
Commands.XPGain.Swords=\u653b\u51fb\u602a\u7269
Commands.XPGain.Taming=\u9a6f\u517d, \u548c\u4f60\u7684\u72fc\u4e00\u8d77\u6218\u6597
Commands.XPGain.Unarmed=\u653b\u51fb\u602a\u7269
Commands.XPGain.Woodcutting=\u6b63\u5728\u780d\u5012\u6811\u6728
Commands.XPGain=[[DARK_GRAY]]\u83b7\u5f97\u7ecf\u9a8c: [[WHITE]]{0}
Commands.xplock.locked=[[GOLD]]\u4f60\u7684\u7ecf\u9a8c\u6761\u9501\u5b9a\u5728 {0}!
Commands.xplock.unlocked=[[GOLD]]\u4f60\u7684\u7ecf\u9a8c\u6761\u73b0\u5728 [[GREEN]]\u89e3\u9664\u9501\u5b9a\u4e86[[GOLD]]!
Commands.xprate.modified=\u7ecf\u9a8c\u500d\u7387\u5df2\u8bbe\u7f6e\u4e3a {0}
Commands.xprate.over=mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u7ed3\u675f!!
Commands.xprate.proper.0=\u60f3\u4fee\u6539\u7ecf\u9a8c\u83b7\u53d6\u7387\u8bf7\u8f93\u5165 /xprate <integer> <true/false>
Commands.xprate.proper.1=\u60f3\u628a\u7ecf\u9a8c\u83b7\u53d6\u7387\u8c03\u6574\u4e3a\u9ed8\u8ba4\u8bf7\u8f93\u5165 /xprate reset
Commands.xprate.proper.2=\u8bf7\u6307\u5b9a true \u6216 false \u6765\u8868\u660e\u8fd9\u662f\u5426\u662f\u4e00\u4e2a\u7ecf\u9a8c\u4e8b\u4ef6
Commands.xprate.started.0=[[GOLD]] mcMMO \u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u5df2\u5f00\u59cb!
Commands.xprate.started.1=[[GOLD]]mcMMO \u7ecf\u9a8c\u83b7\u53d6\u7387\u73b0\u5728\u4e3a {0}x!
XPRate.Event=[[GOLD]]mcMMO \u73b0\u5728\u6b63\u5904\u4e8e\u9ad8\u7ecf\u9a8c\u4e8b\u4ef6\u9636\u6bb5! \u7ecf\u9a8c\u83b7\u53d6\u7387\u4e3a {0}\u500d
Effects.Effects=\u6548\u679c
Effects.Child=[[DARK_GRAY]]\u7b49\u7ea7: [[GREEN]]{0}
Effects.Level=[[DARK_GRAY]]\u7b49\u7ea7: [[GREEN]]{0} [[DARK_AQUA]]XP[[YELLOW]]([[GOLD]]{1}[[YELLOW]]/[[GOLD]]{2}[[YELLOW]])
Effects.Parent=[[GOLD]]{0} -
Effects.Template=[[DARK_AQUA]]{0}: [[GREEN]]{1}
Guides.Available=[[GRAY]]{0} \u7684\u5411\u5bfc - \u8f93\u5165/{1} ? [\u9875\u6570]
Guides.Header=[[GOLD]]-=[[GREEN]]{0} \u5411\u5bfc[[GOLD]]=-
Guides.Page.Invalid=\u4e0d\u662f\u4e00\u4e2a\u6709\u6548\u7684\u9875\u6570!
Guides.Page.OutOfRange=\u90a3\u9875\u4e0d\u5b58\u5728, \u603b\u5171\u53ea\u6709 {0} \u9875
Guides.Usage=\u7528\u6cd5 /{0} ? [\u9875\u6570]
Guides.Acrobatics.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u6742\u6280:\n[[YELLOW]]\u6742\u6280\u662f mcMMO \u4e2d\u4f18\u96c5\u79fb\u52a8\u7684\u827a\u672f\u3002\n[[YELLOW]]\u5b83\u63d0\u4f9b\u4e86\u6218\u6597\u52a0\u6210\u548c\u73af\u5883\u4f24\u5bb3\u52a0\u6210\u3002\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u83b7\u53d6:\n[[YELLOW]]\u901a\u8fc7\u5728\u6218\u6597\u4e2d\u95ea\u907f\u6216\u8005\u4ece\u9ad8\u5904\n[[YELLOW]]\u8dcc\u843d\u65f6\u53d7\u4f24\u5e76\u5e78\u5b58\u6765\u83b7\u5f97\u7ecf\u9a8c\u3002
Guides.Acrobatics.Section.1=[[DARK_AQUA]]\u7ffb\u6eda\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u5f53\u60a8\u53d7\u5230\u8dcc\u843d\u4f24\u5bb3\u65f6\u60a8\u6709\u88ab\u52a8\u673a\u4f1a\u6765\u514d\u53d7\u4f24\u5bb3\u3002\n[[YELLOW]]\u60a8\u53ef\u4ee5\u5728\u8dcc\u843d\u4e2d\u6309\u4f4f\u6f5c\u884c\u952e\u6765\u63d0\u5347\u89e6\u53d1\u51e0\u7387\u3002\n[[YELLOW]]\u8fd9\u5c06\u89e6\u53d1\u4e00\u4e2a\u4f18\u96c5\u5730\u7ffb\u6eda\u800c\u4e0d\u662f\u666e\u901a\u7684\u7ffb\u6eda\u3002\n[[YELLOW]]\u4f18\u96c5\u5730\u7ffb\u6eda\u7c7b\u4f3c\u666e\u901a\u7684\u7ffb\u6eda\u4f46\u662f\u5b83\u6709\u53cc\u500d\u51e0\u7387\n[[YELLOW]]\u53d1\u751f\uff0c\u5e76\u4e14\u80fd\u591f\u63d0\u4f9b\u6bd4\u666e\u901a\u5730\u7ffb\u6eda\u66f4\u9ad8\u7684\u4f24\u5bb3\u51cf\u514d\u3002\n[[YELLOW]]\u7ffb\u6eda\u51e0\u7387\u53d6\u51b3\u4e8e\u60a8\u7684\u6280\u80fd\u7b49\u7ea7
Guides.Acrobatics.Section.2=[[DARK_AQUA]]\u95ea\u907f\u662f\u5982\u4f55\u5de5\u4f5c\u7684?\n[[YELLOW]]\u95ea\u907f\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4ed6\u5728\u4f60\u88ab\u653b\u51fb\u65f6\u6709\u4e00\u5b9a\u51e0\u7387\u88ab\u6fc0\u53d1\n[[YELLOW]]\u8fd9\u4e2a\u51e0\u7387\u548c\u4f60\u7684\u6280\u80fd\u7b49\u7ea7\u6709\u5173
Guides.Alchemy.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u70bc\u91d1:\n[[YELLOW]]\u70bc\u91d1\u662f\u836f\u6c34\u917f\u9020\u7684\u6280\u80fd\u3002\n[[YELLOW]]\u5b83\u63d0\u5347\u4e86\u836f\u6c34\u917f\u9020\u65f6\u7684\u901f\u5ea6\uff0c\u5e76\u4e14\u52a0\u5165\u4e86\n[[YELLOW]]\u65b0\u7684\uff08\u76f8\u5bf9\u4e4b\u524d\uff09\u65e0\u6cd5\u83b7\u53d6\u7684\u836f\u6c34\u3002\n\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u83b7\u53d6\uff1a\n[[YELLOW]]\u901a\u8fc7\u917f\u9020\u836f\u6c34\u6765\u83b7\u53d6\u7ecf\u9a8c\u3002
Guides.Alchemy.Section.1=[[DARK_AQUA]]\u50ac\u5316\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u50ac\u5316\u63d0\u5347\u917f\u9020\u7684\u901f\u5ea6\uff0c\u5728 1000 \u7ea7\n[[YELLOW]]\u65f6\u80fd\u8fbe\u5230\u6700\u9ad8 4 \u500d\u3002\n[[YELLOW]]\u6b64\u80fd\u529b\u9ed8\u8ba4\u5728 100 \u7ea7\u89e3\u9501\u3002
Guides.Alchemy.Section.2=[[DARK_AQUA]]\u6df7\u5408\u662f\u5982\u4f55\u5de5\u4f5c\u7684\uff1f\n[[YELLOW]]\u6df7\u5408\u5141\u8bb8\u4f7f\u7528\u81ea\u8ba2\u539f\u6599\u917f\u9020\u66f4\u591a\u836f\u6c34\u3002\n[[YELLOW]]\u7279\u6b8a\u539f\u6599\u6839\u636e\u60a8\u7684\u7b49\u7ea7\u6765\u89e3\u9501\u3002\n[[YELLOW]]\u603b\u5171\u6709 8 \u4e2a\u7b49\u7ea7\u9700\u8981\u89e3\u9501\u3002
Guides.Alchemy.Section.3=[[DARK_AQUA]]\u6df7\u5408\u7b2c 1 \u9636\u539f\u6599:\n[[YELLOW]]\u70c8\u7130\u7c89, \u53d1\u9175\u86db\u773c, \u6076\u9b42\u4e4b\u6cea, \u7ea2\u77f3,\n[[YELLOW]]\u8424\u77f3\u7c89, \u7cd6, \u95ea\u70c1\u7684\u897f\u74dc, \u91d1\u80e1\u841d\u535c,\n[[YELLOW]]\u5ca9\u6d46\u818f, \u5730\u72f1\u75a3, \u8718\u86db\u773c, \u706b\u836f, \u7761\u83b2,\n[[YELLOW]]\u6cb3\u8c5a\n[[YELLOW]](\u7eaf\u51c0\u836f\u6c34)
Guides.Alchemy.Section.4=[[DARK_AQUA]]\u6df7\u5408\u7b2c 2 \u9636\u539f\u6599:\n[[YELLOW]]\u80e1\u841d\u535c (\u6025\u8feb\u836f\u6c34)\n[[YELLOW]]\u7c98\u6db2\u7403 (\u8fdf\u949d\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 3 \u9636\u539f\u6599:\n[[YELLOW]]\u4e0b\u754c\u77f3\u82f1 (\u4f24\u5bb3\u5438\u6536\u836f\u6c34)\n[[YELLOW]]\u7ea2\u8272\u8611\u83c7 (\u8df3\u8dc3\u836f\u6c34)
Guides.Alchemy.Section.5=[[DARK_AQUA]]\u6df7\u5408\u7b2c 4 \u9636\u539f\u6599:\n[[YELLOW]]\u82f9\u679c (\u751f\u547d\u52a0\u6210\u836f\u6c34)\n[[YELLOW]]\u8150\u8089 (\u9965\u997f\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 5 \u9636\u539f\u6599:\n[[YELLOW]]\u8910\u8272\u8611\u83c7 (\u53cd\u80c3\u836f\u6c34)\n[[YELLOW]]\u58a8\u56ca (\u5931\u660e\u836f\u6c34)
Guides.Alchemy.Section.6=[[DARK_AQUA]]\u6df7\u5408\u7b2c 6 \u9636\u539f\u6599:\n[[YELLOW]]\u8568\u7c7b (\u9971\u548c\u836f\u6c34)\n\n[[DARK_AQUA]]\u6df7\u5408\u7b2c 7 \u9636\u539f\u6599:\n[[YELLOW]]\u6bd2\u9a6c\u94c3\u85af (Potion of Decay)\n\n[[\u8150\u70c2\u836f\u6c34]]\u6df7\u5408\u7b2c 8 \u9636\u539f\u6599:\n[[YELLOW]]\u666e\u901a\u91d1\u82f9\u679c (\u6297\u6027\u63d0\u5347\u836f\u6c34)
Guides.Axes.Section.0=[[DARK_AQUA]]\u5173\u4e8e \u65a7\u6280:\n[[YELLOW]]\u6709\u4e86\u65a7\u5934\u6280\u80fd,\u65a7\u5b50\u4e0d\u518d\u53ea\u662f\u780d\u6811\u800c\u5df2.\n[[YELLOW]]\u4f60\u8fd8\u53ef\u4ee5\u780d\u5176\u4ed6\u751f\u7269\u548c\u73a9\u5bb6\u6765\u8d5a\u53d6\u7ecf\u9a8c.\n[[YELLOW]]\u6253\u51fb\u751f\u7269\u65f6\u9644\u52a0\u51fb\u9000\u6548\u679c.\n[[YELLOW]]\u8fd8\u4f1a\u5bf9\u751f\u7269\u548c\u73a9\u5bb6\u9020\u6210\u81f4\u547d\u4f24\u5bb3.\n[[YELLOW]]\u4f60\u7684\u65a7\u5b50\u4f1a\u50cf\u4f10\u6728\u673a\u4e00\u6837.\n[[YELLOW]]\u8f7b\u677e\u524a\u6389\u654c\u4eba\u7684\u62a4\u7532.\n[[YELLOW]]\u6548\u679c\u968f\u7740\u6280\u80fd\u7b49\u7ea7\u63d0\u9ad8.\n[[DARK_AQUA]]\u7ecf\u9a8c\u7684\u83b7\u53d6:\n[[YELLOW]]\u624b\u6301\u65a7\u5b50\u653b\u51fb\u5176\u4ed6\u751f\u7269\u6216\u73a9\u5bb6.
Guides.Axes.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u65a9\u9996\u8005?\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u4f1a\u9020\u6210\u8303\u56f4\u6253\u51fb\u4f24\u5bb3\n[[YELLOW]]\u4f24\u5bb3\u7b49\u4e8e\u5bf9\u4e3b\u8981\u653b\u51fb\u76ee\u6807\u9020\u6210\u4f24\u5bb3\u768450%\n[[YELLOW]]\u6240\u4ee5\u5f88\u5bb9\u6613\u6e05\u7406\u6389\u4e00\u5927\u7247\u602a\u7269
Guides.Axes.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u81f4\u547d\u4e00\u51fb?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4e00\u5b9a\u51e0\u7387\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3\n[[YELLOW]]\u9ed8\u8ba4\u6bcf2\u7ea7\u589e\u52a0 0.1%\n[[YELLOW]]\u5bf9\u751f\u7269\u9020\u62102\u500d\u4f24\u5bb3\n[[YELLOW]]\u5bf9\u73a9\u5bb6\u9020\u62101.5\u500d\u4f24\u5bb3
Guides.Axes.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u65a7\u7cbe\u901a?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u9644\u52a0\u989d\u5916\u4f24\u5bb3\n[[YELLOW]]\u9ed8\u8ba4\u6bcf50\u7ea7\u989d\u5916\u63d0\u9ad81\u70b9\u4f24\u5bb3\n[[YELLOW]]4\u70b9\u989d\u5916\u4f24\u5bb3\u5c01\u9876
Guides.Axes.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5f3a\u529b\u51b2\u51fb?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u4f7f\u7528\u65a7\u5b50\u653b\u51fb\u65f6\u4e00\u5b9a\u51e0\u7387\u7ed9\u654c\u4eba\u5e26\u6765\u5de8\u5927\u7684\u51b2\u51fb\u529b\n[[YELLOW]]\u9ed8\u8ba4\u51e0\u7387\u4e3a 25%\n[[YELLOW]]\u6548\u679c\u76f8\u5f53\u4e8e \u51fb\u9000 II \u7684\u9644\u9b54\u6548\u679c\n[[YELLOW]]\u6b64\u5916\u8fd8\u4f1a\u5bf9\u76ee\u6807\u9020\u6210\u989d\u5916\u4f24\u5bb3
Guides.Mining.Section.0=[[DARK_AQUA]]\u5173\u4e8e \u6316\u77ff:\n[[YELLOW]]\u5728\u6316\u77ff\u7684\u65f6\u5019,\u6316\u77ff\u6280\u80fd\u53ef\u4ee5\u63d0\u4f9b\u591a\u91cd\u77ff\u7269\u6389\u843d\u7684\u5956\u52b1.\n\n[[DARK_AQUA]]\u7ecf\u9a8c\u63d0\u5347:\n[[YELLOW]]\u4f60\u5fc5\u987b\u4f7f\u7528\u9550\u5b50\u6316\u6389\u6709\u6548\u7684\u65b9\u5757\u624d\u80fd\u589e\u52a0\u672c\u6280\u80fd\u7684\u7ecf\u9a8c.
Guides.Mining.Section.1=[[DARK_AQUA]]\u517c\u5bb9\u6750\u6599:\n[[YELLOW]]\u77f3\u5934,\u7164\u77ff\u77f3,\u94c1\u77ff\u77f3,\u91d1\u77ff\u77f3,\u94bb\u77f3\u77ff\u77f3,\u7ea2\u77f3\u77ff\u77f3,\n[[YELLOW]]\u9752\u91d1\u77f3\u77ff\u77f3,\u9ed1\u66dc\u77f3,\u82d4\u77f3,\u672b\u5730\u77f3,\n[[YELLOW]]\u8424\u77f3,\u5730\u72f1\u5ca9.
Guides.Mining.Section.2=[[DARK_AQUA]]\u5982\u4f55\u4f7f\u7528\u8d85\u7ea7\u788e\u77f3\u673a:\n[[YELLOW]]\u628a\u9550\u5b50\u62ff\u5728\u4f60\u7684\u624b\u4e0a,\u6309\u4e0b\u53f3\u952e\u6765\u51c6\u5907\u4f60\u7684\u9550\u5b50.\n[[YELLOW]]\u4f60\u5c06\u67094\u79d2\u949f\u7684\u65f6\u95f4\u6765\u6fc0\u53d1\u4f60\u7684\u6280\u80fd.\n[[YELLOW]]\u5f53\u4f60\u6572\u4e0b\u5bf9\u5e94\u7684\u77f3\u5934\u4ee5\u540e,\u8d85\u7ea7\u788e\u77f3\u673a\u5c06\u88ab\u6fc0\u6d3b.
Guides.Mining.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u8d85\u7ea7\u788e\u77f3\u673a?\n[[YELLOW]]\u8d85\u7ea7\u788e\u77f3\u673a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5b83\u80fd\u4f7f\u4f60\u5728\u6316\u6389\u5bf9\u5e94\u77ff\u77f3\u7684\u65f6\u5019\u589e\u52a03\u500d\u6389\u843d\u51e0\u7387\n[[YELLOW]]\u5e76\u4e14\u5728\u6280\u80fd\u65f6\u95f4\u5185\u77ac\u95f4\u7834\u574f\u77f3\u5934\u548c\u77ff\u77f3
Guides.Mining.Section.4=[[DARK_AQUA]\u5982\u4f55\u4f7f\u7528\u7206\u7834\u5f00\u91c7:\n[[YELLOW]]\u628a\u96f7\u7ba1\u62ff\u5728\u624b\u4e0a,\u9ed8\u8ba4\u7684\u60c5\u51b5\u4e0b\u662f\u6253\u706b\u5668.\n[[YELLOW]]\u5728\u4e00\u5b9a\u8ddd\u79bb\u5185\u53f3\u952e\u70b9\u51fbTNT,\u8fd9\u5c06\u4f1a\u4f7f\u5f97TNT\u5728\u77ac\u95f4\u5185\u7206\u70b8.
Guides.Mining.Section.5=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u7206\u7834\u5f00\u91c7?\n[[YELLOW]]\u7206\u7834\u5f00\u91c7\u662f\u4e00\u4e2a\u9700\u8981\u51b7\u5374\u65f6\u95f4\u7684\u6316\u77ff\u6280\u80fd\n[[YELLOW]]\u5b83\u80fd\u4f7f\u4f60\u5728\u4f7f\u7528TNT\u70b8\u77ff\u65f6\u83b7\u5f97\u989d\u5916\u5956\u52b1\n[[YELLOW]]\u7206\u7834\u5f00\u91c7\u603b\u5171\u67093\u4e2a\u529f\u80fd\n[[YELLOW]]\u5927\u53f7\u70b8\u5f39:\u4f7f\u4f60\u7684TNT\u7206\u70b8\u8303\u56f4\u6269\u5927\n[[YELLOW]]\u7206\u7834\u4e13\u5bb6:\u964d\u4f4e\u4f60\u53d7\u5230TNT\u7684\u7206\u70b8\u4f24\u5bb3\n[[YELLOW]]\u7206\u7834\u5f00\u91c7:\u4f7f\u4f60\u70b9\u71c3\u7684TNT\u70b8\u4e0b\u8303\u56f4\u5185\u4e00\u5b9a\u6570\u91cf\u7684\u77ff\u77f3
Guides.Repair.Section.1=[[DARK_AQUA]]\u6211\u600e\u4e48\u624d\u80fd\u4fee\u7406?\n[[YELLOW]]\u653e\u7f6e\u4e00\u4e2a mcMMO \u7684\u94c1\u7827\u5e76\u4e14\u70b9\u51fb\u53f3\u952e\u6765\u4fee\u7406.\n[[YELLOW]]\u4f60\u76ee\u524d\u62ff\u5728\u624b\u4e0a\u7684\u7269\u54c1,\u6bcf\u70b9\u51fb\u4e00\u6b21\u6d88\u8017\u4e00\u4e2a\u7269\u54c1.
Guides.Repair.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u8d85\u7ea7\u4fee\u7406?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u5f53\u73a9\u5bb6\u8fdb\u884c\u4fee\u7406\u65f6\u4f1a\u6062\u590d\u53cc\u500d\u7684\u8010\u4e45
Guides.Swords.Section.0=[[DARK_AQUA]]\u5173\u4e8e\u5251\u672f:\n[[YELLOW]]\u5251\u672f\u8ba9\u73a9\u5bb6\u5728\u4f7f\u7528\u5251\u6218\u6597\u65f6\u83b7\u5f97\u989d\u5916\u52a0\u6210\u6548\u679c.\n\n[[DARK_AQUA]]\u5982\u4f55\u83b7\u53d6\u7ecf\u9a8c:\n[[YELLOW]]\u8981\u83b7\u53d6\u7ecf\u9a8c\u4f60\u5fc5\u987b\u7528\u5251\u653b\u51fb\u654c\u4eba.
Guides.Swords.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5229\u5203\u7a81\u523a?\n[[YELLOW]]\u5229\u5203\u7a81\u523a\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd.\n[[YELLOW]]\u4f60\u53ef\u4ee5\u5c06\u62ff\u5728\u624b\u4e0a\u7684\u5251\u6309\u4e0b\u53f3\u952e\u6765\u542f\u52a8\u5b83.\n[[YELLOW]]\u8fd9\u4e2a\u6280\u80fd\u5c06\u9020\u621025%\u7684\u989d\u5916\u8303\u56f4\u4f24\u5bb3\n[[YELLOW]]\u5e76\u4e14\u9644\u5e26\u81f3\u5c115\u4e2aticks\u7684\u653e\u8840\u6548\u679c
Guides.Swords.Section.2=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u53cd\u51fb?\n[[YELLOW]]\u53cd\u51fb\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5f53\u683c\u6863\u602a\u7269\u6240\u9020\u6210\u7684\u4f24\u5bb3\u65f6\n[[YELLOW]]\u4f60\u6709\u673a\u4f1a\u53cd\u5c0450%\u6240\u53d7\u5230\u7684\u4f24\u5bb3
Guides.Swords.Section.3=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u653e\u8840?\n[[YELLOW]]\u653e\u8840\u5c06\u9020\u6210\u654c\u4eba\u6bcf\u4e24\u79d2\u949f\u53d7\u5230\u4f24\u5bb3\n[[YELLOW]]\u76ee\u6807\u4e0d\u505c\u7684\u6d41\u8840\u76f4\u5230\u6548\u679c\u7ed3\u675f\u6216\u662f\u6b7b\u4ea1\n[[YELLOW]]\u653e\u8840\u7684\u65f6\u95f4\u968f\u7740\u4f60\u7684\u5251\u672f\u7684\u63d0\u5347\u800c\u589e\u52a0
Guides.Smelting.Section.0=\u5373\u5c06\u5230\u6765...
Guides.Taming.Section.1=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u91ce\u6027\u547c\u5524?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u4e3b\u52a8\u6280\u80fd\n[[YELLOW]]\u5b83\u53ef\u4ee5\u53ec\u5524\u4e00\u53ea\u72fc,\u8c79\u732b\u6216\u8005\u9a6c\u5230\u4f60\u8eab\u8fb9\n[[YELLOW]]\u624b\u6301\u9aa8\u5934,\u751f\u9c7c\u6216\u82f9\u679c\u6765\u8fdb\u884c\u53ec\u5524
Guides.Taming.Section.8=[[DARK_AQUA]]\u4ec0\u4e48\u662f\u5feb\u9910\u670d\u52a1?\n[[YELLOW]]\u8fd9\u662f\u4e00\u4e2a\u88ab\u52a8\u6280\u80fd\n[[YELLOW]]\u653b\u51fb\u65f6\u6062\u590d\u72fc\u7684\u751f\u547d\u503c
Inspect.Offline=\u4f60\u6ca1\u6709\u67e5\u8be2\u4e0d\u5728\u7ebf\u73a9\u5bb6\u4fe1\u606f\u7684\u6743\u9650!
Inspect.OfflineStats=\u4e0d\u5728\u7ebf\u73a9\u5bb6\u7684mcmmo\u7edf\u8ba1\u4fe1\u606f [[YELLOW]]{0}
Inspect.Stats={0} [[GREEN]]\u7684 mcMMO \u7edf\u8ba1\u4fe1\u606f
Inspect.TooFar=\u4f60\u65e0\u6cd5\u68c0\u67e5\u90a3\u4e2a\u73a9\u5bb6\u56e0\u4e3a\u4f60\u4eec\u8ddd\u79bb\u592a\u8fdc\u4e86!
Item.ChimaeraWing.Fail=**\u5947\u7f8e\u62c9\u4e4b\u7ffc\u5931\u8d25\u4e86!**
Item.ChimaeraWing.Pass=**\u5947\u7f8e\u62c9\u4e4b\u7ffc**
Item.ChimaeraWing.Name=\u5947\u7f8e\u62c9\u4e4b\u7ffc
Item.ChimaeraWing.Lore=[[GRAY]]\u4f20\u9001\u81f3\u4f60\u7684\u5e8a.
Item.Generic.Wait=\u4f60\u9700\u8981\u7b49\u5f85\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u518d\u6b21\u4f7f\u7528! [[YELLOW]]({0}s)
Item.Injured.Wait=\u4f60\u6700\u8fd1\u53d7\u4f24\u4e86\u6240\u4ee5\u4f60\u5fc5\u987b\u7b49\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u4f7f\u7528\u8fd9\u4e2a. [[YELLOW]]({0}s)
Item.FluxPickaxe.Name=\u707c\u70ed\u4e4b\u9550
Item.FluxPickaxe.Lore.1=[[GRAY]]\u6709\u51e0\u7387\u77ac\u95f4\u7194\u70bc\u77ff\u7269\u3002
Item.FluxPickaxe.Lore.2=[[GRAY]]\u9700\u8981\u7194\u70bc\u7b49\u7ea7 {0}+
Teleport.Commencing=[[GRAY]]\u4f20\u9001\u5c06\u5728 [[GOLD]]({0}) [[GRAY]] \u79d2\u540e\u8fdb\u884c, \u8bf7\u4fdd\u6301\u7ad9\u7acb\u4e0d\u52a8...
Teleport.Cancelled=[[DARK_RED]]\u4f20\u9001\u5df2\u53d6\u6d88!
Skills.Child=[[GOLD]](\u5206\u652f\u6280\u80fd)
Skills.Disarmed=[[DARK_RED]]\u4f60\u88ab\u7f34\u68b0\u4e86!
Skills.Header=-----[][[GREEN]]{0}[[RED]][]-----
Skills.NeedMore=[[DARK_RED]]\u4f60\u9700\u8981\u66f4\u591a\u7684 [[GRAY]]{0}
Skills.Parents=\u4e3b\u6280\u80fd
Skills.Stats={0}[[GREEN]]{1}[[DARK_AQUA]] XP([[GRAY]]{2}[[DARK_AQUA]]/[[GRAY]]{3}[[DARK_AQUA]])
Skills.ChildStats={0}[[GREEN]]{1}
Skills.TooTired=\u4f60\u592a\u7d2f\u4e86\u6682\u65f6\u65e0\u6cd5\u4f7f\u7528\u8be5\u6280\u80fd.[[YELLOW]]({0}s)
Skills.Cancelled={0} \u5df2\u53d6\u6d88!
Skills.ConfirmOrCancel=[[GREEN]]\u518d\u6b21\u53f3\u952e\u4ee5\u786e\u5b9a [[GOLD]]{0}[[GREEN]]. \u5de6\u952e\u53d6\u6d88.
Stats.Header.Combat=[[GOLD]]-=\u683c\u6597\u6280\u80fd=-
Stats.Header.Gathering=[[GOLD]]-=\u91c7\u96c6\u6280\u80fd=-
Stats.Header.Misc=[[GOLD]]-=\u6742\u9879\u6280\u80fd=-
Stats.Own.Stats=[[GREEN]][mcMMO] \u7edf\u8ba1\u4fe1\u606f
Perks.XP.Name=\u7ecf\u9a8c
Perks.XP.Desc=\u83b7\u5f97 {0}x \u7ecf\u9a8c.
Perks.Lucky.Name=\u5e78\u8fd0
Perks.Lucky.Desc=\u7ed9\u4e88 {0} \u6280\u80fd\u548c\u80fd\u529b33.3%\u7684\u66f4\u9ad8\u51e0\u7387\u89e6\u53d1
Perks.Lucky.Desc.Login=\u7ed9\u4e88\u6280\u80fd\u548c\u80fd\u529b33.3%\u5f97\u66f4\u9ad8\u51e0\u7387\u89e6\u53d1
Perks.Lucky.Bonus=[[GOLD]] ({0} \u7684\u597d\u8fd0\u52a0\u6210)
Perks.Cooldowns.Name=\u5feb\u901f\u6062\u590d
Perks.Cooldowns.Desc=\u51cf\u5c11\u51b7\u5374\u65f6\u95f4 {0}.
Perks.ActivationTime.Name=\u8010\u529b
Perks.ActivationTime.Desc=\u63d0\u9ad8\u80fd\u529b\u6fc0\u6d3b\u65f6\u95f4 {0} \u79d2.
Perks.ActivationTime.Bonus=[[GOLD]] ({0} \u79d2\u989d\u5916\u6301\u7eed\u65f6\u95f4)
Hardcore.Mode.Disabled=[[GOLD]][mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u5173\u95ed. {1}
Hardcore.Mode.Enabled=[[GOLD]][mcMMO] \u786c\u6838\u6a21\u5f0f {0} \u542f\u7528. {1}
Hardcore.DeathStatLoss.Name=\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a
Hardcore.DeathStatLoss.PlayerDeath=[[GOLD]][mcMMO] [[DARK_RED]]\u6b7b\u4ea1,\u4f60\u5931\u53bb\u4e86 [[BLUE]]{0}[[DARK_RED]].
Hardcore.DeathStatLoss.PercentageChanged=[[GOLD]][mcMMO] \u72b6\u6001\u9057\u5931\u7387\u53d8\u66f4\u4e3a {0}.
Hardcore.Vampirism.Name=\u5438\u8840\u6a21\u5f0f
Hardcore.Vampirism.Killer.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u592a\u4e0d\u719f\u7ec3\u6388\u4e88\u4f60\u83b7\u5f97\u4efb\u4f55\u7684\u77e5\u8bc6.
Hardcore.Vampirism.Killer.Success=[[GOLD]][mcMMO] [[DARK_AQUA]]\u4f60\u4ece[[YELLOW]]{1}[[DARK_AQUA]]\u90a3\u5077\u53d6\u4e86[[BLUE]]{0}[[DARK_AQUA]]\u4e2a\u7b49\u7ea7.
Hardcore.Vampirism.Victim.Failure=[[GOLD]][mcMMO] [[YELLOW]]{0}[[GRAY]]\u65e0\u6cd5\u4ece\u4f60\u8fd9\u5077\u53d6\u4efb\u4f55\u7684\u77e5\u8bc6!
Hardcore.Vampirism.Victim.Success=[[GOLD]][mcMMO] [[YELLOW]]{0}[[DARK_RED]]\u4ece\u4f60\u8fd9\u5077\u53d6\u4e86[[BLUE]]{1}[[DARK_RED]]\u4e2a\u7b49\u7ea7!
Hardcore.Vampirism.PercentageChanged=[[GOLD]][mcMMO] \u72b6\u6001\u5438\u6536\u7387\u53d8\u66f4\u4e3a {0}.
MOTD.Donate=[[DARK_AQUA]]\u6350\u8d60\u4fe1\u606f:
MOTD.Hardcore.Enabled=[[GOLD]][mcMMO] [[DARK_AQUA]]\u786c\u6838\u6a21\u5f0f\u5df2\u542f\u7528: [[DARK_RED]]{0}
MOTD.Hardcore.DeathStatLoss.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]\u6280\u80fd\u6b7b\u4ea1\u60e9\u7f5a: [[DARK_RED]]{0}%
MOTD.Hardcore.Vampirism.Stats=[[GOLD]][mcMMO] [[DARK_AQUA]]Vampirism\u7edf\u8ba1: [[DARK_RED]]{0}%
MOTD.PerksPrefix=[mcMMO \u80fd\u529b]
MOTD.Version=[[GOLD]][mcMMO] \u6b63\u5728\u8fd0\u884c\u7248\u672c [[DARK_AQUA]]{0}
MOTD.Website=[[GOLD]][mcMMO] [[GREEN]]{0}[[YELLOW]] - mcMMO \u7f51\u5740
Smelting.Ability.FluxMining=\u70bd\u70ed\u7684\u9550\u5b50\u89e6\u53d1\u51e0\u7387: [[YELLOW]]{0}
Smelting.Ability.FuelEfficiency=\u71c3\u6599\u6548\u7387\u52a0\u500d: [[YELLOW]]{0}x
Smelting.Ability.Locked.0={0}+ \u7ea7\u540e\u89e3\u9501 (\u66f4\u591a\u51b6\u70bc\u7ecf\u9a8c\u7403)
Smelting.Ability.Locked.1={0}+ \u7ea7\u540e\u89e3\u9501 (FLUX MINING)
Smelting.Ability.SecondSmelt=\u4e8c\u6b21\u7194\u70bc\u51e0\u7387: [[YELLOW]]{0}
Smelting.Ability.VanillaXPBoost=\u7ecf\u9a8c\u52a0\u500d: [[YELLOW]]{0}x
Smelting.SubSkill.FuelEfficiency.Name=\u71c3\u6599\u6548\u7387
Smelting.SubSkill.FuelEfficiency.Description=\u7194\u70bc\u65f6\u63d0\u9ad8\u7194\u7089\u5185\u71c3\u6599\u7684\u71c3\u70e7\u65f6\u95f4
Smelting.SubSkill.SecondSmelt.Name=\u4e8c\u6b21\u7194\u70bc
Smelting.SubSkill.SecondSmelt.Description=\u901a\u8fc7\u51b6\u70bc\u83b7\u5f97\u53cc\u500d\u8d44\u6e90
Smelting.Effect.4=\u66f4\u591a\u51b6\u70bc\u7ecf\u9a8c\u7403
Smelting.Effect.5=\u63d0\u9ad8\u51b6\u70bc\u83b7\u53d6\u7684\u7ecf\u9a8c\u7403
Smelting.SubSkill.FluxMining.Name=\u70bd\u70ed\u7684\u9550\u5b50
Smelting.SubSkill.FluxMining.Description=\u6316\u77ff\u65f6\u4e00\u5b9a\u51e0\u7387\u4f7f\u77ff\u77f3\u7acb\u5373\u88ab\u7194\u70bc
Smelting.Listener=\u51b6\u70bc:
Smelting.SkillName=\u51b6\u70bc
Commands.Description.addlevels=\u7ed9\u73a9\u5bb6\u589e\u52a0 mcMMO \u7b49\u7ea7
Commands.Description.adminchat=\u5207\u6362 mcMMO \u7ba1\u7406\u5458\u804a\u5929\u6216\u53d1\u9001\u7ba1\u7406\u5458\u804a\u5929\u4fe1\u606f
Commands.Description.addxp=\u7ed9\u73a9\u5bb6\u589e\u52a0 mcMMO \u7ecf\u9a8c
Commands.Description.hardcore=\u4fee\u6539 mcMMO hardcore \u767e\u5206\u6bd4\u6216\u5207\u6362 hardcore \u6a21\u5f0f\u5f00/\u5173
Commands.Description.inspect=\u67e5\u770b\u73a9\u5bb6\u8be6\u7ec6\u7684 mcMMO \u4fe1\u606f
Commands.Description.mcability=\u5207\u6362 mcMMO \u6280\u80fd\u80fd\u5426\u88ab\u53f3\u952e\u6fc0\u6d3b
Commands.Description.mcgod=\u5207\u6362 mcMMO \u4e0a\u5e1d\u6a21\u5f0f
Commands.Description.mchud=\u53d8\u66f4\u4f60\u7684 mcMMO HUD \u6837\u5f0f
Commands.Description.mcmmo=\u663e\u793a mcMMO \u7684\u7b80\u5355\u63cf\u8ff0
Commands.Description.mcnotify=\u5207\u6362 mcMMO \u6280\u80fd\u63d0\u793a\u5f00\u5173
Commands.Description.mcpurge=\u6e05\u9664\u6ca1\u6709 mcMMO \u7b49\u7ea7\u7684\u73a9\u5bb6\u548c\u8d85\u8fc7 {0} \u4e2a\u6708\u6ca1\u6709\u767b\u5f55\u7684\u73a9\u5bb6\u7684 mcMMO \u6570\u636e
Commands.Description.mcrank=\u663e\u793a\u73a9\u5bb6\u7684 mcMMO \u6392\u540d
Commands.Description.mcrefresh=\u5237\u65b0\u6240\u6709\u7684 mcMMO \u51b7\u5374\u65f6\u95f4
Commands.Description.mcremove=\u4ece mcMMO \u6570\u636e\u5e93\u4e2d\u79fb\u9664\u4e00\u4e2a\u73a9\u5bb6
Commands.Description.mcstats=\u663e\u793a\u4f60\u7684 mcMMO \u7b49\u7ea7\u548c\u7ecf\u9a8c
Commands.Description.mctop=\u663e\u793a mcMMO \u6392\u884c\u699c
Commands.Description.mmoedit=\u7ed9\u73a9\u5bb6\u8bbe\u7f6e mcMMO \u7b49\u7ea7
Commands.Description.mmoupdate=\u4ece\u4e00\u4e2a\u65e7\u7684 mcMMO \u6570\u636e\u5e93\u8fc1\u79fb\u5230\u5f53\u524d\u6570\u636e\u5e93\u5185
Commands.Description.mcconvert=\u8f6c\u6362\u6570\u636e\u5e93\u7684\u7c7b\u578b\u6216\u7ecf\u9a8c\u503c\u516c\u5f0f\u7684\u7c7b\u578b
Commands.Description.mmoshowdb=\u663e\u793a\u5f53\u524d\u6570\u636e\u5e93\u7c7b\u578b\u540d\u79f0 (\u8fc7\u540e\u66f4\u65b0\u4f7f\u7528 /mmoupdate)
Commands.Description.party=\u63a7\u5236\u5404\u79cd mcMMO \u961f\u4f0d\u8bbe\u7f6e
Commands.Description.partychat=\u5207\u6362 mcMMO \u961f\u4f0d\u804a\u5929\u6216\u53d1\u9001\u961f\u4f0d\u804a\u5929\u6d88\u606f
Commands.Description.ptp=\u4f20\u9001\u81f3 mcMMO \u961f\u4f0d\u6210\u5458
Commands.Description.Skill=\u663e\u793a {0} \u8be6\u7ec6\u7684mcMMO\u6280\u80fd\u4fe1\u606f
Commands.Description.skillreset=\u91cd\u7f6e mcMMO \u7b49\u7ea7
Commands.Description.vampirism=\u66f4\u6539 mcMMO \u69a8\u53d6\u767e\u5206\u6bd4 \u6216\u5207\u6362 vampirism \u6a21\u5f0f\u5f00/\u5173
Commands.Description.xplock=\u9501\u5b9a\u6307\u5b9a mcMMO \u6280\u80fd\u7684\u7ecf\u9a8c\u6761
Commands.Description.xprate=\u66f4\u6539 mcMMO \u7ecf\u9a8c\u500d\u7387\u6216\u5f00\u542f\u4e00\u4e2a mcMMO \u7ecf\u9a8c\u7ffb\u500d\u4e8b\u4ef6
UpdateChecker.Outdated=\u4f60\u6b63\u4f7f\u7528\u7740\u4e00\u4e2a\u8fc7\u65f6\u7248\u672c\u7684 mcMMO !
UpdateChecker.NewAvailable=\u53d1\u73b0 BukkitDev \u4e0a\u6709\u53ef\u7528\u65b0\u7248\u672c.
Scoreboard.Header.PlayerStats=mcMMO \u7edf\u8ba1
Scoreboard.Header.PlayerCooldowns=mcMMO \u51b7\u5374
Scoreboard.Header.PlayerRank=mcMMO \u6392\u540d
Scoreboard.Header.PlayerInspect=mcMMO \u7edf\u8ba1: {0}
Scoreboard.Header.PowerLevel=\u6218\u6597\u529b
Scoreboard.Misc.PowerLevel=[[GOLD]]\u6218\u6597\u529b
Scoreboard.Misc.Level=[[DARK_AQUA]]\u7b49\u7ea7
Scoreboard.Misc.CurrentXP=[[GREEN]]\u5f53\u524d\u7ecf\u9a8c
Scoreboard.Misc.RemainingXP=\u5347\u7ea7\u6240\u9700\u7ecf\u9a8c
Scoreboard.Misc.Cooldown=[[LIGHT_PURPLE]]\u51b7\u5374
Scoreboard.Misc.Overall=[[GOLD]]\u603b\u4f53
Scoreboard.Misc.Ability=\u80fd\u529b
Recovery.Notice=\u6ce8\u610f: mcMMO[[DARK_RED]]\u65e0\u6cd5\u8f7d\u5165\u4f60\u7684\u6570\u636e.[[RED]] \u91cd\u8bd55\u6b21...
Recovery.Success=[[GREEN]]\u6210\u529f!\u4f60\u7684mcMMO\u6570\u636e\u5df2\u8f7d\u5165.
Recovery.Failure=mcMMO\u65e0\u6cd5\u8f7d\u5165\u4f60\u7684\u6570\u636e,\u4f60\u53ef\u80fd\u9700\u8981\u8054\u7cfb[[AQUA]]\u6e38\u620f\u7ba1\u7406\u5458\n[[YELLOW]]\u4f60\u53ef\u4ee5\u7ee7\u7eed\u6e38\u620f,\u4f46\u4f60[[BOLD]]\u65e0\u6cd5\u5f97\u5230mcMMO\u7b49\u7ea7[[YELLOW]]\u548c\u4efb\u4f55\u7ecf\u9a8c[[BOLD]]\u6240\u6709\u6570\u636e\u4e0d\u4f1a\u88ab\u4fdd\u5b58[[YELLOW]].
Recovery.AdminFailureNotice=[[DARK_RED]][A][[RED]]mcMMO\u65e0\u6cd5\u8f7d\u5165\u73a9\u5bb6[[YELLOW]]{0}[[RED]]\u7684\u6570\u636e. [[LIGHT_PURPLE]]\u8bf7\u68c0\u67e5\u4f60\u7684\u6570\u636e\u5e93\u6216\u8bbe\u7f6e.

File diff suppressed because it is too large Load Diff

View File

@@ -1,545 +0,0 @@
# This file defines the rank level requirements for a subskill.
# You cannot alter how many ranks a skill has, that is coded into mcMMO directly.
# You can however, change when they unlock, if you make all ranks of a skill level 0 for example every player will have the most powerful version of that skill right away.
# Retro Mode and Standard have separate config settings to make it easier for server owners to understand the difference between the two.
# Retro Mode is setup to be an entirely cosmetic change, keeping the old 0-1000 feeling of mcMMO.
# Retro Mode has 10x faster leveling and 10x higher skill requirements, if you do the math you can see its the same as Standard and only cosmetic!.
###
Alchemy:
Catalysis:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
Concoctions:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Archery:
ArrowRetrieval:
Standard:
Rank_1: 2
RetroMode:
Rank_1: 20
SkillShot:
Standard:
Rank_1: 5
Rank_2: 10
Rank_3: 15
Rank_4: 20
Rank_5: 25
Rank_6: 30
Rank_7: 35
Rank_8: 40
Rank_9: 45
Rank_10: 50
Rank_11: 55
Rank_12: 60
Rank_13: 65
Rank_14: 70
Rank_15: 75
Rank_16: 80
Rank_17: 85
Rank_18: 90
Rank_19: 95
Rank_20: 100
RetroMode:
Rank_1: 50
Rank_2: 100
Rank_3: 150
Rank_4: 200
Rank_5: 250
Rank_6: 300
Rank_7: 350
Rank_8: 400
Rank_9: 450
Rank_10: 500
Rank_11: 550
Rank_12: 600
Rank_13: 650
Rank_14: 700
Rank_15: 750
Rank_16: 800
Rank_17: 850
Rank_18: 900
Rank_19: 950
Rank_20: 1000
Acrobatics:
Dodge:
Standard:
Rank_1: 2
RetroMode:
Rank_1: 20
Axes:
SkullSplitter:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
CriticalStrikes:
Standard:
Rank_1: 2
RetroMode:
Rank_1: 20
GreaterImpact:
Standard:
Rank_1: 25
RetroMode:
Rank_1: 250
ArmorImpact:
Standard:
Rank_1: 5
Rank_2: 10
Rank_3: 15
Rank_4: 20
Rank_5: 25
Rank_6: 30
Rank_7: 35
Rank_8: 40
Rank_9: 45
Rank_10: 50
Rank_11: 55
Rank_12: 60
Rank_13: 65
Rank_14: 70
Rank_15: 75
Rank_16: 80
Rank_17: 85
Rank_18: 90
Rank_19: 95
Rank_20: 100
RetroMode:
Rank_1: 50
Rank_2: 100
Rank_3: 150
Rank_4: 200
Rank_5: 250
Rank_6: 300
Rank_7: 350
Rank_8: 400
Rank_9: 450
Rank_10: 500
Rank_11: 550
Rank_12: 600
Rank_13: 650
Rank_14: 700
Rank_15: 750
Rank_16: 800
Rank_17: 850
Rank_18: 900
Rank_19: 950
Rank_20: 1000
AxeMastery:
Standard:
Rank_1: 5
Rank_2: 10
Rank_3: 15
Rank_4: 20
RetroMode:
Rank_1: 50
Rank_2: 100
Rank_3: 150
Rank_4: 200
Taming:
BeastLore:
Standard:
Rank_1: 2
RetroMode:
Rank_1: 20
Gore:
Standard:
Rank_1: 15
RetroMode:
Rank_1: 150
CallOfTheWild:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
Pummel:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
FastFoodService:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
EnvironmentallyAware:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
ThickFur:
Standard:
Rank_1: 25
RetroMode:
Rank_1: 250
HolyHound:
Standard:
Rank_1: 35
RetroMode:
Rank_1: 350
ShockProof:
Standard:
Rank_1: 50
RetroMode:
Rank_1: 500
SharpenedClaws:
Standard:
Rank_1: 75
RetroMode:
Rank_1: 750
Smelting:
FluxMining:
Standard:
Rank_1: 25
Retro:
Rank_1: 250
UnderstandingTheArt:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Salvage:
AdvancedSalvage:
Standard:
Rank_1: 35
RetroMode:
Rank_1: 350
ArcaneSalvage:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Mining:
SuperBreaker:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
# For now make sure rank 1 is the same as blast mining rank 1, it's a bit hacky, I'll fix it later
BiggerBombs:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
# For now make sure rank 1 is the same as blast mining rank 1, it's a bit hacky, I'll fix it later
DemolitionsExpertise:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
BlastMining:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Herbalism:
GreenTerra:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
GreenThumb:
Standard:
Rank_1: 25
Rank_2: 50
Rank_3: 75
Rank_4: 100
RetroMode:
Rank_1: 250
Rank_2: 500
Rank_3: 750
Rank_4: 1000
FarmersDiet:
Standard:
Rank_1: 20
Rank_2: 40
Rank_3: 60
Rank_4: 80
Rank_5: 100
RetroMode:
Rank_1: 200
Rank_2: 400
Rank_3: 600
Rank_4: 800
Rank_5: 1000
Fishing:
MagicHunter:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
Shake:
Standard:
Rank_1: 15
RetroMode:
Rank_1: 150
MasterAngler:
Standard:
Rank_1: 50
RetroMode:
Rank_1: 500
IceFishing:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
FishermansDiet:
Standard:
Rank_1: 20
Rank_2: 40
Rank_3: 60
Rank_4: 80
Rank_5: 100
RetroMode:
Rank_1: 200
Rank_2: 400
Rank_3: 600
Rank_4: 800
Rank_5: 1000
TreasureHunter:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Swords:
CounterAttack:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
Rupture:
Standard:
Rank_1: 5
Rank_2: 15
Rank_3: 75
Rank_4: 90
RetroMode:
Rank_1: 50
Rank_2: 150
Rank_3: 750
Rank_4: 900
SerratedStrikes:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
Unarmed:
Berserk:
Standard:
Rank_1: 10
RetroMode:
Rank_1: 100
ArrowDeflect:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
Disarm:
Standard:
Rank_1: 25
RetroMode:
Rank_1: 250
IronGrip:
Standard:
Rank_1: 60
RetroMode:
Rank_1: 600
IronArmStyle:
Standard:
Rank_1: 2
Rank_2: 25
Rank_3: 50
Rank_4: 75
Rank_5: 100
RetroMode:
Rank_1: 20
Rank_2: 250
Rank_3: 500
Rank_4: 750
Rank_5: 1000
Woodcutting:
Splinter:
Standard:
Rank_1: 5
Rank_2: 30
Rank_3: 55
RetroMode:
Rank_1: 50
Rank_2: 300
Rank_3: 550
TreeFeller:
Standard:
Rank_1: 5
Rank_2: 25
Rank_3: 50
Rank_4: 75
Rank_5: 100
RetroMode:
Rank_1: 50
Rank_2: 250
Rank_3: 500
Rank_4: 750
Rank_5: 1000
BarkSurgeon:
Standard:
Rank_1: 70
Rank_2: 80
Rank_3: 95
RetroMode:
Rank_1: 700
Rank_2: 800
Rank_3: 950
NaturesBounty:
Standard:
Rank_1: 40
Rank_2: 60
Rank_3: 90
RetroMode:
Rank_1: 400
Rank_2: 600
Rank_3: 900
HarvestLumber:
Standard:
Rank_1: 1
RetroMode:
Rank_1: 10
LeafBlower:
Standard:
Rank_1: 15
Rank_2: 35
Rank_3: 65
RetroMode:
Rank_1: 150
Rank_2: 350
Rank_3: 650
Excavation:
GigaDrillBreaker:
Standard:
Rank_1: 5
RetroMode:
Rank_1: 50
Archaeology:
Standard:
Rank_1: 5
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 50
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000
Repair:
RepairMastery:
Standard:
Rank_1: 20
RetroMode:
Rank_1: 200
SuperRepair:
Standard:
Rank_1: 40
RetroMode:
Rank_1: 400
ArcaneForging:
Standard:
Rank_1: 10
Rank_2: 25
Rank_3: 35
Rank_4: 50
Rank_5: 65
Rank_6: 75
Rank_7: 85
Rank_8: 100
RetroMode:
Rank_1: 100
Rank_2: 250
Rank_3: 350
Rank_4: 500
Rank_5: 650
Rank_6: 750
Rank_7: 850
Rank_8: 1000

View File

@@ -1,62 +0,0 @@
# A volume of 1.0 is pretty loud
# Keep this in mind
Sounds:
# 1.0 = Max volume
# 0.0 = No Volume
MasterVolume: 1.0
ANVIL:
Enable: true
Volume: 1.0
Pitch: 0.3
#Fizz, and Pop make use of a adding and multiplying random numbers together to make a unique pitch everytime they are heard
FIZZ:
Enable: true
Volume: 0.5
LEVEL_UP:
Enable: true
Volume: 0.75
Pitch: 0.5
ITEM_BREAK:
Enable: true
Volume: 1.0
Pitch: 1.0
#Fizz, and Pop make use of a adding and multiplying random numbers together to make a unique pitch everytime they are heard
POP:
Enable: true
Volume: 0.2
CHIMAERA_WING:
Enable: true
Volume: 1.0
Pitch: 0.6
ROLL_ACTIVATED:
Enable: true
Volume: 1.0
Pitch: 0.7
SKILL_UNLOCKED:
Enable: true
Volume: 1.0
Pitch: 1.4
DEFLECT_ARROWS:
Enable: true
Volume: 1.0
Pitch: 2.0
TOOL_READY:
Enable: true
Volume: 1.0
Pitch: 0.4
ABILITY_ACTIVATED_GENERIC:
Enable: true
Volume: 1.0
Pitch: 0.1
ABILITY_ACTIVATED_BERSERK:
Enable: true
Volume: 0.5
Pitch: 1.7
TIRED:
Enable: true
Volume: 1.0
Pitch: 1.7
BLEED:
Enable: true
Volume: 2.0
Pitch: 2.0

View File

@@ -1,27 +0,0 @@
import Config.Libs as Libs
// Config is located in <root>/buildSrc/src/main/java/Config.kt
// It provides a bunch of constant values we use as dependency
// strings, so we don't have to duplicate a bunch of them in
// various scripts. The import as allows for shorthand.
plugins {
`java-library` // This is already provided, but for static compilation,
// we declare it here so we can use the IDE static type references
}
dependencies {
compile(Libs.configurate) { // Configurate-Yaml dependency, inherits Configurate-core
exclude(Deps.Groups.guava, Deps.Modules.guava) // Exclude guava
exclude(Deps.Groups.checker, Deps.Modules.checker) // Exclude checkerframework
}
compile(Libs.flowmath) // flowpowered math, for more maths.
compile(Libs.jdbc) // Database connectors
compile(Libs.juli) // Database connectors
testCompile(Libs.junitDep) // junit for testing
// Spigot for in-dev dependency
compileOnly(Libs.Bukkit.`1_13`.spigotApi) { // Spigot only for temporary usage in core
isTransitive = false // Don't include spigot api's dependencies
}
}

View File

@@ -1,73 +0,0 @@
package com.gmail.nossr50.core;
import com.gmail.nossr50.core.data.database.DatabaseManager;
import com.gmail.nossr50.core.mcmmo.event.EventCommander;
import com.gmail.nossr50.core.mcmmo.plugin.Plugin;
import com.gmail.nossr50.core.mcmmo.server.Server;
import com.gmail.nossr50.core.mcmmo.tasks.TaskScheduler;
import com.gmail.nossr50.core.platform.Platform;
import com.gmail.nossr50.core.util.ModManager;
import com.gmail.nossr50.core.util.experience.FormulaManager;
import com.gmail.nossr50.core.util.upgrade.UpgradeManager;
import java.io.File;
import java.util.logging.Logger;
public class McmmoCore {
//TODO: Wire all this stuff
public static Plugin p;
private static EventCommander eventCommander;
private static Logger logger;
private static Platform platform;
private static boolean retroModeEnabled;
//Why do all these things need to be here? Sigh...
private static DatabaseManager databaseManager;
private static UpgradeManager upgradeManager; //TODO: I can't even remember what this one did
private static FormulaManager formulaManager;
private static ModManager modManager; //TODO: Probably need to rewrite this
/**
* Returns our Logger
* @return the logger
*/
public static Logger getLogger()
{
return logger;
}
public static EventCommander getEventCommander() {
return eventCommander;
}
public static Server getServer() {
return platform.getServer();
}
public static TaskScheduler getTaskScheduler()
{
return platform.getScheduler();
}
public static java.io.InputStream getResource(String path)
{
return platform.getResource(path);
}
public static File getDataFolderPath()
{
return platform.getDataFolderPath();
}
public static DatabaseManager getDatabaseManager() { return databaseManager; }
public static UpgradeManager getUpgradeManager() { return upgradeManager; }
public static FormulaManager getFormulaManager() { return formulaManager; }
public static boolean isRetroModeEnabled() { return retroModeEnabled; }
public static ModManager getModManager() { return modManager; }
public static String getModDataFolderPath() { return platform.getModDataFolderPath(); }
}

View File

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

View File

@@ -1,89 +0,0 @@
package com.gmail.nossr50.core.api;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.core.mcmmo.entity.Living;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.core.skills.SuperAbilityType;
public final class AbilityAPI {
private AbilityAPI() {
}
public static boolean berserkEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.BERSERK);
}
public static boolean gigaDrillBreakerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GIGA_DRILL_BREAKER);
}
public static boolean greenTerraEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.GREEN_TERRA);
}
public static boolean serratedStrikesEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SERRATED_STRIKES);
}
public static boolean skullSplitterEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SKULL_SPLITTER);
}
public static boolean superBreakerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.SUPER_BREAKER);
}
public static boolean treeFellerEnabled(Player player) {
return UserManager.getPlayer(player).getAbilityMode(SuperAbilityType.TREE_FELLER);
}
public static boolean isAnyAbilityEnabled(Player player) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
for (SuperAbilityType ability : SuperAbilityType.values()) {
if (mcMMOPlayer.getAbilityMode(ability)) {
return true;
}
}
return false;
}
public static void resetCooldowns(Player player) {
UserManager.getPlayer(player).resetCooldowns();
}
public static void setBerserkCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.BERSERK, cooldown);
}
public static void setGigaDrillBreakerCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GIGA_DRILL_BREAKER, cooldown);
}
public static void setGreenTerraCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.GREEN_TERRA, cooldown);
}
public static void setSerratedStrikesCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SERRATED_STRIKES, cooldown);
}
public static void setSkullSplitterCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SKULL_SPLITTER, cooldown);
}
public static void setSuperBreakerCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.SUPER_BREAKER, cooldown);
}
public static void setTreeFellerCooldown(Player player, long cooldown) {
UserManager.getPlayer(player).setAbilityDATS(SuperAbilityType.TREE_FELLER, cooldown);
}
public static boolean isBleeding(Living entity) {
return BleedTimerTask.isBleeding(entity);
}
}

View File

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

View File

@@ -1,79 +0,0 @@
package com.gmail.nossr50.core.chat;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.party.Party;
import com.gmail.nossr50.core.events.chat.McMMOChatEvent;
import com.gmail.nossr50.core.events.chat.McMMOPartyChatEvent;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.mcmmo.entity.Player;
public abstract class ChatManager {
protected boolean useDisplayNames;
protected String chatPrefix;
protected String senderName;
protected String displayName;
protected String message;
protected ChatManager(boolean useDisplayNames, String chatPrefix) {
this.useDisplayNames = useDisplayNames;
this.chatPrefix = chatPrefix;
}
protected void handleChat(McMMOChatEvent event) {
McmmoCore.getEventCommander().callEvent(event);
if (event.isCancelled()) {
return;
}
senderName = event.getSender();
displayName = useDisplayNames ? event.getDisplayName() : senderName;
message = LocaleLoader.formatString(chatPrefix, displayName) + " " + event.getMessage();
sendMessage();
/*
* Party Chat Spying
* Party messages will be copied to people with the mcmmo.admin.chatspy permission node
*/
if (event instanceof McMMOPartyChatEvent) {
//We need to grab the party chat name
McMMOPartyChatEvent partyChatEvent = (McMMOPartyChatEvent) event;
//Find the people with permissions
for (Player player : McmmoCore.getServer().getOnlinePlayers()) {
//Check for toggled players
if (UserManager.getPlayer(player).isPartyChatSpying()) {
Party adminParty = UserManager.getPlayer(player).getParty();
//Only message admins not part of this party
if (adminParty != null) {
//TODO: Incorporate JSON
if (!adminParty.getName().equalsIgnoreCase(partyChatEvent.getParty()))
player.sendMessage(LocaleLoader.getString("Commands.AdminChatSpy.Chat", partyChatEvent.getParty(), message));
} else {
player.sendMessage(LocaleLoader.getString("Commands.AdminChatSpy.Chat", partyChatEvent.getParty(), message));
}
}
}
}
}
public void handleChat(String senderName, String message) {
handleChat(senderName, senderName, message, false);
}
public void handleChat(Player player, String message, boolean isAsync) {
handleChat(player.getName(), player.getDisplayName(), message, isAsync);
}
public void handleChat(String senderName, String displayName, String message) {
handleChat(senderName, displayName, message, false);
}
public abstract void handleChat(String senderName, String displayName, String message, boolean isAsync);
protected abstract void sendMessage();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,124 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.skills.SubSkillType;
import com.gmail.nossr50.core.skills.subskills.AbstractSubSkill;
import java.util.ArrayList;
import java.util.List;
public class RankConfig extends ConfigValidated {
private static RankConfig instance;
public RankConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"skillranks.yml", true);
this.instance = this;
}
public static RankConfig getInstance() {
if (instance == null)
return new RankConfig();
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() {
List<String> reason = new ArrayList<String>();
/*
* In the future this method will check keys for all skills, but for now it only checks overhauled skills
*/
checkKeys(reason);
return reason;
}
/**
* Returns the unlock level for a subskill depending on the gamemode
*
* @param subSkillType target subskill
* @param rank the rank we are checking
* @return the level requirement for a subskill at this particular rank
*/
public int getSubSkillUnlockLevel(SubSkillType subSkillType, int rank) {
String key = subSkillType.getRankConfigAddress();
return findRankByRootAddress(rank, key);
}
/**
* Returns the unlock level for a subskill depending on the gamemode
*
* @param abstractSubSkill target subskill
* @param rank the rank we are checking
* @return the level requirement for a subskill at this particular rank
*/
public int getSubSkillUnlockLevel(AbstractSubSkill abstractSubSkill, int rank) {
String key = abstractSubSkill.getPrimaryKeyName() + "." + abstractSubSkill.getConfigKeyName();
return findRankByRootAddress(rank, key);
}
/**
* Returns the unlock level for a subskill depending on the gamemode
*
* @param key root address of the subskill in the rankskills.yml file
* @param rank the rank we are checking
* @return the level requirement for a subskill at this particular rank
*/
private int findRankByRootAddress(int rank, String key) {
String scalingKey = MainConfig.getInstance().getIsRetroMode() ? ".RetroMode." : ".Standard.";
String targetRank = "Rank_" + rank;
key += scalingKey;
key += targetRank;
return getIntValue(key);
}
/**
* Checks for valid keys for subskill ranks
*/
private void checkKeys(List<String> reasons) {
//For now we will only check ranks of stuff I've overhauled
for (SubSkillType subSkillType : SubSkillType.values()) {
//Keeping track of the rank requirements and making sure there are no logical errors
int curRank = 0;
int prevRank = 0;
for (int x = 0; x < subSkillType.getNumRanks(); x++) {
if (curRank > 0)
prevRank = curRank;
curRank = getSubSkillUnlockLevel(subSkillType, x);
//Do we really care if its below 0? Probably not
if (curRank < 0) {
reasons.add(subSkillType.getAdvConfigAddress() + ".Rank_Levels.Rank_" + curRank + ".LevelReq should be above or equal to 0!");
}
if (prevRank > curRank) {
//We're going to allow this but we're going to warn them
plugin.getLogger().info("You have the ranks for the subskill " + subSkillType.toString() + " set up poorly, sequential ranks should have ascending requirements");
}
}
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,74 +0,0 @@
package com.gmail.nossr50.core.config;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.mcmmo.world.World;
import java.io.*;
import java.util.ArrayList;
/**
* Blacklist certain features in certain worlds
*/
public class WorldBlacklist {
private static ArrayList<String> blacklist;
private final String blackListFileName = "world_blacklist.txt";
public WorldBlacklist() {
blacklist = new ArrayList<>();
init();
}
public static boolean isWorldBlacklisted(World world) {
for (String s : blacklist) {
if (world.getName().equalsIgnoreCase(s))
return true;
}
return false;
}
public void init() {
//Make the blacklist file if it doesn't exist
//TODO: Check if this works
File blackListFile = new File(McmmoCore.getDataFolderPath().getAbsoluteFile() + File.separator + blackListFileName);
try {
if (!blackListFile.exists())
blackListFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
//Load up the blacklist
loadBlacklist(blackListFile);
//registerFlags();
}
private void loadBlacklist(File blackListFile) {
try {
FileReader fileReader = new FileReader(blackListFile);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String currentLine;
while ((currentLine = bufferedReader.readLine()) != null) {
if (currentLine.length() == 0)
continue;
if (!blacklist.contains(currentLine))
blacklist.add(currentLine);
}
//Close readers
bufferedReader.close();
fileReader.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
McmmoCore.getLogger().info(blacklist.size() + " entries in mcMMO World Blacklist");
}
}

View File

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

View File

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

View File

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

View File

@@ -1,95 +0,0 @@
package com.gmail.nossr50.core.config.mods;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.ConfigCollections;
import com.gmail.nossr50.core.datatypes.mods.CustomBlock;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class CustomBlockConfig extends ConfigCollections {
public List<Material> customExcavationBlocks = new ArrayList<>();
public List<Material> customHerbalismBlocks = new ArrayList<>();
public List<Material> customMiningBlocks = new ArrayList<>();
public List<Material> customOres = new ArrayList<>();
public List<Material> customLogs = new ArrayList<>();
public List<Material> customLeaves = new ArrayList<>();
public List<Material> customAbilityBlocks = new ArrayList<>();
public HashMap<Material, CustomBlock> customBlockMap = new HashMap<>();
private boolean needsUpdate = false;
protected CustomBlockConfig(String fileName) {
super(McmmoCore.getDataFolderPath().getPath() + "mods", fileName, false);
loadKeys();
}
@Override
protected void loadKeys() {
loadBlocks("Excavation", customExcavationBlocks);
loadBlocks("Herbalism", customHerbalismBlocks);
loadBlocks("Mining", customMiningBlocks);
loadBlocks("Woodcutting", null);
loadBlocks("Ability_Blocks", customAbilityBlocks);
if (needsUpdate) {
needsUpdate = false;
backup();
}
}
private void loadBlocks(String skillType, List<Material> blockList) {
if (needsUpdate) {
return;
}
ConfigurationSection skillSection = config.getConfigurationSection(skillType);
if (skillSection == null) {
return;
}
Set<String> skillConfigSet = skillSection.getKeys(false);
for (String blockName : skillConfigSet) {
if (config.contains(skillType + "." + blockName + ".Drop_Item")) {
needsUpdate = true;
return;
}
String[] blockInfo = blockName.split("[|]");
Material blockMaterial = Material.matchMaterial(blockInfo[0]);
if (blockMaterial == null) {
plugin.getLogger().warning("Invalid material name. This item will be skipped. - " + blockInfo[0]);
continue;
}
if (blockList != null) {
blockList.add(blockMaterial);
}
if (skillType.equals("Ability_Blocks")) {
continue;
}
int xp = getIntValue(skillType + "." + blockName + ".XP_Gain");
int smeltingXp = 0;
if (skillType.equals("Mining") && getBooleanValue(skillType + "." + blockName + ".Is_Ore")) {
customOres.add(blockMaterial);
smeltingXp = getIntValue(skillType + "." + blockName + ".Smelting_XP_Gain", xp / 10);
} else if (skillType.equals("Woodcutting")) {
if (getBooleanValue(skillType + "." + blockName + ".Is_Log")) {
customLogs.add(blockMaterial);
} else {
customLeaves.add(blockMaterial);
xp = 0; // Leaves don't grant XP
}
}
customBlockMap.put(blockMaterial, new CustomBlock(xp, getBooleanValue(skillType + "." + blockName + ".Double_Drops_Enabled"), smeltingXp));
}
}
}

View File

@@ -1,357 +0,0 @@
package com.gmail.nossr50.core.config.treasure;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.Config;
import com.gmail.nossr50.core.mcmmo.colors.ChatColor;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
import com.gmail.nossr50.core.skills.treasure.*;
import com.gmail.nossr50.core.util.EnchantmentUtils;
import com.gmail.nossr50.core.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class TreasureConfig extends Config {
private static TreasureConfig instance;
public HashMap<String, List<ExcavationTreasure>> excavationMap = new HashMap<String, List<ExcavationTreasure>>();
public HashMap<EntityType, List<ShakeTreasure>> shakeMap = new HashMap<EntityType, List<ShakeTreasure>>();
public HashMap<String, List<HylianTreasure>> hylianMap = new HashMap<String, List<HylianTreasure>>();
public HashMap<Rarity, List<FishingTreasure>> fishingRewards = new HashMap<Rarity, List<FishingTreasure>>();
public HashMap<Rarity, List<EnchantmentTreasure>> fishingEnchantments = new HashMap<Rarity, List<EnchantmentTreasure>>();
private TreasureConfig() {
super(McmmoCore.getDataFolderPath().getAbsoluteFile(),"treasures.yml");
loadKeys();
validate();
}
public static TreasureConfig getInstance() {
if (instance == null) {
instance = new TreasureConfig();
}
return instance;
}
@Override
protected boolean validateKeys() {
// Validate all the settings!
List<String> reason = new ArrayList<String>();
for (String tier : config.getConfigurationSection("Enchantment_Drop_Rates").getKeys(false)) {
double totalEnchantDropRate = 0;
double totalItemDropRate = 0;
for (Rarity rarity : Rarity.values()) {
double enchantDropRate = getDoubleValue("Enchantment_Drop_Rates." + tier + "." + rarity.toString());
double itemDropRate = getDoubleValue("Item_Drop_Rates." + tier + "." + rarity.toString());
if ((enchantDropRate < 0.0 || enchantDropRate > 100.0) && rarity != Rarity.RECORD) {
reason.add("The enchant drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!");
}
if (itemDropRate < 0.0 || itemDropRate > 100.0) {
reason.add("The item drop rate for " + tier + " items that are " + rarity.toString() + "should be between 0.0 and 100.0!");
}
totalEnchantDropRate += enchantDropRate;
totalItemDropRate += itemDropRate;
}
if (totalEnchantDropRate < 0 || totalEnchantDropRate > 100.0) {
reason.add("The total enchant drop rate for " + tier + " should be between 0.0 and 100.0!");
}
if (totalItemDropRate < 0 || totalItemDropRate > 100.0) {
reason.add("The total item drop rate for " + tier + " should be between 0.0 and 100.0!");
}
}
return noErrorsInConfig(reason);
}
@Override
protected void loadKeys() {
if (config.getConfigurationSection("Treasures") != null) {
backup();
return;
}
loadTreasures("Fishing");
loadTreasures("Excavation");
loadTreasures("Hylian_Luck");
loadEnchantments();
for (EntityType entity : EntityType.values()) {
if (entity.isAlive()) {
loadTreasures("Shake." + entity.toString());
}
}
}
private void loadTreasures(String type) {
boolean isFishing = type.equals("Fishing");
boolean isShake = type.contains("Shake");
boolean isExcavation = type.equals("Excavation");
boolean isHylian = type.equals("Hylian_Luck");
ConfigurationSection treasureSection = config.getConfigurationSection(type);
if (treasureSection == null) {
return;
}
// Initialize fishing HashMap
for (Rarity rarity : Rarity.values()) {
if (!fishingRewards.containsKey(rarity)) {
fishingRewards.put(rarity, (new ArrayList<FishingTreasure>()));
}
}
for (String treasureName : treasureSection.getKeys(false)) {
// Validate all the things!
List<String> reason = new ArrayList<String>();
String[] treasureInfo = treasureName.split("[|]");
String materialName = treasureInfo[0];
/*
* Material, Amount, and Data
*/
Material material;
if (materialName.contains("INVENTORY")) {
// Use magic material BEDROCK to know that we're grabbing something from the inventory and not a normal treasure
if (!shakeMap.containsKey(EntityType.PLAYER))
shakeMap.put(EntityType.PLAYER, new ArrayList<ShakeTreasure>());
shakeMap.get(EntityType.PLAYER).add(new ShakeTreasure(new ItemStack(Material.BEDROCK, 1, (byte) 0), 1, getInventoryStealDropChance(), getInventoryStealDropLevel()));
continue;
} else {
material = Material.matchMaterial(materialName);
}
int amount = getIntValue(type + "." + treasureName + ".Amount");
short data = (treasureInfo.length == 2) ? Short.parseShort(treasureInfo[1]) : (short) getIntValue(type + "." + treasureName + ".Data");
if (material == null) {
reason.add("Invalid material: " + materialName);
}
if (amount <= 0) {
reason.add("Amount of " + treasureName + " must be greater than 0! " + amount);
}
if (material != null && material.isBlock() && (data > 127 || data < -128)) {
reason.add("Data of " + treasureName + " is invalid! " + data);
}
/*
* XP, Drop Chance, and Drop Level
*/
int xp = getIntValue(type + "." + treasureName + ".XP");
double dropChance = getDoubleValue(type + "." + treasureName + ".Drop_Chance");
int dropLevel = getIntValue(type + "." + treasureName + ".Drop_Level");
if (xp < 0) {
reason.add(treasureName + " has an invalid XP value: " + xp);
}
if (dropChance < 0.0D) {
reason.add(treasureName + " has an invalid Drop_Chance: " + dropChance);
}
if (dropLevel < 0) {
reason.add(treasureName + " has an invalid Drop_Level: " + dropLevel);
}
/*
* Specific Types
*/
Rarity rarity = null;
if (isFishing) {
rarity = Rarity.getRarity(getStringValue(type + "." + treasureName + ".Rarity"));
if (rarity == null) {
reason.add("Invalid Rarity for item: " + treasureName);
}
}
/*
* Itemstack
*/
ItemStack item = null;
if (materialName.contains("POTION")) {
Material mat = Material.matchMaterial(materialName);
if (mat == null) {
reason.add("Potion format for Treasures.yml has changed");
} else {
item = new ItemStack(mat, amount, data);
PotionMeta itemMeta = (PotionMeta) item.getItemMeta();
PotionType potionType = null;
try {
potionType = PotionType.valueOf(getStringValue(type + "." + treasureName + ".PotionData.PotionType", "WATER"));
} catch (IllegalArgumentException ex) {
reason.add("Invalid Potion_Type: " + getStringValue(type + "." + treasureName + ".PotionData.PotionType", "WATER"));
}
boolean extended = getBooleanValue(type + "." + treasureName + ".PotionData.Extended", false);
boolean upgraded = getBooleanValue(type + "." + treasureName + ".PotionData.Upgraded", false);
itemMeta.setBasePotionData(new PotionData(potionType, extended, upgraded));
if (config.contains(type + "." + treasureName + ".Custom_Name")) {
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', getStringValue(type + "." + treasureName + ".Custom_Name")));
}
if (config.contains(type + "." + treasureName + ".Lore")) {
List<String> lore = new ArrayList<String>();
for (String s : getStringValueList(type + "." + treasureName + ".Lore")) {
lore.add(ChatColor.translateAlternateColorCodes('&', s));
}
itemMeta.setLore(lore);
}
item.setItemMeta(itemMeta);
}
} else if (material != null) {
item = new ItemStack(material, amount, data);
if (config.contains(type + "." + treasureName + ".Custom_Name")) {
ItemMeta itemMeta = item.getItemMeta();
itemMeta.setDisplayName(ChatColor.translateAlternateColorCodes('&', getStringValue(type + "." + treasureName + ".Custom_Name")));
item.setItemMeta(itemMeta);
}
if (config.contains(type + "." + treasureName + ".Lore")) {
ItemMeta itemMeta = item.getItemMeta();
List<String> lore = new ArrayList<String>();
for (String s : getStringValueList(type + "." + treasureName + ".Lore")) {
lore.add(ChatColor.translateAlternateColorCodes('&', s));
}
itemMeta.setLore(lore);
item.setItemMeta(itemMeta);
}
}
if (noErrorsInConfig(reason)) {
if (isFishing) {
fishingRewards.get(rarity).add(new FishingTreasure(item, xp));
} else if (isShake) {
ShakeTreasure shakeTreasure = new ShakeTreasure(item, xp, dropChance, dropLevel);
EntityType entityType = EntityType.valueOf(type.substring(6));
if (!shakeMap.containsKey(entityType))
shakeMap.put(entityType, new ArrayList<ShakeTreasure>());
shakeMap.get(entityType).add(shakeTreasure);
} else if (isExcavation) {
ExcavationTreasure excavationTreasure = new ExcavationTreasure(item, xp, dropChance, dropLevel);
List<String> dropList = getStringValueList(type + "." + treasureName + ".Drops_From");
for (String blockType : dropList) {
if (!excavationMap.containsKey(blockType))
excavationMap.put(blockType, new ArrayList<ExcavationTreasure>());
excavationMap.get(blockType).add(excavationTreasure);
}
} else if (isHylian) {
HylianTreasure hylianTreasure = new HylianTreasure(item, xp, dropChance, dropLevel);
List<String> dropList = getStringValueList(type + "." + treasureName + ".Drops_From");
for (String dropper : dropList) {
if (dropper.equals("Bushes")) {
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.FERN), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.TALL_GRASS), hylianTreasure);
for (Material species : Tag.SAPLINGS.getValues())
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(species), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.DEAD_BUSH), hylianTreasure);
continue;
}
if (dropper.equals("Flowers")) {
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.POPPY), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.DANDELION), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.BLUE_ORCHID), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.ALLIUM), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.AZURE_BLUET), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.ORANGE_TULIP), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.PINK_TULIP), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.RED_TULIP), hylianTreasure);
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(Material.WHITE_TULIP), hylianTreasure);
continue;
}
if (dropper.equals("Pots")) {
for (Material species : Tag.FLOWER_POTS.getValues())
AddHylianTreasure(StringUtils.getFriendlyConfigMaterialString(species), hylianTreasure);
continue;
}
AddHylianTreasure(dropper, hylianTreasure);
}
}
}
}
}
private void AddHylianTreasure(String dropper, HylianTreasure treasure) {
if (!hylianMap.containsKey(dropper))
hylianMap.put(dropper, new ArrayList<HylianTreasure>());
hylianMap.get(dropper).add(treasure);
}
private void loadEnchantments() {
for (Rarity rarity : Rarity.values()) {
if (rarity == Rarity.RECORD) {
continue;
}
if (!fishingEnchantments.containsKey(rarity)) {
fishingEnchantments.put(rarity, (new ArrayList<EnchantmentTreasure>()));
}
ConfigurationSection enchantmentSection = config.getConfigurationSection("Enchantments_Rarity." + rarity.toString());
if (enchantmentSection == null) {
return;
}
for (String enchantmentName : enchantmentSection.getKeys(false)) {
int level = getIntValue("Enchantments_Rarity." + rarity.toString() + "." + enchantmentName);
Enchantment enchantment = EnchantmentUtils.getByName(enchantmentName);
if (enchantment == null) {
plugin.getLogger().warning("Skipping invalid enchantment in treasures.yml: " + enchantmentName);
continue;
}
fishingEnchantments.get(rarity).add(new EnchantmentTreasure(enchantment, level));
}
}
}
public boolean getInventoryStealEnabled() {
return config.contains("Shake.PLAYER.INVENTORY");
}
public boolean getInventoryStealStacks() {
return getBooleanValue("Shake.PLAYER.INVENTORY.Whole_Stacks");
}
public double getInventoryStealDropChance() {
return getDoubleValue("Shake.PLAYER.INVENTORY.Drop_Chance");
}
public int getInventoryStealDropLevel() {
return getIntValue("Shake.PLAYER.INVENTORY.Drop_Level");
}
public double getItemDropRate(int tier, Rarity rarity) {
return getDoubleValue("Item_Drop_Rates.Tier_" + tier + "." + rarity.toString());
}
public double getEnchantmentDropRate(int tier, Rarity rarity) {
return getDoubleValue("Enchantment_Drop_Rates.Tier_" + tier + "." + rarity.toString());
}
}

View File

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

View File

@@ -1,53 +0,0 @@
package com.gmail.nossr50.core.datatypes;
import com.gmail.nossr50.core.mcmmo.world.Location;
public class LimitedSizeList {
private final int size;
public Location[] limitedSizeOrderedList;
public LimitedSizeList(int size) {
this.size = size;
limitedSizeOrderedList = new Location[size];
}
/**
* Adds objects to our limited size ordered list
* New objects are added to the front
*
* @param newItem
*/
public void add(Location newItem) {
Location[] newList = new Location[size];
for (int i = 0; i < size - 1; i++) {
if (i != 0)
newList[i] = limitedSizeOrderedList[i - 1];
else
newList[i] = newItem;
}
limitedSizeOrderedList = newList;
}
/**
* Returns true if the object is anywhere in our list
*
* @param targetLoc the object to check for
* @return true if the object is in our list
*/
public boolean contains(Location targetLoc) {
for (Location iter : limitedSizeOrderedList) {
if (iter == null)
continue;
if (iter.getX() == targetLoc.getX()
&& iter.getY() == targetLoc.getY()
&& iter.getZ() == targetLoc.getZ())
return true;
}
return false;
}
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.datatypes.experience;
public enum XPGainSource {
SELF,
VAMPIRISM, //From Vampirism kills
PASSIVE, //Smelting, Brewing, etc...
PARTY_MEMBERS, //From other members of a party
COMMAND,
CUSTOM, //Outside Sources
}

View File

@@ -1,34 +0,0 @@
package com.gmail.nossr50.core.datatypes.interactions;
/**
* This class helps define the types of information interactions we will have with players
*/
public enum NotificationType {
XP_GAIN("ExperienceGain"),
HARDCORE_MODE("HardcoreMode"),
NO_PERMISSION("NoPermission"),
SUBSKILL_UNLOCKED("SubSkillUnlocked"),
LEVEL_UP_MESSAGE("LevelUps"),
HOLIDAY("Holiday"),
SUBSKILL_MESSAGE("SubSkillInteraction"),
SUBSKILL_MESSAGE_FAILED("SubSkillFailed"),
TOOL("ToolReady"),
REQUIREMENTS_NOT_MET("RequirementsNotMet"),
ABILITY_OFF("AbilityOff"),
ABILITY_COOLDOWN("AbilityCoolDown"),
ABILITY_REFRESHED("AbilityRefreshed"),
SUPER_ABILITY("SuperAbilityInteraction"),
SUPER_ABILITY_ALERT_OTHERS("SuperAbilityAlertOthers"),
ITEM_MESSAGE("ItemMessage"),
PARTY_MESSAGE("PartyMessage");
final String niceName;
NotificationType(String niceName) {
this.niceName = niceName;
}
@Override
public String toString() {
return niceName;
}}

View File

@@ -1,9 +0,0 @@
package com.gmail.nossr50.core.datatypes.json;
public class CustomBaseComponent extends BaseComponent {
@Override
public BaseComponent duplicate() {
return this;
}
}

View File

@@ -1,29 +0,0 @@
package com.gmail.nossr50.core.datatypes.json;
public class McMMOUrl {
public static final String urlWebsite = "https://www.mcmmo.org";
public static final String urlDiscord = "https://discord.gg/bJ7pFS9";
public static final String urlPatreon = "https://www.patreon.com/com.gmail.nossr50";
public static final String urlWiki = "https://www.mcmmo.org/wiki/";
public static final String urlSpigot = "http://spigot.mcmmo.org";
public static final String urlTranslate = "https://www.mcmmo.org/translate/";
public static String getUrl(McMMOWebLinks webLinks) {
switch (webLinks) {
case WIKI:
return urlWiki;
case PATREON:
return urlPatreon;
case SPIGOT:
return urlSpigot;
case DISCORD:
return urlDiscord;
case WEBSITE:
return urlWebsite;
case HELP_TRANSLATE:
return urlTranslate;
default:
return "https://www.mcmmo.org";
}
}
}

View File

@@ -1,40 +0,0 @@
package com.gmail.nossr50.core.datatypes.json;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.util.StringUtils;
public enum McMMOWebLinks {
WEBSITE,
DISCORD,
PATREON,
SPIGOT,
HELP_TRANSLATE,
WIKI;
public String getUrl() {
return McMMOUrl.getUrl(this);
}
public String getNiceTitle() {
return StringUtils.getCapitalized(toString());
}
public String getLocaleDescription() {
switch (this) {
case WEBSITE:
return LocaleLoader.getString("JSON.URL.Website");
case DISCORD:
return LocaleLoader.getString("JSON.URL.Discord");
case PATREON:
return LocaleLoader.getString("JSON.URL.Patreon");
case HELP_TRANSLATE:
return LocaleLoader.getString("JSON.URL.Translation");
case SPIGOT:
return LocaleLoader.getString("JSON.URL.Spigot");
case WIKI:
return LocaleLoader.getString("JSON.URL.Wiki");
default:
return "";
}
}
}

View File

@@ -1,12 +0,0 @@
package com.gmail.nossr50.core.datatypes.meta;
/**
* This class is for storing mob names since we switch them to heart values
*/
public class OldName extends FixedMetadataValue {
public OldName(String oldName, mcMMO plugin) {
super(plugin, oldName);
}
}

View File

@@ -1,995 +0,0 @@
package com.gmail.nossr50.core.datatypes.player;
import com.gmail.nossr50.core.McmmoCore;
import com.gmail.nossr50.core.config.AdvancedConfig;
import com.gmail.nossr50.core.config.MainConfig;
import com.gmail.nossr50.core.config.WorldBlacklist;
import com.gmail.nossr50.core.config.experience.ExperienceConfig;
import com.gmail.nossr50.core.data.UserManager;
import com.gmail.nossr50.core.datatypes.chat.ChatMode;
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
import com.gmail.nossr50.core.datatypes.experience.XPGainSource;
import com.gmail.nossr50.core.datatypes.interactions.NotificationType;
import com.gmail.nossr50.core.datatypes.mods.CustomTool;
import com.gmail.nossr50.core.datatypes.party.Party;
import com.gmail.nossr50.core.datatypes.party.PartyTeleportRecord;
import com.gmail.nossr50.core.locale.LocaleLoader;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.mcmmo.item.ItemStack;
import com.gmail.nossr50.core.mcmmo.meta.Metadata;
import com.gmail.nossr50.core.mcmmo.meta.MetadataDefinitions;
import com.gmail.nossr50.core.mcmmo.world.Location;
import com.gmail.nossr50.core.party.PartyManager;
import com.gmail.nossr50.core.party.ShareHandler;
import com.gmail.nossr50.core.runnables.skills.AbilityDisableTask;
import com.gmail.nossr50.core.runnables.skills.BleedTimerTask;
import com.gmail.nossr50.core.runnables.skills.ToolLowerTask;
import com.gmail.nossr50.core.skills.PrimarySkillType;
import com.gmail.nossr50.core.skills.SkillManager;
import com.gmail.nossr50.core.skills.SuperAbilityType;
import com.gmail.nossr50.core.skills.ToolType;
import com.gmail.nossr50.core.skills.child.FamilyTree;
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.EventUtils;
import com.gmail.nossr50.core.util.Misc;
import com.gmail.nossr50.core.util.Permissions;
import com.gmail.nossr50.core.util.experience.ExperienceBarManager;
import com.gmail.nossr50.core.util.player.NotificationManager;
import com.gmail.nossr50.core.util.scoreboards.ScoreboardManager;
import com.gmail.nossr50.core.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.core.util.skills.PerksUtils;
import com.gmail.nossr50.core.util.skills.RankUtils;
import com.gmail.nossr50.core.util.skills.SkillUtils;
import com.gmail.nossr50.core.util.sounds.SoundManager;
import com.gmail.nossr50.core.util.sounds.SoundType;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class McMMOPlayer {
private final Map<PrimarySkillType, SkillManager> skillManagers = new HashMap<PrimarySkillType, SkillManager>();
private final Map<SuperAbilityType, Boolean> abilityMode = new HashMap<SuperAbilityType, Boolean>();
private final Map<SuperAbilityType, Boolean> abilityInformed = new HashMap<SuperAbilityType, Boolean>();
private final Map<ToolType, Boolean> toolMode = new HashMap<ToolType, Boolean>();
private final Metadata playerMetadata;
private Player player;
private PlayerProfile profile;
private ExperienceBarManager experienceBarManager;
private Party party;
private Party invite;
private Party allianceInvite;
private int itemShareModifier;
private PartyTeleportRecord ptpRecord;
private boolean partyChatMode;
private boolean adminChatMode;
private boolean displaySkillNotifications = true;
private boolean abilityUse = true;
private boolean godMode;
private boolean chatSpy = false; //Off by default
private int recentlyHurt;
private int respawnATS;
private int teleportATS;
private long databaseATS;
//private int chimeraWingLastUse;
private Location teleportCommence;
private boolean isUsingUnarmed;
public McMMOPlayer(Player player, PlayerProfile profile) {
String playerName = player.getName();
UUID uuid = player.getUUID();
this.player = player;
playerMetadata = player.setMetadata(MetadataDefinitions.MCMMO_METADATA_PLAYERDATA_KEY, playerName); //new FixedMetadataValue(mcMMO.p, playerName);
this.profile = profile;
if (profile.getUniqueId() == null) {
profile.setUniqueId(uuid);
}
/*
* I'm using this method because it makes code shorter and safer (we don't have to add all SkillTypes manually),
* but I actually have no idea about the performance impact, if there is any.
* If in the future someone wants to remove this, don't forget to also remove what is in the PrimarySkillType enum. - bm01
*/
try {
for (PrimarySkillType primarySkillType : PrimarySkillType.values()) {
skillManagers.put(primarySkillType, primarySkillType.getManagerClass().getConstructor(McMMOPlayer.class).newInstance(this));
}
} catch (Exception e) {
e.printStackTrace();
McmmoCore.p.disablePlugin(); //Disable Plugin
//mcMMO.p.getPluginLoader().disablePlugin(mcMMO.p);
}
for (SuperAbilityType superAbilityType : SuperAbilityType.values()) {
abilityMode.put(superAbilityType, false);
abilityInformed.put(superAbilityType, true); // This is intended
}
for (ToolType toolType : ToolType.values()) {
toolMode.put(toolType, false);
}
experienceBarManager = new ExperienceBarManager(this);
}
/*public void hideXpBar(PrimarySkillType primarySkillType)
{
experienceBarManager.hideExperienceBar(primarySkillType);
}*/
public void processPostXpEvent(XPGainReason xpGainReason, PrimarySkillType primarySkillType, XPGainSource xpGainSource) {
//Updates from Party sources
if (xpGainSource == XPGainSource.PARTY_MEMBERS && !ExperienceConfig.getInstance().isPartyExperienceBarsEnabled())
return;
//Updates from passive sources (Alchemy, Smelting, etc...)
if (xpGainSource == XPGainSource.PASSIVE && !ExperienceConfig.getInstance().isPassiveGainsExperienceBarsEnabled())
return;
updateXPBar(primarySkillType);
}
public void processUnlockNotifications(PrimarySkillType primarySkillType, int skillLevel) {
RankUtils.executeSkillUnlockNotifications(this, primarySkillType, skillLevel);
}
public void updateXPBar(PrimarySkillType primarySkillType) {
//Skill Unlock Notifications
if (primarySkillType.isChildSkill())
return;
//XP BAR UPDATES
experienceBarManager.updateExperienceBar(primarySkillType);
}
public double getProgressInCurrentSkillLevel(PrimarySkillType primarySkillType) {
double currentXP = profile.getSkillXpLevel(primarySkillType);
double maxXP = profile.getXpToLevel(primarySkillType);
return (currentXP / maxXP);
}
public AcrobaticsManager getAcrobaticsManager() {
return (AcrobaticsManager) skillManagers.get(PrimarySkillType.ACROBATICS);
}
public AlchemyManager getAlchemyManager() {
return (AlchemyManager) skillManagers.get(PrimarySkillType.ALCHEMY);
}
public ArcheryManager getArcheryManager() {
return (ArcheryManager) skillManagers.get(PrimarySkillType.ARCHERY);
}
public AxesManager getAxesManager() {
return (AxesManager) skillManagers.get(PrimarySkillType.AXES);
}
public ExcavationManager getExcavationManager() {
return (ExcavationManager) skillManagers.get(PrimarySkillType.EXCAVATION);
}
public FishingManager getFishingManager() {
return (FishingManager) skillManagers.get(PrimarySkillType.FISHING);
}
public HerbalismManager getHerbalismManager() {
return (HerbalismManager) skillManagers.get(PrimarySkillType.HERBALISM);
}
public MiningManager getMiningManager() {
return (MiningManager) skillManagers.get(PrimarySkillType.MINING);
}
public RepairManager getRepairManager() {
return (RepairManager) skillManagers.get(PrimarySkillType.REPAIR);
}
public SalvageManager getSalvageManager() {
return (SalvageManager) skillManagers.get(PrimarySkillType.SALVAGE);
}
public SmeltingManager getSmeltingManager() {
return (SmeltingManager) skillManagers.get(PrimarySkillType.SMELTING);
}
public SwordsManager getSwordsManager() {
return (SwordsManager) skillManagers.get(PrimarySkillType.SWORDS);
}
public TamingManager getTamingManager() {
return (TamingManager) skillManagers.get(PrimarySkillType.TAMING);
}
public UnarmedManager getUnarmedManager() {
return (UnarmedManager) skillManagers.get(PrimarySkillType.UNARMED);
}
public WoodcuttingManager getWoodcuttingManager() {
return (WoodcuttingManager) skillManagers.get(PrimarySkillType.WOODCUTTING);
}
/*
* Abilities
*/
/**
* Reset the mode of all abilities.
*/
public void resetAbilityMode() {
for (SuperAbilityType ability : SuperAbilityType.values()) {
// Correctly disable and handle any special deactivate code
new AbilityDisableTask(this, ability).run();
}
}
/**
* Get the mode of an ability.
*
* @param ability The ability to check
* @return true if the ability is enabled, false otherwise
*/
public boolean getAbilityMode(SuperAbilityType ability) {
return abilityMode.get(ability);
}
/**
* Set the mode of an ability.
*
* @param ability The ability to check
* @param isActive True if the ability is active, false otherwise
*/
public void setAbilityMode(SuperAbilityType ability, boolean isActive) {
abilityMode.put(ability, isActive);
}
/**
* Get the informed state of an ability
*
* @param ability The ability to check
* @return true if the ability is informed, false otherwise
*/
public boolean getAbilityInformed(SuperAbilityType ability) {
return abilityInformed.get(ability);
}
/**
* Set the informed state of an ability.
*
* @param ability The ability to check
* @param isInformed True if the ability is informed, false otherwise
*/
public void setAbilityInformed(SuperAbilityType ability, boolean isInformed) {
abilityInformed.put(ability, isInformed);
}
/**
* Get the current prep mode of a tool.
*
* @param tool Tool to get the mode for
* @return true if the tool is prepped, false otherwise
*/
public boolean getToolPreparationMode(ToolType tool) {
return toolMode.get(tool);
}
public boolean getAbilityUse() {
return abilityUse;
}
public void toggleAbilityUse() {
abilityUse = !abilityUse;
}
/*
* Tools
*/
/**
* Reset the prep modes of all tools.
*/
public void resetToolPrepMode() {
for (ToolType tool : ToolType.values()) {
setToolPreparationMode(tool, false);
}
}
/**
* Set the current prep mode of a tool.
*
* @param tool Tool to set the mode for
* @param isPrepared true if the tool should be prepped, false otherwise
*/
public void setToolPreparationMode(ToolType tool, boolean isPrepared) {
toolMode.put(tool, isPrepared);
}
/*
* Recently Hurt
*/
public int getRecentlyHurt() {
return recentlyHurt;
}
public void setRecentlyHurt(int value) {
recentlyHurt = value;
}
public void actualizeRecentlyHurt() {
recentlyHurt = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
/*
* Teleportation cooldown & warmup
*/
public int getChimeraWingLastUse() {
return profile.getChimaerWingDATS();
}
public void actualizeChimeraWingLastUse() {
profile.setChimaeraWingDATS((int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR));
}
public Location getTeleportCommenceLocation() {
return teleportCommence;
}
public void setTeleportCommenceLocation(Location location) {
teleportCommence = location;
}
public void actualizeTeleportCommenceLocation(Player player) {
teleportCommence = player.getLocation();
}
/*
* Exploit Prevention
*/
public int getRespawnATS() {
return respawnATS;
}
public void actualizeRespawnATS() {
respawnATS = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
public int getTeleportATS() {
return teleportATS;
}
public void actualizeTeleportATS() {
teleportATS = (int) (System.currentTimeMillis() / Misc.TIME_CONVERSION_FACTOR);
}
public long getDatabaseATS() {
return databaseATS;
}
public void actualizeDatabaseATS() {
databaseATS = System.currentTimeMillis();
}
/*
* God Mode
*/
public boolean getGodMode() {
return godMode;
}
public void toggleGodMode() {
godMode = !godMode;
}
/*
* Party Chat Spy
*/
public boolean isPartyChatSpying() {
return chatSpy;
}
public void togglePartyChatSpying() {
chatSpy = !chatSpy;
}
/*
* Skill notifications
*/
public boolean useChatNotifications() {
return displaySkillNotifications;
}
public void toggleChatNotifications() {
displaySkillNotifications = !displaySkillNotifications;
}
/**
* Gets the power level of this player.
*
* @return the power level of the player
*/
public int getPowerLevel() {
int powerLevel = 0;
for (PrimarySkillType type : PrimarySkillType.NON_CHILD_SKILLS) {
if (type.getPermissions(player)) {
powerLevel += getSkillLevel(type);
}
}
return powerLevel;
}
/**
* Begins an experience gain. The amount will be affected by skill modifiers, global rate, perks, and may be shared with the party
*
* @param skill Skill being used
* @param xp Experience amount to process
*/
public void beginXpGain(PrimarySkillType skill, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) {
Validate.isTrue(xp >= 0.0, "XP gained should be greater than or equal to zero.");
if (xp <= 0.0) {
return;
}
if (skill.isChildSkill()) {
Set<PrimarySkillType> parentSkills = FamilyTree.getParents(skill);
float splitXp = xp / parentSkills.size();
for (PrimarySkillType parentSkill : parentSkills) {
if (parentSkill.getPermissions(player)) {
beginXpGain(parentSkill, splitXp, xpGainReason, xpGainSource);
}
}
return;
}
// Return if the experience has been shared
if (party != null && ShareHandler.handleXpShare(xp, this, skill, ShareHandler.getSharedXpGainReason(xpGainReason))) {
return;
}
beginUnsharedXpGain(skill, xp, xpGainReason, xpGainSource);
}
/**
* Begins an experience gain. The amount will be affected by skill modifiers, global rate and perks
*
* @param skill Skill being used
* @param xp Experience amount to process
*/
public void beginUnsharedXpGain(PrimarySkillType skill, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) {
applyXpGain(skill, modifyXpGain(skill, xp), xpGainReason, xpGainSource);
if (party == null) {
return;
}
if (!MainConfig.getInstance().getPartyXpNearMembersNeeded() || !PartyManager.getNearMembers(this).isEmpty()) {
party.applyXpGain(modifyXpGain(skill, xp));
}
}
/**
* Applies an experience gain
*
* @param primarySkillType Skill being used
* @param xp Experience amount to add
*/
public void applyXpGain(PrimarySkillType primarySkillType, float xp, XPGainReason xpGainReason, XPGainSource xpGainSource) {
if (!primarySkillType.getPermissions(player)) {
return;
}
if (primarySkillType.isChildSkill()) {
Set<PrimarySkillType> parentSkills = FamilyTree.getParents(primarySkillType);
for (PrimarySkillType parentSkill : parentSkills) {
applyXpGain(parentSkill, xp / parentSkills.size(), xpGainReason, xpGainSource);
}
return;
}
if (!EventUtils.handleXpGainEvent(player, primarySkillType, xp, xpGainReason)) {
return;
}
isUsingUnarmed = (primarySkillType == PrimarySkillType.UNARMED);
checkXp(primarySkillType, xpGainReason, xpGainSource);
}
/**
* Check the XP of a skill.
*
* @param primarySkillType The skill to check
*/
private void checkXp(PrimarySkillType primarySkillType, XPGainReason xpGainReason, XPGainSource xpGainSource) {
if (getSkillXpLevelRaw(primarySkillType) < getXpToLevel(primarySkillType)) {
UserManager.getPlayer(player).processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
return;
}
int levelsGained = 0;
float xpRemoved = 0;
while (getSkillXpLevelRaw(primarySkillType) >= getXpToLevel(primarySkillType)) {
if (hasReachedLevelCap(primarySkillType)) {
setSkillXpLevel(primarySkillType, 0);
break;
}
xpRemoved += profile.levelUp(primarySkillType);
levelsGained++;
}
if (!EventUtils.handleLevelChangeEvent(player, primarySkillType, levelsGained, xpRemoved, true, xpGainReason)) {
UserManager.getPlayer(player).processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
return;
}
if (MainConfig.getInstance().getLevelUpSoundsEnabled()) {
SoundManager.sendSound(player, player.getLocation(), SoundType.LEVEL_UP);
}
/*
* Check to see if the player unlocked any new skills
*/
NotificationManager.sendPlayerLevelUpNotification(UserManager.getPlayer(player), primarySkillType, levelsGained, profile.getSkillLevel(primarySkillType));
//UPDATE XP BARS
UserManager.getPlayer(player).processPostXpEvent(xpGainReason, primarySkillType, mcMMO.p, xpGainSource);
}
/*
* Players & Profiles
*/
public Player getPlayer() {
return player;
}
public PlayerProfile getProfile() {
return profile;
}
/*
* Party Stuff
*/
public void setupPartyData() {
party = PartyManager.getPlayerParty(player.getName(), player.getUniqueId());
ptpRecord = new PartyTeleportRecord();
if (inParty()) {
loginParty();
}
}
public Party getPartyInvite() {
return invite;
}
public void setPartyInvite(Party invite) {
this.invite = invite;
}
public boolean hasPartyInvite() {
return (invite != null);
}
public Party getParty() {
return party;
}
public void setParty(Party party) {
this.party = party;
}
public boolean inParty() {
return (party != null);
}
public void removeParty() {
party = null;
}
public void removePartyInvite() {
invite = null;
}
public PartyTeleportRecord getPartyTeleportRecord() {
return ptpRecord;
}
public Party getPartyAllianceInvite() {
return allianceInvite;
}
public void setPartyAllianceInvite(Party allianceInvite) {
this.allianceInvite = allianceInvite;
}
public boolean hasPartyAllianceInvite() {
return (allianceInvite != null);
}
public void removePartyAllianceInvite() {
allianceInvite = null;
}
public void loginParty() {
party.addOnlineMember(this.getPlayer());
}
public int getItemShareModifier() {
if (itemShareModifier < 10) {
setItemShareModifier(10);
}
return itemShareModifier;
}
public void setItemShareModifier(int modifier) {
itemShareModifier = Math.max(10, modifier);
}
/*
* Chat modes
*/
public boolean isChatEnabled(ChatMode mode) {
switch (mode) {
case ADMIN:
return adminChatMode;
case PARTY:
return partyChatMode;
default:
return false;
}
}
public void disableChat(ChatMode mode) {
switch (mode) {
case ADMIN:
adminChatMode = false;
return;
case PARTY:
partyChatMode = false;
return;
default:
return;
}
}
public void enableChat(ChatMode mode) {
switch (mode) {
case ADMIN:
adminChatMode = true;
partyChatMode = false;
return;
case PARTY:
partyChatMode = true;
adminChatMode = false;
return;
default:
return;
}
}
public void toggleChat(ChatMode mode) {
switch (mode) {
case ADMIN:
adminChatMode = !adminChatMode;
partyChatMode = !adminChatMode && partyChatMode;
return;
case PARTY:
partyChatMode = !partyChatMode;
adminChatMode = !partyChatMode && adminChatMode;
return;
default:
return;
}
}
public boolean isUsingUnarmed() {
return isUsingUnarmed;
}
/**
* Modifies an experience gain using skill modifiers, global rate and perks
*
* @param primarySkillType Skill being used
* @param xp Experience amount to process
* @return Modified experience
*/
private float modifyXpGain(PrimarySkillType primarySkillType, float xp) {
if (player.getGameMode() == GameMode.CREATIVE || (primarySkillType.getMaxLevel() <= getSkillLevel(primarySkillType)) || (MainConfig.getInstance().getPowerLevelCap() <= getPowerLevel())) {
return 0;
}
xp = (float) (xp / primarySkillType.getXpModifier() * ExperienceConfig.getInstance().getExperienceGainsGlobalMultiplier());
if (MainConfig.getInstance().getToolModsEnabled()) {
CustomTool tool = mcMMO.getModManager().getTool(player.getInventory().getItemInMainHand());
if (tool != null) {
xp *= tool.getXpMultiplier();
}
}
return PerksUtils.handleXpPerks(player, xp, primarySkillType);
}
public void checkGodMode() {
if (godMode && !Permissions.mcgod(player)
|| godMode && WorldBlacklist.isWorldBlacklisted(player.getWorld())) {
toggleGodMode();
player.sendMessage(LocaleLoader.getString("Commands.GodMode.Forbidden"));
}
}
public void checkParty() {
if (inParty() && !Permissions.party(player)) {
removeParty();
player.sendMessage(LocaleLoader.getString("Party.Forbidden"));
}
}
/**
* Check to see if an ability can be activated.
*
* @param skill The skill the ability is based on
*/
public void checkAbilityActivation(PrimarySkillType skill) {
ToolType tool = skill.getTool();
SuperAbilityType ability = skill.getAbility();
if (getAbilityMode(ability) || !ability.getPermissions(player)) {
return;
}
//TODO: This is hacky and temporary solution until skills are move to the new system
//Potential problems with this include skills with two super abilities (ie mining)
if (!skill.isSuperAbilityUnlocked(getPlayer())) {
int diff = RankUtils.getSuperAbilityUnlockRequirement(skill.getAbility()) - getSkillLevel(skill);
//Inform the player they are not yet skilled enough
NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.AbilityGateRequirementFail", String.valueOf(diff), skill.getName());
return;
}
int timeRemaining = calculateTimeRemaining(ability);
if (timeRemaining > 0) {
/*
* Axes and Woodcutting are odd because they share the same tool.
* We show them the too tired message when they take action.
*/
if (skill == PrimarySkillType.WOODCUTTING || skill == PrimarySkillType.AXES) {
NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining));
//SoundManager.sendSound(player, player.getLocation(), SoundType.TIRED);
}
return;
}
if (EventUtils.callPlayerAbilityActivateEvent(player, skill).isCancelled()) {
return;
}
//These values change depending on whether or not the server is in retro mode
int abilityLengthVar = AdvancedConfig.getInstance().getAbilityLength();
int abilityLengthCap = AdvancedConfig.getInstance().getAbilityLengthCap();
int ticks;
//Ability cap of 0 or below means no cap
if (abilityLengthCap > 0) {
ticks = PerksUtils.handleActivationPerks(player, 2 + (Math.min(abilityLengthCap, getSkillLevel(skill)) / abilityLengthVar), ability.getMaxLength());
} else {
ticks = PerksUtils.handleActivationPerks(player, 2 + (getSkillLevel(skill) / abilityLengthVar), ability.getMaxLength());
}
// Notify people that ability has been activated
ParticleEffectUtils.playAbilityEnabledEffect(player);
if (useChatNotifications()) {
NotificationManager.sendPlayerInformation(player, NotificationType.SUPER_ABILITY, ability.getAbilityOn());
//player.sendMessage(ability.getAbilityOn());
}
SkillUtils.sendSkillMessage(player, NotificationType.SUPER_ABILITY_ALERT_OTHERS, ability.getAbilityPlayer());
//Sounds
SoundManager.worldSendSound(player.getWorld(), player.getLocation(), SoundType.ABILITY_ACTIVATED_GENERIC);
// Enable the ability
profile.setAbilityDATS(ability, System.currentTimeMillis() + (ticks * Misc.TIME_CONVERSION_FACTOR));
setAbilityMode(ability, true);
if (ability == SuperAbilityType.SUPER_BREAKER || ability == SuperAbilityType.GIGA_DRILL_BREAKER) {
SkillUtils.handleAbilitySpeedIncrease(player);
}
setToolPreparationMode(tool, false);
new AbilityDisableTask(this, ability).runTaskLater(mcMMO.p, ticks * Misc.TICK_CONVERSION_FACTOR);
}
public void processAbilityActivation(PrimarySkillType skill) {
if (MainConfig.getInstance().getAbilitiesOnlyActivateWhenSneaking() && !player.isSneaking()) {
return;
}
ItemStack inHand = player.getInventory().getItemInMainHand();
if (mcMMO.getModManager().isCustomTool(inHand) && !mcMMO.getModManager().getTool(inHand).isAbilityEnabled()) {
return;
}
if (!getAbilityUse()) {
return;
}
for (SuperAbilityType superAbilityType : SuperAbilityType.values()) {
if (getAbilityMode(superAbilityType)) {
return;
}
}
SuperAbilityType ability = skill.getAbility();
ToolType tool = skill.getTool();
/*
* Woodcutting & Axes need to be treated differently.
* Basically the tool always needs to ready and we check to see if the cooldown is over when the user takes action
*/
if (tool.inHand(inHand) && !getToolPreparationMode(tool)) {
if (skill != PrimarySkillType.WOODCUTTING && skill != PrimarySkillType.AXES) {
int timeRemaining = calculateTimeRemaining(ability);
if (!getAbilityMode(ability) && timeRemaining > 0) {
NotificationManager.sendPlayerInformation(player, NotificationType.ABILITY_COOLDOWN, "Skills.TooTired", String.valueOf(timeRemaining));
return;
}
}
if (MainConfig.getInstance().getAbilityMessagesEnabled()) {
NotificationManager.sendPlayerInformation(player, NotificationType.TOOL, tool.getRaiseTool());
SoundManager.sendSound(player, player.getLocation(), SoundType.TOOL_READY);
}
setToolPreparationMode(tool, true);
new ToolLowerTask(this, tool).runTaskLaterAsynchronously(mcMMO.p, 4 * Misc.TICK_CONVERSION_FACTOR);
}
}
/**
* Calculate the time remaining until the ability's cooldown expires.
*
* @param ability SuperAbilityType whose cooldown to check
* @return the number of seconds remaining before the cooldown expires
*/
public int calculateTimeRemaining(SuperAbilityType ability) {
long deactivatedTimestamp = profile.getAbilityDATS(ability) * Misc.TIME_CONVERSION_FACTOR;
return (int) (((deactivatedTimestamp + (PerksUtils.handleCooldownPerks(player, ability.getCooldown()) * Misc.TIME_CONVERSION_FACTOR)) - System.currentTimeMillis()) / Misc.TIME_CONVERSION_FACTOR);
}
private boolean hasReachedLevelCap(PrimarySkillType skill) {
return (skill.getMaxLevel() < getSkillLevel(skill) + 1) || (MainConfig.getInstance().getPowerLevelCap() < getPowerLevel() + 1);
}
/*
* These functions are wrapped from PlayerProfile so that we don't always have to store it alongside the McMMOPlayer object.
*/
public int getSkillLevel(PrimarySkillType skill) {
return profile.getSkillLevel(skill);
}
public float getSkillXpLevelRaw(PrimarySkillType skill) {
return profile.getSkillXpLevelRaw(skill);
}
public int getSkillXpLevel(PrimarySkillType skill) {
return profile.getSkillXpLevel(skill);
}
public void setSkillXpLevel(PrimarySkillType skill, float xpLevel) {
profile.setSkillXpLevel(skill, xpLevel);
}
public int getXpToLevel(PrimarySkillType skill) {
return profile.getXpToLevel(skill);
}
public void removeXp(PrimarySkillType skill, int xp) {
profile.removeXp(skill, xp);
}
public void modifySkill(PrimarySkillType skill, int level) {
profile.modifySkill(skill, level);
}
public void addLevels(PrimarySkillType skill, int levels) {
profile.addLevels(skill, levels);
}
public void addXp(PrimarySkillType skill, float xp) {
profile.addXp(skill, xp);
}
public void setAbilityDATS(SuperAbilityType ability, long DATS) {
profile.setAbilityDATS(ability, DATS);
}
public void resetCooldowns() {
profile.resetCooldowns();
}
public FixedMetadataValue getPlayerMetadata() {
return playerMetadata;
}
/**
* This method is called by PlayerQuitEvent to tear down the mcMMOPlayer.
*
* @param syncSave if true, data is saved synchronously
*/
public void logout(boolean syncSave) {
Player thisPlayer = getPlayer();
resetAbilityMode();
BleedTimerTask.bleedOut(thisPlayer);
if (syncSave) {
getProfile().save();
} else {
getProfile().scheduleAsyncSave();
}
UserManager.remove(thisPlayer);
if (MainConfig.getInstance().getScoreboardsEnabled())
ScoreboardManager.teardownPlayer(thisPlayer);
if (inParty()) {
party.removeOnlineMember(thisPlayer);
}
}
}

View File

@@ -1,5 +0,0 @@
package com.gmail.nossr50.core.datatypes.player;
public enum UniqueDataType {
CHIMAERA_WING_DATS
}

View File

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

View File

@@ -1,19 +0,0 @@
package com.gmail.nossr50.core.events.experience;
import com.gmail.nossr50.core.datatypes.experience.XPGainReason;
import com.gmail.nossr50.core.mcmmo.entity.Player;
import com.gmail.nossr50.core.skills.PrimarySkillType;
/**
* Called when a user levels change
*/
public abstract class McMMOPlayerLevelChangeEvent extends McMMOPlayerExperienceEvent {
@Deprecated
public McMMOPlayerLevelChangeEvent(Player player, PrimarySkillType skill) {
super(player, skill, XPGainReason.UNKNOWN);
}
public McMMOPlayerLevelChangeEvent(Player player, PrimarySkillType skill, XPGainReason xpGainReason) {
super(player, skill, xpGainReason);
}
}

View File

@@ -1,8 +0,0 @@
package com.gmail.nossr50.core.events.fake;
public class FakeBrewEvent extends BrewEvent {
public FakeBrewEvent(Block brewer, BrewerInventory contents, int fuelLevel) {
super(brewer, contents, fuelLevel);
}
}

View File

@@ -1,10 +0,0 @@
package com.gmail.nossr50.core.events.fake;
import com.gmail.nossr50.core.mcmmo.entity.Player;
public class FakePlayerFishEvent extends PlayerFishEvent {
public FakePlayerFishEvent(Player player, Entity entity, FishHook hookEntity, State state) {
super(player, entity, hookEntity, state);
}
}

View File

@@ -1,92 +0,0 @@
package com.gmail.nossr50.core.events.scoreboard;
import com.gmail.nossr50.core.mcmmo.entity.Player;
/**
* The parent class of all mcMMO scoreboard events
* All scoreboard events will extend from this
*/
abstract public class McMMOScoreboardEvent extends Event {
/**
* Rest of file is required boilerplate for custom events
**/
private static final HandlerList handlers = new HandlerList();
final Scoreboard currentBoard; //Can be null
private final ScoreboardEventReason scoreboardEventReason;
protected Scoreboard targetBoard; //Scoreboard involved in this event
protected Player targetPlayer;
/** GETTER & SETTER BOILERPLATE **/
public McMMOScoreboardEvent(Scoreboard targetBoard, Scoreboard currentBoard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) {
this.scoreboardEventReason = scoreboardEventReason;
this.targetBoard = targetBoard;
this.currentBoard = currentBoard;
this.targetPlayer = targetPlayer;
}
public static HandlerList getHandlerList() {
return handlers;
}
/**
* This is the scoreboard the player will be assigned to after this event
*
* @return the target board to assign the player after this event fires
*/
public Scoreboard getTargetBoard() {
return targetBoard;
}
/**
* Change the scoreboard that the player will be assigned to after this event fires
*
* @param targetBoard the new board to assign the player to
*/
public void setTargetBoard(Scoreboard targetBoard) {
this.targetBoard = targetBoard;
}
/**
* The player involved in this event (this can be changed)
*
* @return the player involved in this event
*/
public Player getTargetPlayer() {
return targetPlayer;
}
/**
* Change the target player for this event
*
* @param targetPlayer the new target for this event
*/
public void setTargetPlayer(Player targetPlayer) {
this.targetPlayer = targetPlayer;
}
/**
* This is the scoreboard the player is currently assigned to at the time the event was fired
* Grabbed via player.getScoreboard()
*
* @return players current scoreboard
*/
public Scoreboard getCurrentBoard() {
return currentBoard;
}
/**
* The ENUM defining the reason for this event
*
* @return the reason for this event
*/
public ScoreboardEventReason getScoreboardEventReason() {
return scoreboardEventReason;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}

View File

@@ -1,14 +0,0 @@
package com.gmail.nossr50.core.events.scoreboard;
import com.gmail.nossr50.core.mcmmo.entity.Player;
/**
* This event is called when mcMMO creates its custom boards
* You should not interfere with this event unless you understand our board code thoroughly
* mcMMO relies on using new scoreboards to show players individually catered boards with stats specific to them
*/
public class McMMOScoreboardMakeboardEvent extends McMMOScoreboardEvent {
public McMMOScoreboardMakeboardEvent(Scoreboard targetBoard, Scoreboard currentBoard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) {
super(targetBoard, currentBoard, targetPlayer, scoreboardEventReason);
}
}

View File

@@ -1,50 +0,0 @@
package com.gmail.nossr50.core.events.scoreboard;
import com.gmail.nossr50.core.mcmmo.entity.Player;
public class McMMOScoreboardObjectiveEvent extends McMMOScoreboardEvent implements Cancellable {
protected final ScoreboardObjectiveEventReason objectiveEventReason;
protected boolean cancelled;
protected Objective targetObjective;
public McMMOScoreboardObjectiveEvent(Objective targetObjective, ScoreboardObjectiveEventReason objectiveEventReason, Scoreboard scoreboard, Scoreboard oldboard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) {
super(scoreboard, oldboard, targetPlayer, scoreboardEventReason);
this.objectiveEventReason = objectiveEventReason;
this.targetObjective = targetObjective;
cancelled = false;
}
/**
* The objective that will be modified by this event
*
* @return
*/
public Objective getTargetObjective() {
return targetObjective;
}
/**
* Change the target objective for this event
*
* @param newObjective new target objective
*/
public void setTargetObjective(Objective newObjective) {
this.targetObjective = newObjective;
}
public ScoreboardObjectiveEventReason getObjectiveEventReason() {
return objectiveEventReason;
}
/* BOILERPLATE FROM INTERFACES */
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean b) {
cancelled = b;
}
}

View File

@@ -1,13 +0,0 @@
package com.gmail.nossr50.core.events.scoreboard;
import com.gmail.nossr50.core.mcmmo.entity.Player;
/**
* This event is called when mcMMO is attempting to change a players targetBoard back to their previous board
* This is used when an mcMMO board is cleared (removed from the screen), changing back from a temporary board (usually from a delayed scheduled task or our mcscoreboard time command)
*/
public class McMMOScoreboardRevertEvent extends McMMOScoreboardEvent {
public McMMOScoreboardRevertEvent(Scoreboard targetBoard, Scoreboard currentBoard, Player targetPlayer, ScoreboardEventReason scoreboardEventReason) {
super(targetBoard, currentBoard, targetPlayer, scoreboardEventReason);
}
}

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